in src/org/intellij/grammar/generator/ParserGenerator.java [1102:1186]
NodeCall generateNodeCall(@NotNull BnfRule rule,
@Nullable BnfExpression node,
@NotNull String nextName,
@Nullable ConsumeType forcedConsumeType) {
IElementType type = node == null ? BNF_REFERENCE_OR_TOKEN : getEffectiveType(node);
String text = node == null ? nextName : node.getText();
if (type == BNF_STRING) {
String value = GrammarUtil.unquote(text);
String attributeName = getTokenName(value);
ConsumeType consumeType = getEffectiveConsumeType(rule, node, forcedConsumeType);
if (attributeName != null) {
return generateConsumeToken(consumeType, attributeName);
}
return generateConsumeTextToken(consumeType, text.startsWith("\"") ? value : StringUtil.escapeStringCharacters(value));
}
else if (type == BNF_NUMBER) {
ConsumeType consumeType = getEffectiveConsumeType(rule, node, forcedConsumeType);
return generateConsumeTextToken(consumeType, text);
}
else if (type == BNF_REFERENCE_OR_TOKEN) {
String value = GrammarUtil.stripQuotesAroundId(text);
BnfRule subRule = myFile.getRule(value);
if (subRule != null) {
if (Rule.isExternal(subRule)) {
return generateExternalCall(rule, GrammarUtil.getExternalRuleExpressions(subRule), nextName);
}
else {
ExpressionHelper.ExpressionInfo info = ExpressionGeneratorHelper.getInfoForExpressionParsing(myExpressionHelper, subRule);
BnfRule rr = info != null ? info.rootRule : subRule;
String method = getFuncName(rr);
String parserClass = ruleInfo(rr).parserClass;
String parserClassName = StringUtil.getShortName(parserClass);
boolean renderClass = !parserClass.equals(myGrammarRootParser) && !parserClass.equals(ruleInfo(rule).parserClass);
if (info == null) {
return new MethodCall(renderClass, parserClassName, method);
}
else {
if (renderClass) {
method = StringUtil.getQualifiedName(parserClassName, method);
}
return new ExpressionMethodCall(method, info.getPriority(subRule) - 1);
}
}
}
// allow token usage by registered token name instead of token text
if (!mySimpleTokens.containsKey(text) && !mySimpleTokens.containsValue(text)) {
mySimpleTokens.put(text, null);
}
ConsumeType consumeType = getEffectiveConsumeType(rule, node, forcedConsumeType);
return generateConsumeToken(consumeType, text);
}
else if (isTokenSequence(rule, node)) {
ConsumeType consumeType = getEffectiveConsumeType(rule, node, forcedConsumeType);
PinMatcher pinMatcher = new PinMatcher(rule, type, nextName);
List<BnfExpression> childExpressions = getChildExpressions(node);
BnfExpression firstElement = ContainerUtil.getFirstItem(childExpressions);
NodeCall nodeCall = generateNodeCall(rule, firstElement, getNextName(nextName, 0), consumeType);
for (PsiElement e : childExpressions) {
String t = e instanceof BnfStringLiteralExpression ? GrammarUtil.unquote(e.getText()) : e.getText();
if (!mySimpleTokens.containsKey(t) && !mySimpleTokens.containsValue(t)) {
mySimpleTokens.put(t, null);
}
}
return generateTokenSequenceCall(childExpressions, 0, pinMatcher, false, new int[]{0}, nodeCall, true, consumeType);
}
else if (type == BNF_EXTERNAL_EXPRESSION) {
List<BnfExpression> expressions = ((BnfExternalExpression)node).getExpressionList();
if (expressions.size() == 1 && Rule.isMeta(rule)) {
return new MetaParameterCall(formatMetaParamName(expressions.get(0).getText()));
}
else {
return generateExternalCall(rule, expressions, nextName);
}
}
else {
List<String> extraArguments = collectMetaParametersFormatted(rule, node);
if (extraArguments.isEmpty()) {
return new MethodCall(false, StringUtil.getShortName(ruleInfo(rule).parserClass), nextName);
}
else {
return new MetaMethodCall(null, nextName, map(extraArguments, MetaParameterArgument::new));
}
}
}