in src/org/intellij/grammar/generator/RuleMethodsHelper.java [82:144]
protected void calcMethods(BnfRule rule, Map<String, String> tokensReversed) {
List<MethodInfo> result = new ArrayList<>();
Map<PsiElement, RuleGraphHelper.Cardinality> cardMap = myGraphHelper.getFor(rule);
for (PsiElement element : cardMap.keySet()) {
RuleGraphHelper.Cardinality c = myExpressionHelper.fixCardinality(rule, element, cardMap.get(element));
String pathName = getRuleOrTokenNameForPsi(element, c);
if (pathName == null) continue;
if (element instanceof BnfRule) {
BnfRule resultType = (BnfRule)element;
if (!Rule.isPrivate(rule)) {
result.add(new MethodInfo(MethodType.RULE, pathName, pathName, resultType, c));
}
}
else {
result.add(new MethodInfo(MethodType.TOKEN, pathName, pathName, null, c));
}
}
Collections.sort(result);
BnfAttr attr = findAttribute(rule, KnownAttribute.GENERATE_TOKEN_ACCESSORS);
boolean generateTokens = attr == null ? G.generateTokenAccessors :
Boolean.TRUE.equals(getAttributeValue(attr.getExpression()));
boolean generateTokensSet = attr != null || G.generateTokenAccessorsSet;
Map<String, MethodInfo> basicMethods = new LinkedHashMap<>();
for (MethodInfo methodInfo : result) {
basicMethods.put(methodInfo.name, methodInfo);
if (methodInfo.type == MethodType.TOKEN) {
boolean registered = tokensReversed.containsKey(methodInfo.name);
String pattern = tokensReversed.get(methodInfo.name);
// only regexp and lowercase tokens accessors are generated by default
if (!(generateTokens || !generateTokensSet && registered && (pattern == null || isRegexpToken(pattern)))) {
methodInfo.name = ""; // disable token
}
}
}
KnownAttribute.ListValue methods = getAttribute(rule, KnownAttribute.METHODS);
for (Pair<String, String> pair : methods) {
if (StringUtil.isEmpty(pair.first)) continue;
MethodInfo methodInfo = basicMethods.get(pair.first);
if (methodInfo != null) {
methodInfo.name = ""; // suppress or user method override
}
if (StringUtil.isNotEmpty(pair.second)) {
MethodInfo basicInfo = basicMethods.get(pair.second);
if (basicInfo != null && (basicInfo.name.equals(pair.second) || basicInfo.name.isEmpty())) {
basicInfo.name = pair.first; // simple rename, fix order anyway
result.remove(basicInfo);
result.add(basicInfo);
}
else {
result.add(new MethodInfo(MethodType.USER, pair.first, pair.second, null, null));
}
}
else if (methodInfo == null) {
result.add(new MethodInfo(MethodType.MIXIN, pair.first, null, null, null));
}
}
myMethods.put(rule, Pair.create(basicMethods, result));
}