From 09b1e98a21ff894fafdb8a0f83286435cae09af7 Mon Sep 17 00:00:00 2001 From: Christian Dietrich Date: Thu, 10 Aug 2017 19:01:43 +0200 Subject: [PATCH] generate initialization of nameMapping with chunked method calls #419 Signed-off-by: Christian Dietrich --- .../antlr/XtextAntlrGeneratorFragment2.xtend | 26 +++- .../antlr/XtextAntlrGeneratorFragment2.java | 121 ++++++++++++++---- 2 files changed, 115 insertions(+), 32 deletions(-) diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/XtextAntlrGeneratorFragment2.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/XtextAntlrGeneratorFragment2.xtend index f5820d0ce..3574fc3a7 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/XtextAntlrGeneratorFragment2.xtend +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/XtextAntlrGeneratorFragment2.xtend @@ -50,6 +50,7 @@ import org.eclipse.xtext.xtext.generator.util.SyntheticTerminalDetector 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.parser.antlr.AntlrGrammarGenUtil.* +import com.google.common.collect.Iterables class XtextAntlrGeneratorFragment2 extends AbstractAntlrGeneratorFragment2 { @@ -301,6 +302,8 @@ class XtextAntlrGeneratorFragment2 extends AbstractAntlrGeneratorFragment2 { def JavaFileAccess generateContentAssistParser() { val extension naming = contentAssistNaming val file = fileFactory.createGeneratedJavaFile(grammar.parserClass) + val elements = (grammar.allAlternatives + grammar.allGroups + grammar.allAssignments + grammar.allUnorderedGroups).filter(AbstractElement) + val partitions = Iterables.partition(elements, 1500) file.content = ''' public class «grammar.parserClass.simpleName» extends «grammar.getParserSuperClass(partialParsing)» { @@ -328,11 +331,26 @@ class XtextAntlrGeneratorFragment2 extends AbstractAntlrGeneratorFragment2 { if (nameMappings == null) { nameMappings = new «HashMap»<«AbstractElement», String>() { private static final long serialVersionUID = 1L; - { - «FOR element : (grammar.allAlternatives + grammar.allGroups + grammar.allAssignments + grammar.allUnorderedGroups).filter(AbstractElement)» - put(grammarAccess.«element.grammarElementAccess», "«element.containingRule.contentAssistRuleName»__«element.gaElementIdentifier»«IF element instanceof Group»__0«ENDIF»"); + «IF partitions.size > 1» + { + «FOR partition : partitions.indexed» + fillMap«partition.key»(); + «ENDFOR» + } + «FOR partition : partitions.indexed» + private void fillMap«partition.key»() { + «FOR element : partition.value» + put(grammarAccess.«element.grammarElementAccess», "«element.containingRule.contentAssistRuleName»__«element.gaElementIdentifier»«IF element instanceof Group»__0«ENDIF»"); + «ENDFOR» + } «ENDFOR» - } + «ELSE» + { + «FOR element : elements» + put(grammarAccess.«element.grammarElementAccess», "«element.containingRule.contentAssistRuleName»__«element.gaElementIdentifier»«IF element instanceof Group»__0«ENDIF»"); + «ENDFOR» + } + «ENDIF» }; } return nameMappings.get(element); diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/parser/antlr/XtextAntlrGeneratorFragment2.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/parser/antlr/XtextAntlrGeneratorFragment2.java index 3958209a5..3b3728146 100644 --- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/parser/antlr/XtextAntlrGeneratorFragment2.java +++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/parser/antlr/XtextAntlrGeneratorFragment2.java @@ -58,6 +58,7 @@ import org.eclipse.xtext.xbase.lib.Functions.Function1; import org.eclipse.xtext.xbase.lib.IterableExtensions; import org.eclipse.xtext.xbase.lib.ListExtensions; import org.eclipse.xtext.xbase.lib.ObjectExtensions; +import org.eclipse.xtext.xbase.lib.Pair; import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; import org.eclipse.xtext.xtext.generator.Issues; import org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessExtensions; @@ -658,6 +659,14 @@ public class XtextAntlrGeneratorFragment2 extends AbstractAntlrGeneratorFragment @Extension final ContentAssistGrammarNaming naming = this.contentAssistNaming; final GeneratedJavaFileAccess file = this.fileFactory.createGeneratedJavaFile(naming.getParserClass(this.getGrammar())); + Collection _allAlternatives = GrammarUtil.getAllAlternatives(this.getGrammar()); + Collection _allGroups = GrammarUtil.getAllGroups(this.getGrammar()); + Iterable _plus = Iterables.concat(_allAlternatives, _allGroups); + Collection _allAssignments = GrammarUtil.getAllAssignments(this.getGrammar()); + Iterable _plus_1 = Iterables.concat(_plus, _allAssignments); + Collection _allUnorderedGroups = GrammarUtil.getAllUnorderedGroups(this.getGrammar()); + final Iterable elements = Iterables.filter(Iterables.concat(_plus_1, _allUnorderedGroups), AbstractElement.class); + final Iterable> partitions = Iterables.partition(elements, 1500); StringConcatenationClient _client = new StringConcatenationClient() { @Override protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) { @@ -767,40 +776,96 @@ public class XtextAntlrGeneratorFragment2 extends AbstractAntlrGeneratorFragment _builder.append("\t\t\t\t"); _builder.append("private static final long serialVersionUID = 1L;"); _builder.newLine(); - _builder.append("\t\t\t\t"); - _builder.append("{"); - _builder.newLine(); { - Collection _allAlternatives = GrammarUtil.getAllAlternatives(XtextAntlrGeneratorFragment2.this.getGrammar()); - Collection _allGroups = GrammarUtil.getAllGroups(XtextAntlrGeneratorFragment2.this.getGrammar()); - Iterable _plus = Iterables.concat(_allAlternatives, _allGroups); - Collection _allAssignments = GrammarUtil.getAllAssignments(XtextAntlrGeneratorFragment2.this.getGrammar()); - Iterable _plus_1 = Iterables.concat(_plus, _allAssignments); - Collection _allUnorderedGroups = GrammarUtil.getAllUnorderedGroups(XtextAntlrGeneratorFragment2.this.getGrammar()); - Iterable _filter = Iterables.filter(Iterables.concat(_plus_1, _allUnorderedGroups), AbstractElement.class); - for(final AbstractElement element : _filter) { - _builder.append("\t\t\t\t\t"); - _builder.append("put(grammarAccess."); - String _grammarElementAccess = XtextAntlrGeneratorFragment2.this.grammarUtil.grammarElementAccess(element); - _builder.append(_grammarElementAccess, "\t\t\t\t\t"); - _builder.append(", \""); - String _contentAssistRuleName = AntlrGrammarGenUtil.getContentAssistRuleName(GrammarUtil.containingRule(element)); - _builder.append(_contentAssistRuleName, "\t\t\t\t\t"); - _builder.append("__"); - String _gaElementIdentifier = XtextAntlrGeneratorFragment2.this.grammarUtil.gaElementIdentifier(element); - _builder.append(_gaElementIdentifier, "\t\t\t\t\t"); + int _size = IterableExtensions.size(partitions); + boolean _greaterThan = (_size > 1); + if (_greaterThan) { + _builder.append("\t\t\t\t"); + _builder.append("{"); + _builder.newLine(); { - if ((element instanceof Group)) { - _builder.append("__0"); + Iterable>> _indexed = IterableExtensions.>indexed(partitions); + for(final Pair> partition : _indexed) { + _builder.append("\t\t\t\t"); + _builder.append("\t"); + _builder.append("fillMap"); + Integer _key = partition.getKey(); + _builder.append(_key, "\t\t\t\t\t"); + _builder.append("();"); + _builder.newLineIfNotEmpty(); } } - _builder.append("\");"); - _builder.newLineIfNotEmpty(); + _builder.append("\t\t\t\t"); + _builder.append("}"); + _builder.newLine(); + { + Iterable>> _indexed_1 = IterableExtensions.>indexed(partitions); + for(final Pair> partition_1 : _indexed_1) { + _builder.append("\t\t\t\t"); + _builder.append("private void fillMap"); + Integer _key_1 = partition_1.getKey(); + _builder.append(_key_1, "\t\t\t\t"); + _builder.append("() {"); + _builder.newLineIfNotEmpty(); + { + List _value = partition_1.getValue(); + for(final AbstractElement element : _value) { + _builder.append("\t\t\t\t"); + _builder.append("\t"); + _builder.append("put(grammarAccess."); + String _grammarElementAccess = XtextAntlrGeneratorFragment2.this.grammarUtil.grammarElementAccess(element); + _builder.append(_grammarElementAccess, "\t\t\t\t\t"); + _builder.append(", \""); + String _contentAssistRuleName = AntlrGrammarGenUtil.getContentAssistRuleName(GrammarUtil.containingRule(element)); + _builder.append(_contentAssistRuleName, "\t\t\t\t\t"); + _builder.append("__"); + String _gaElementIdentifier = XtextAntlrGeneratorFragment2.this.grammarUtil.gaElementIdentifier(element); + _builder.append(_gaElementIdentifier, "\t\t\t\t\t"); + { + if ((element instanceof Group)) { + _builder.append("__0"); + } + } + _builder.append("\");"); + _builder.newLineIfNotEmpty(); + } + } + _builder.append("\t\t\t\t"); + _builder.append("}"); + _builder.newLine(); + } + } + } else { + _builder.append("\t\t\t\t"); + _builder.append("{"); + _builder.newLine(); + { + for(final AbstractElement element_1 : elements) { + _builder.append("\t\t\t\t"); + _builder.append("\t"); + _builder.append("put(grammarAccess."); + String _grammarElementAccess_1 = XtextAntlrGeneratorFragment2.this.grammarUtil.grammarElementAccess(element_1); + _builder.append(_grammarElementAccess_1, "\t\t\t\t\t"); + _builder.append(", \""); + String _contentAssistRuleName_1 = AntlrGrammarGenUtil.getContentAssistRuleName(GrammarUtil.containingRule(element_1)); + _builder.append(_contentAssistRuleName_1, "\t\t\t\t\t"); + _builder.append("__"); + String _gaElementIdentifier_1 = XtextAntlrGeneratorFragment2.this.grammarUtil.gaElementIdentifier(element_1); + _builder.append(_gaElementIdentifier_1, "\t\t\t\t\t"); + { + if ((element_1 instanceof Group)) { + _builder.append("__0"); + } + } + _builder.append("\");"); + _builder.newLineIfNotEmpty(); + } + } + _builder.append("\t\t\t\t"); + _builder.append("}"); + _builder.newLine(); } } - _builder.append("\t\t\t\t"); - _builder.append("}"); - _builder.newLine(); _builder.append("\t\t\t"); _builder.append("};"); _builder.newLine();