List<PsiType[]> (@NotNull PsiMethod method, @NotNull PsiSubstitutor substitutor, String @NotNull [] options) { int argNum = extractArgNum(options); boolean index = extractIndex(options); PsiParameter[] parameters = method.getParameterList().getParameters(); if (argNum >= parameters.length) return ContainerUtil.emptyList(); PsiParameter parameter = parameters[argNum]; PsiType type = parameter.getType(); PsiType substituted = substitutor.substitute(type); if (!InheritanceUtil.isInheritor(substituted, CommonClassNames.JAVA_UTIL_MAP)) return ContainerUtil.emptyList(); PsiType key = PsiUtil.substituteTypeParameter(substituted, CommonClassNames.JAVA_UTIL_MAP, 0, true); PsiType value = PsiUtil.substituteTypeParameter(substituted, CommonClassNames.JAVA_UTIL_MAP, 1, true); PsiClass mapEntry = JavaPsiFacade.getInstance(method.getProject()).findClass(CommonClassNames.JAVA_UTIL_MAP_ENTRY, method.getResolveScope()); if (mapEntry == null) return ContainerUtil.emptyList(); PsiClassType mapEntryType = JavaPsiFacade.getElementFactory(method.getProject()).createType(mapEntry, key, value); PsiType[] keyValueSignature = index ? new PsiType[]{key, value, PsiTypes.intType()} : new PsiType[]{key, value}; PsiType[] mapEntrySignature = index ? new PsiType[]{mapEntryType, PsiTypes.intType()} : new PsiType[]{mapEntryType}; return List.of(keyValueSignature, mapEntrySignature); }