private static void addTypeToImports()

in src/org/intellij/grammar/generator/NameShortener.java [100:137]


  private static void addTypeToImports(@Nullable String s, @NotNull Consumer<String> result, int forcedOffset) {
    if (s == null) return;
    boolean quoted = false;
    int offset = 0, parenCount = 0;
    Deque<int[]> prefixStack = null;
    int[] prefix;
    for (String part : StringUtil.tokenize(new StringTokenizer(StringUtil.trimEnd(s, "..."), TYPE_TEXT_SEPARATORS, true))) {
      if (TYPE_TEXT_SEPARATORS.contains(part) ||
          "?".equals(part) || "extends".equals(part) || "super".equals(part)) {
        if ("\"".equals(part) && offset > 0 && s.indexOf(offset - 1) != '\\') quoted = !quoted;
        if (!quoted && "(".equals(part)) parenCount ++;
        if (!quoted && ")".equals(part)) parenCount --;
      }
      else if (!quoted && part.endsWith(".")) {
        if (prefixStack == null) prefixStack = new ArrayDeque<>();
        int idx = s.indexOf('@', offset);
        if (idx != -1 && part.equals(s.substring(offset, idx).trim())) {
          prefixStack.push(new int[] { parenCount, offset, offset + part.length(), idx });
        }
      }
      else if (!quoted && prefixStack != null && !prefixStack.isEmpty() && parenCount == (prefix = prefixStack.peek())[0] &&
               s.substring(prefix[3] + 1, offset).trim().length() > 0) {
        prefixStack.pop();
        if (forcedOffset == -1 || prefix[1] == forcedOffset) {
          int idx = part.indexOf('.');
          result.accept(s.substring(prefix[1], prefix[2]) + (idx == -1 ? part : part.substring(0, idx)));
          if (prefix[1] == forcedOffset) return;
        }
      }
      else if (!quoted && part.contains(".")) {
        if (forcedOffset == -1 || offset == forcedOffset) {
          result.accept(part);
          if (offset == forcedOffset) return;
        }
      }
      offset += part.length();
    }
  }