[groovy] compute the set duplicated signatures instead of method->signature map

This should fix the `GroovyHighlightingTest.testDuplicateMethods()`
This commit is contained in:
Daniil Ovchinnikov
2016-09-12 20:42:34 +03:00
parent 6c8b8364b3
commit 15972b8447
2 changed files with 10 additions and 9 deletions
@@ -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<MethodSignature> 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(
@@ -619,23 +619,19 @@ public class GrClassImplUtil {
}
@NotNull
public static Map<PsiMethod, MethodSignature> getDuplicatedMethods(@NotNull PsiClass clazz) {
public static Set<MethodSignature> getDuplicatedSignatures(@NotNull PsiClass clazz) {
return CachedValuesManager.getCachedValue(clazz, () -> {
PsiElementFactory factory = JavaPsiFacade.getInstance(clazz.getProject()).getElementFactory();
MostlySingularMultiMap<MethodSignature, PsiMethod> signatures = MostlySingularMultiMap.newMap();
for (PsiMethod method : clazz.getMethods()) {
MethodSignature signature = method.getSignature(factory.createRawSubstitutor(method));
signatures.add(signature, method);
}
Map<PsiMethod, MethodSignature> result = ContainerUtil.newHashMap();
Set<MethodSignature> 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);
}
}