protected void calcMethods()

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