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