diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java index 8ff91f1cff32..208ef178f185 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java @@ -1964,8 +1964,13 @@ public class GroovyAnnotator extends GroovyElementVisitor { } private void doCheckDuplicateMethod(@NotNull GrMethod method, @NotNull PsiClass clazz) { - MethodSignature signature = GrClassImplUtil.getDuplicatedMethods(clazz).get(method); - if (signature == null) return; + Set duplicatedSignatures = GrClassImplUtil.getDuplicatedSignatures(clazz); + if (duplicatedSignatures.isEmpty()) return; // optimization + + PsiSubstitutor substitutor = JavaPsiFacade.getElementFactory(method.getProject()).createRawSubstitutor(method); + MethodSignature signature = method.getSignature(substitutor); + if (!duplicatedSignatures.contains(signature)) return; + String signaturePresentation = GroovyPresentationUtil.getSignaturePresentation(signature); GrMethod original = method instanceof GrReflectedMethod ? ((GrReflectedMethod)method).getBaseMethod() : method; myHolder.createErrorAnnotation( diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java index e878aca2e44c..3ac99f81dc3b 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java @@ -619,23 +619,19 @@ public class GrClassImplUtil { } @NotNull - public static Map getDuplicatedMethods(@NotNull PsiClass clazz) { + public static Set getDuplicatedSignatures(@NotNull PsiClass clazz) { return CachedValuesManager.getCachedValue(clazz, () -> { PsiElementFactory factory = JavaPsiFacade.getInstance(clazz.getProject()).getElementFactory(); - MostlySingularMultiMap signatures = MostlySingularMultiMap.newMap(); for (PsiMethod method : clazz.getMethods()) { MethodSignature signature = method.getSignature(factory.createRawSubstitutor(method)); signatures.add(signature, method); } - Map result = ContainerUtil.newHashMap(); + Set result = ContainerUtil.newHashSet(); for (MethodSignature signature : signatures.keySet()) { if (signatures.valuesForKey(signature) > 1) { - signatures.processForKey(signature, m -> { - result.put(m, signature); - return true; - }); + result.add(signature); } }