From 94eba69a6b2bad9b8881fcfa5be61afec02a76d9 Mon Sep 17 00:00:00 2001 From: Florian Stolte Date: Fri, 24 Nov 2017 17:14:13 +0100 Subject: [PATCH] [eclipse/xtext-eclipse#463] Fix for issue. - Created EditorFragment2 to generate language-specific sub-classes of XtextEditor - Added new fragment to StandardLanguage - Configured the language-specific editor in XbaseGeneratorFragment2 - Added methods to XtextGeneratorNaming for XtextEditor, XbaseEditor and language-specific editors - Added binding for language-specific editors in ImplicitFragment Signed-off-by: Florian Stolte --- .../META-INF/MANIFEST.MF | 1 + .../xtext/generator/ImplicitFragment.xtend | 11 +- .../xtext/generator/StandardLanguage.xtend | 4 + .../generator/XtextGeneratorNaming.xtend | 12 +++ .../generator/ui/editor/EditorFragment2.xtend | 58 ++++++++++ .../xbase/XbaseGeneratorFragment2.xtend | 3 +- .../xtext/generator/ImplicitFragment.java | 16 ++- .../xtext/generator/StandardLanguage.java | 13 +++ .../xtext/generator/XtextGeneratorNaming.java | 16 +++ .../generator/ui/editor/EditorFragment2.java | 102 ++++++++++++++++++ .../xbase/XbaseGeneratorFragment2.java | 7 +- 11 files changed, 233 insertions(+), 10 deletions(-) create mode 100644 org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/editor/EditorFragment2.xtend create mode 100644 org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ui/editor/EditorFragment2.java diff --git a/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF b/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF index edbf37159..3f340ce51 100644 --- a/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF +++ b/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF @@ -51,6 +51,7 @@ Export-Package: org.eclipse.xtext.xtext.generator, org.eclipse.xtext.xtext.generator.types;x-internal:=true, org.eclipse.xtext.xtext.generator.ui.compare;x-internal:=true, org.eclipse.xtext.xtext.generator.ui.contentAssist;x-internal:=true, + org.eclipse.xtext.xtext.generator.ui.editor;x-internal:=true, org.eclipse.xtext.xtext.generator.ui.labeling;x-internal:=true, org.eclipse.xtext.xtext.generator.ui.outline;x-internal:=true, org.eclipse.xtext.xtext.generator.ui.projectWizard;x-internal:=true, diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ImplicitFragment.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ImplicitFragment.xtend index a7ae2ac8d..39b2226b8 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ImplicitFragment.xtend +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ImplicitFragment.xtend @@ -58,10 +58,15 @@ package class ImplicitFragment extends AbstractStubGeneratingFragment { val StringConcatenationClient expression = '''«'org.eclipse.xtext.ui.shared.Access'.typeRef».getJavaProjectsState()''' val bindingFactory = new GuiceModuleAccess.BindingFactory() .addTypeToProviderInstance(IAllContainersState.typeRef, expression) + + if (isGenerateStub) { + bindingFactory.addTypeToType(grammar.eclipsePluginDefaultEditor, grammar.eclipsePluginEditor) + } else if (inheritsXbase(grammar)) { + bindingFactory.addTypeToType(grammar.eclipsePluginDefaultEditor, grammar.eclipsePluginXbaseEditor) + } + if (inheritsXbase(grammar)) { - bindingFactory.addTypeToType('org.eclipse.xtext.ui.editor.XtextEditor'.typeRef, - 'org.eclipse.xtext.xbase.ui.editor.XbaseEditor'.typeRef) - .addTypeToType('org.eclipse.xtext.ui.editor.model.XtextDocumentProvider'.typeRef, + bindingFactory.addTypeToType('org.eclipse.xtext.ui.editor.model.XtextDocumentProvider'.typeRef, 'org.eclipse.xtext.xbase.ui.editor.XbaseDocumentProvider'.typeRef) .addTypeToType('org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler'.typeRef, 'org.eclipse.xtext.xbase.ui.generator.trace.XbaseOpenGeneratedFileHandler'.typeRef) diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/StandardLanguage.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/StandardLanguage.xtend index cfb0de5ff..7295b8559 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/StandardLanguage.xtend +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/StandardLanguage.xtend @@ -38,6 +38,7 @@ import org.eclipse.xtext.xtext.generator.validation.ValidatorFragment2 import org.eclipse.xtext.xtext.generator.web.WebIntegrationFragment import org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2 import org.eclipse.xtext.xtext.generator.xbase.XtypeGeneratorFragment2 +import org.eclipse.xtext.xtext.generator.ui.editor.EditorFragment2 /** * This specialization of the {@link XtextGeneratorLanguage} adds all the standard generator fragments @@ -116,6 +117,8 @@ import org.eclipse.xtext.xtext.generator.xbase.XtypeGeneratorFragment2 SimpleProjectWizardFragment2 newProjectWizardForEclipse = new SimpleProjectWizardFragment2 + EditorFragment2 editor = new EditorFragment2 + new() { try { class.classLoader.loadClass("org.eclipse.xtext.xbase.XbaseRuntimeModule") @@ -171,6 +174,7 @@ import org.eclipse.xtext.xtext.generator.xbase.XtypeGeneratorFragment2 fragments += ideaPlugin fragments += webSupport fragments += newProjectWizardForEclipse + fragments += editor fragments } diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGeneratorNaming.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGeneratorNaming.xtend index 1fa618ba5..c3d98fc8d 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGeneratorNaming.xtend +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGeneratorNaming.xtend @@ -99,6 +99,18 @@ class XtextGeneratorNaming { new TypeReference(grammar.eclipsePluginBasePackage, getSimpleName(grammar) + 'ExecutableExtensionFactory') } + def getEclipsePluginEditor(Grammar grammar) { + new TypeReference(grammar.eclipsePluginBasePackage + '.editor', getSimpleName(grammar) + 'Editor') + } + + def getEclipsePluginXbaseEditor(Grammar grammar) { + new TypeReference('org.eclipse.xtext.xbase.ui.editor.XbaseEditor') + } + + def getEclipsePluginDefaultEditor(Grammar grammar) { + new TypeReference('org.eclipse.xtext.ui.editor.XtextEditor') + } + /** * @return name for the eclipsePlugin Activator or null if eclipsePlugin has no name */ diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/editor/EditorFragment2.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/editor/EditorFragment2.xtend new file mode 100644 index 000000000..c14d30ffe --- /dev/null +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/editor/EditorFragment2.xtend @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2017 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.xtext.generator.ui.editor + +import com.google.inject.Inject +import org.eclipse.xtext.xtext.generator.AbstractStubGeneratingFragment +import org.eclipse.xtext.xtext.generator.XtextGeneratorNaming +import org.eclipse.xtext.xtext.generator.model.FileAccessFactory +import org.eclipse.xtext.xtext.generator.xbase.XbaseUsageDetector + +/** + * @author fstolte - Initial contribution and API + * @since 2.14 + */ +class EditorFragment2 extends AbstractStubGeneratingFragment { + + @Inject FileAccessFactory fileAccessFactory + + @Inject extension XbaseUsageDetector + + @Inject extension XtextGeneratorNaming + + override generate() { + if (isGenerateStub) { + if (projectConfig.eclipsePlugin?.srcGen !== null) { + generateEditor + } + + + if (projectConfig.eclipsePlugin.manifest !== null) { + projectConfig.eclipsePlugin.manifest.exportedPackages += grammar.eclipsePluginEditor.packageName + } + } + } + + + protected def generateEditor() { + val file = fileAccessFactory.createGeneratedJavaFile(grammar.eclipsePluginEditor) + + val superClass = if (grammar.inheritsXbase) grammar.eclipsePluginXbaseEditor else grammar.eclipsePluginDefaultEditor + + file.content = ''' + /** + * This class was generated. Customizations should only happen in a newly + * introduced subclass. + */ + public class «grammar.eclipsePluginEditor.simpleName» extends «superClass» { + } + ''' + file.writeTo(projectConfig.eclipsePlugin.srcGen) + } + +} \ No newline at end of file diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.xtend index 11610dff7..3eacaf043 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.xtend +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.xtend @@ -20,6 +20,7 @@ import org.eclipse.xtext.xtext.generator.model.FileAccessFactory import org.eclipse.xtext.xtext.generator.model.GuiceModuleAccess import org.eclipse.xtext.xtext.generator.model.TypeReference +import static extension org.eclipse.xtext.GrammarUtil.* import static extension org.eclipse.xtext.xtext.generator.model.TypeReference.* import static extension org.eclipse.xtext.xtext.generator.util.GenModelUtil2.* import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment @@ -356,7 +357,7 @@ class XbaseGeneratorFragment2 extends AbstractXtextGeneratorFragment { projectConfig.eclipsePlugin.pluginXml.entries += ''' + adaptableType="«grammar.eclipsePluginEditor.name»"> diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ImplicitFragment.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ImplicitFragment.java index e0f4de5e3..de5b9e996 100644 --- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ImplicitFragment.java +++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ImplicitFragment.java @@ -89,10 +89,18 @@ class ImplicitFragment extends AbstractStubGeneratingFragment { }; final StringConcatenationClient expression = _client; final GuiceModuleAccess.BindingFactory bindingFactory = new GuiceModuleAccess.BindingFactory().addTypeToProviderInstance(TypeReference.typeRef(IAllContainersState.class), expression); - boolean _inheritsXbase = this._xbaseUsageDetector.inheritsXbase(this.getGrammar()); - if (_inheritsXbase) { - bindingFactory.addTypeToType(TypeReference.typeRef("org.eclipse.xtext.ui.editor.XtextEditor"), - TypeReference.typeRef("org.eclipse.xtext.xbase.ui.editor.XbaseEditor")).addTypeToType(TypeReference.typeRef("org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"), + boolean _isGenerateStub = this.isGenerateStub(); + if (_isGenerateStub) { + bindingFactory.addTypeToType(this.naming.getEclipsePluginDefaultEditor(this.getGrammar()), this.naming.getEclipsePluginEditor(this.getGrammar())); + } else { + boolean _inheritsXbase = this._xbaseUsageDetector.inheritsXbase(this.getGrammar()); + if (_inheritsXbase) { + bindingFactory.addTypeToType(this.naming.getEclipsePluginDefaultEditor(this.getGrammar()), this.naming.getEclipsePluginXbaseEditor(this.getGrammar())); + } + } + boolean _inheritsXbase_1 = this._xbaseUsageDetector.inheritsXbase(this.getGrammar()); + if (_inheritsXbase_1) { + bindingFactory.addTypeToType(TypeReference.typeRef("org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"), TypeReference.typeRef("org.eclipse.xtext.xbase.ui.editor.XbaseDocumentProvider")).addTypeToType(TypeReference.typeRef("org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler"), TypeReference.typeRef("org.eclipse.xtext.xbase.ui.generator.trace.XbaseOpenGeneratedFileHandler")); } diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/StandardLanguage.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/StandardLanguage.java index c3ad76cf2..89e482d8f 100644 --- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/StandardLanguage.java +++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/StandardLanguage.java @@ -36,6 +36,7 @@ import org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2; import org.eclipse.xtext.xtext.generator.types.TypesGeneratorFragment2; import org.eclipse.xtext.xtext.generator.ui.compare.CompareFragment2; import org.eclipse.xtext.xtext.generator.ui.contentAssist.ContentAssistFragment2; +import org.eclipse.xtext.xtext.generator.ui.editor.EditorFragment2; import org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2; import org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2; import org.eclipse.xtext.xtext.generator.ui.outline.QuickOutlineFragment2; @@ -126,6 +127,8 @@ public class StandardLanguage extends XtextGeneratorLanguage { private SimpleProjectWizardFragment2 newProjectWizardForEclipse = new SimpleProjectWizardFragment2(); + private EditorFragment2 editor = new EditorFragment2(); + public StandardLanguage() { try { this.getClass().getClassLoader().loadClass("org.eclipse.xtext.xbase.XbaseRuntimeModule"); @@ -209,6 +212,7 @@ public class StandardLanguage extends XtextGeneratorLanguage { this.operator_add(fragments, this.ideaPlugin); this.operator_add(fragments, this.webSupport); this.operator_add(fragments, this.newProjectWizardForEclipse); + this.operator_add(fragments, this.editor); _xblockexpression = fragments; } return _xblockexpression; @@ -465,5 +469,14 @@ public class StandardLanguage extends XtextGeneratorLanguage { this.newProjectWizardForEclipse = newProjectWizardForEclipse; } + @Pure + protected EditorFragment2 getEditor() { + return this.editor; + } + + public void setEditor(final EditorFragment2 editor) { + this.editor = editor; + } + private final static Logger LOG = Logger.getLogger(StandardLanguage.class); } diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/XtextGeneratorNaming.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/XtextGeneratorNaming.java index 1f80a0467..04f14fc8f 100644 --- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/XtextGeneratorNaming.java +++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/XtextGeneratorNaming.java @@ -137,6 +137,22 @@ public class XtextGeneratorNaming { return new TypeReference(_eclipsePluginBasePackage, _plus); } + public TypeReference getEclipsePluginEditor(final Grammar grammar) { + String _eclipsePluginBasePackage = this.getEclipsePluginBasePackage(grammar); + String _plus = (_eclipsePluginBasePackage + ".editor"); + String _simpleName = GrammarUtil.getSimpleName(grammar); + String _plus_1 = (_simpleName + "Editor"); + return new TypeReference(_plus, _plus_1); + } + + public TypeReference getEclipsePluginXbaseEditor(final Grammar grammar) { + return new TypeReference("org.eclipse.xtext.xbase.ui.editor.XbaseEditor"); + } + + public TypeReference getEclipsePluginDefaultEditor(final Grammar grammar) { + return new TypeReference("org.eclipse.xtext.ui.editor.XtextEditor"); + } + /** * @return name for the eclipsePlugin Activator or null if eclipsePlugin has no name */ diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ui/editor/EditorFragment2.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ui/editor/EditorFragment2.java new file mode 100644 index 000000000..5e1838254 --- /dev/null +++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ui/editor/EditorFragment2.java @@ -0,0 +1,102 @@ +/** + * Copyright (c) 2017 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.eclipse.xtext.xtext.generator.ui.editor; + +import com.google.inject.Inject; +import java.util.Set; +import org.eclipse.xtend2.lib.StringConcatenationClient; +import org.eclipse.xtext.xbase.lib.Extension; +import org.eclipse.xtext.xtext.generator.AbstractStubGeneratingFragment; +import org.eclipse.xtext.xtext.generator.XtextGeneratorNaming; +import org.eclipse.xtext.xtext.generator.model.FileAccessFactory; +import org.eclipse.xtext.xtext.generator.model.GeneratedJavaFileAccess; +import org.eclipse.xtext.xtext.generator.model.IXtextGeneratorFileSystemAccess; +import org.eclipse.xtext.xtext.generator.model.ManifestAccess; +import org.eclipse.xtext.xtext.generator.model.TypeReference; +import org.eclipse.xtext.xtext.generator.model.project.IBundleProjectConfig; +import org.eclipse.xtext.xtext.generator.xbase.XbaseUsageDetector; + +/** + * @author fstolte - Initial contribution and API + * @since 2.14 + */ +@SuppressWarnings("all") +public class EditorFragment2 extends AbstractStubGeneratingFragment { + @Inject + private FileAccessFactory fileAccessFactory; + + @Inject + @Extension + private XbaseUsageDetector _xbaseUsageDetector; + + @Inject + @Extension + private XtextGeneratorNaming _xtextGeneratorNaming; + + @Override + public void generate() { + boolean _isGenerateStub = this.isGenerateStub(); + if (_isGenerateStub) { + IBundleProjectConfig _eclipsePlugin = this.getProjectConfig().getEclipsePlugin(); + IXtextGeneratorFileSystemAccess _srcGen = null; + if (_eclipsePlugin!=null) { + _srcGen=_eclipsePlugin.getSrcGen(); + } + boolean _tripleNotEquals = (_srcGen != null); + if (_tripleNotEquals) { + this.generateEditor(); + } + ManifestAccess _manifest = this.getProjectConfig().getEclipsePlugin().getManifest(); + boolean _tripleNotEquals_1 = (_manifest != null); + if (_tripleNotEquals_1) { + Set _exportedPackages = this.getProjectConfig().getEclipsePlugin().getManifest().getExportedPackages(); + String _packageName = this._xtextGeneratorNaming.getEclipsePluginEditor(this.getGrammar()).getPackageName(); + _exportedPackages.add(_packageName); + } + } + } + + protected void generateEditor() { + final GeneratedJavaFileAccess file = this.fileAccessFactory.createGeneratedJavaFile(this._xtextGeneratorNaming.getEclipsePluginEditor(this.getGrammar())); + TypeReference _xifexpression = null; + boolean _inheritsXbase = this._xbaseUsageDetector.inheritsXbase(this.getGrammar()); + if (_inheritsXbase) { + _xifexpression = this._xtextGeneratorNaming.getEclipsePluginXbaseEditor(this.getGrammar()); + } else { + _xifexpression = this._xtextGeneratorNaming.getEclipsePluginDefaultEditor(this.getGrammar()); + } + final TypeReference superClass = _xifexpression; + StringConcatenationClient _client = new StringConcatenationClient() { + @Override + protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) { + _builder.append("/**"); + _builder.newLine(); + _builder.append(" "); + _builder.append("* This class was generated. Customizations should only happen in a newly"); + _builder.newLine(); + _builder.append(" "); + _builder.append("* introduced subclass."); + _builder.newLine(); + _builder.append(" "); + _builder.append("*/"); + _builder.newLine(); + _builder.append("public class "); + String _simpleName = EditorFragment2.this._xtextGeneratorNaming.getEclipsePluginEditor(EditorFragment2.this.getGrammar()).getSimpleName(); + _builder.append(_simpleName); + _builder.append(" extends "); + _builder.append(superClass); + _builder.append(" {"); + _builder.newLineIfNotEmpty(); + _builder.append("}"); + _builder.newLine(); + } + }; + file.setContent(_client); + file.writeTo(this.getProjectConfig().getEclipsePlugin().getSrcGen()); + } +} diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.java index ce2162cc0..512cb4c02 100644 --- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.java +++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/xbase/XbaseGeneratorFragment2.java @@ -755,8 +755,11 @@ public class XbaseGeneratorFragment2 extends AbstractXtextGeneratorFragment { _builder_2.append(":org.eclipse.xtext.builder.smap.StratumBreakpointAdapterFactory\""); _builder_2.newLineIfNotEmpty(); _builder_2.append("\t\t"); - _builder_2.append("adaptableType=\"org.eclipse.xtext.ui.editor.XtextEditor\">"); - _builder_2.newLine(); + _builder_2.append("adaptableType=\""); + String _name = this._xtextGeneratorNaming.getEclipsePluginEditor(this.getGrammar()).getName(); + _builder_2.append(_name, "\t\t"); + _builder_2.append("\">"); + _builder_2.newLineIfNotEmpty(); _builder_2.append("\t\t"); _builder_2.append(""); _builder_2.newLine();