generate initialization of nameMapping with chunked method calls #419

Signed-off-by: Christian Dietrich <christian.dietrich@itemis.de>
This commit is contained in:
Christian Dietrich 2017-08-10 19:01:43 +02:00
parent 6e1c95670e
commit 09b1e98a21
2 changed files with 115 additions and 32 deletions

View file

@ -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);

View file

@ -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<? extends AbstractElement> _allAlternatives = GrammarUtil.getAllAlternatives(this.getGrammar());
Collection<? extends AbstractElement> _allGroups = GrammarUtil.getAllGroups(this.getGrammar());
Iterable<AbstractElement> _plus = Iterables.<AbstractElement>concat(_allAlternatives, _allGroups);
Collection<? extends AbstractElement> _allAssignments = GrammarUtil.getAllAssignments(this.getGrammar());
Iterable<AbstractElement> _plus_1 = Iterables.<AbstractElement>concat(_plus, _allAssignments);
Collection<? extends AbstractElement> _allUnorderedGroups = GrammarUtil.getAllUnorderedGroups(this.getGrammar());
final Iterable<AbstractElement> elements = Iterables.<AbstractElement>filter(Iterables.<AbstractElement>concat(_plus_1, _allUnorderedGroups), AbstractElement.class);
final Iterable<List<AbstractElement>> partitions = Iterables.<AbstractElement>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<? extends AbstractElement> _allAlternatives = GrammarUtil.getAllAlternatives(XtextAntlrGeneratorFragment2.this.getGrammar());
Collection<? extends AbstractElement> _allGroups = GrammarUtil.getAllGroups(XtextAntlrGeneratorFragment2.this.getGrammar());
Iterable<AbstractElement> _plus = Iterables.<AbstractElement>concat(_allAlternatives, _allGroups);
Collection<? extends AbstractElement> _allAssignments = GrammarUtil.getAllAssignments(XtextAntlrGeneratorFragment2.this.getGrammar());
Iterable<AbstractElement> _plus_1 = Iterables.<AbstractElement>concat(_plus, _allAssignments);
Collection<? extends AbstractElement> _allUnorderedGroups = GrammarUtil.getAllUnorderedGroups(XtextAntlrGeneratorFragment2.this.getGrammar());
Iterable<AbstractElement> _filter = Iterables.<AbstractElement>filter(Iterables.<AbstractElement>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<Pair<Integer, List<AbstractElement>>> _indexed = IterableExtensions.<List<AbstractElement>>indexed(partitions);
for(final Pair<Integer, List<AbstractElement>> 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<Pair<Integer, List<AbstractElement>>> _indexed_1 = IterableExtensions.<List<AbstractElement>>indexed(partitions);
for(final Pair<Integer, List<AbstractElement>> 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<AbstractElement> _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();