diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/IdeaPluginGenerator.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/IdeaPluginGenerator.xtend index 5c0949ff4..1adddbfcb 100644 --- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/IdeaPluginGenerator.xtend +++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/idea/IdeaPluginGenerator.xtend @@ -677,7 +677,7 @@ class IdeaPluginGenerator extends AbstractStubGeneratingFragment { «IF rule.named» return new «'org.eclipse.xtext.psi.impl.PsiNamedEObjectImpl'.typeRef»(node) {}; «ELSE» - return new «'org.eclipse.xtext.psi.impl.PsiEObjectImpl'»(node) {}; + return new «'org.eclipse.xtext.psi.impl.PsiEObjectImpl'.typeRef»(node) {}; «ENDIF» } «FOR element : rule.EObjectElements» @@ -685,7 +685,7 @@ class IdeaPluginGenerator extends AbstractStubGeneratingFragment { «IF element.named» return new «'org.eclipse.xtext.psi.impl.PsiNamedEObjectImpl'.typeRef»(node) {}; «ELSE» - return new «'org.eclipse.xtext.psi.impl.PsiEObjectImpl'»(node) {}; + return new «'org.eclipse.xtext.psi.impl.PsiEObjectImpl'.typeRef»(node) {}; «ENDIF» } «ENDFOR» diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/AbstractAntlrGrammarGenerator.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/AbstractAntlrGrammarGenerator.xtend index 8d55a4187..084adc0cc 100644 --- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/AbstractAntlrGrammarGenerator.xtend +++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/AbstractAntlrGrammarGenerator.xtend @@ -94,6 +94,8 @@ abstract class AbstractAntlrGrammarGenerator { «compileTokens(options)» «compileLexerHeader(options)» «compileKeywordRules(options)» + + // Rules duplicated to allow inter-rule references «compileTerminalRules(options)» ''' @@ -196,22 +198,28 @@ abstract class AbstractAntlrGrammarGenerator { val allKeywords = allKeywords.sort.sortBy[-length] val allTerminalRules = allTerminalRules + val synthetic_kw_alternatives = newArrayList + synthetic_kw_alternatives.addAll(allKeywords.indexed.map[ + val ruleName = keywordHelper.getRuleName(value) + return '''(FRAGMENT_«ruleName»)=> FRAGMENT_«ruleName» {$type = «ruleName»; }''' + ]) + synthetic_kw_alternatives.addAll(allTerminalRules.indexed.map[ + if (!isSyntheticTerminalRule(value) && !value.fragment) { + return '''(FRAGMENT_«value.ruleName»)=> FRAGMENT_«value.ruleName» {$type = «value.ruleName»; }''' + } + ].filterNull.toList) + ''' «IF options.isBacktrackLexer» SYNTHETIC_ALL_KEYWORDS : - «FOR kw: allKeywords.indexed» - (FRAGMENT_«keywordHelper.getRuleName(kw.value)»)=> FRAGMENT_«keywordHelper.getRuleName(kw.value)» {$type = «keywordHelper.getRuleName(kw.value)»; } - «IF kw.key != allKeywords.size || !allTerminalRules().isEmpty»|«ENDIF» - «ENDFOR» - «FOR rule : allTerminalRules.indexed» - «IF !isSyntheticTerminalRule(rule.value) && !rule.value.fragment» - (FRAGMENT_«rule.value.ruleName()»)=> FRAGMENT_«rule.value.ruleName()» {$type = «rule.value.ruleName()»; } - «IF rule.key != allTerminalRules.size»|«ENDIF» - «ENDIF» - «ENDFOR» + «FOR kw: synthetic_kw_alternatives SEPARATOR ' |'» + «kw» + «ENDFOR» ; + «FOR kw: allKeywords» fragment FRAGMENT_«keywordHelper.getRuleName(kw)» : '«kw.toAntlrString()»'; + «ENDFOR» «ELSE» «FOR rule:allKeywords» diff --git a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/GenerateAllTestLanguages2.mwe2 b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/GenerateAllTestLanguages2.mwe2 index 1eb273c40..888fbba58 100644 --- a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/GenerateAllTestLanguages2.mwe2 +++ b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/GenerateAllTestLanguages2.mwe2 @@ -97,14 +97,13 @@ Workflow { // name = "org.eclipse.xtext.XtextGrammarTestLanguage" // } // language = TestLanguage { -// parserGenerator = { -// options = { -// backtrack = true -// backtrackLexer = true -// memoize = true -// } -// } // name = "org.eclipse.xtext.lexer.BacktrackingLexerTestLanguage" +// parserOptions = { +// backtrack = true +// backtrackLexer = true +// memoize = true +// classSplitting = true +// } // } // // language = TestLanguage { diff --git a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/TestLanguage.xtend b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/TestLanguage.xtend index 7b4a51c14..d98629d56 100644 --- a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/TestLanguage.xtend +++ b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/TestLanguage.xtend @@ -26,19 +26,29 @@ import org.eclipse.xtext.generator.parser.antlr.AntlrOptions @Accessors class TestLanguage extends XtextGeneratorLanguage { + org.eclipse.xtext.xtext.generator.parser.antlr.AntlrOptions parserOptions = new org.eclipse.xtext.xtext.generator.parser.antlr.AntlrOptions() => [ + classSplitting = true + ] + + def void setParserOptions(org.eclipse.xtext.xtext.generator.parser.antlr.AntlrOptions parserOptions) { + this.parserOptions = parserOptions + parserGenerator.options = parserOptions + ideaParser.options = parserOptions + } + GrammarAccessFragment2 grammarAccess = new GrammarAccessFragment2 SerializerFragment2 serializer = new SerializerFragment2 => [ - generateStub = true + generateStub = false ] ResourceFactoryFragment2 resourceFactoryFragment = new ResourceFactoryFragment2 EMFGeneratorFragment2 emfGenerator = new EMFGeneratorFragment2 XtextAntlrGeneratorFragment2 parserGenerator = new XtextAntlrGeneratorFragment2 => [ debugGrammar = true - options => [ - classSplitting = true - ] + options = parserOptions + ] + XtextAntlrIDEAGeneratorFragment ideaParser = new XtextAntlrIDEAGeneratorFragment => [ + options = parserOptions ] - XtextAntlrIDEAGeneratorFragment ideaParser = new XtextAntlrIDEAGeneratorFragment IdeaPluginGenerator ideaPlugin = new IdeaPluginGenerator