From 8563461bc6dded48e2d8a2d9f1df3ba147d363b3 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Wed, 11 Aug 2010 12:12:13 +0400 Subject: [PATCH] IDEA-48499 Incorrect method name resolution --- .../expressions/GrReferenceExpressionImpl.java | 14 ++++++++++++-- .../groovy/lang/resolve/ResolveMethodTest.groovy | 6 ++++++ .../resolve/method/methodVsLocalVariable/A.groovy | 4 ++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 plugins/groovy/testdata/resolve/method/methodVsLocalVariable/A.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java index 1de00521bb23..eb7094ef84a2 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java @@ -154,7 +154,6 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements final PsiType[] argTypes = PsiUtil.getArgumentTypes(this, false, upToArgument); MethodResolverProcessor methodResolver = runMethodResolverProcessor(argTypes, allVariants); assert methodResolver != null; - if (!allVariants && methodResolver.hasApplicableCandidates()) return methodResolver.getCandidates(); final String[] names = GroovyPropertyUtils.suggestGettersName(name); List list = new ArrayList(); @@ -163,6 +162,7 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements resolveImpl(getterResolver); final GroovyResolveResult[] candidates = getterResolver.getCandidates(); //can be only one candidate if (!allVariants && candidates.length == 1 && candidates[0].isStaticsOK()) { + if (methodResolver.hasApplicableCandidates()) return methodResolver.getCandidates(); putUserData(IS_RESOLVED_TO_GETTER, true); return candidates; } @@ -173,7 +173,17 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements PropertyResolverProcessor propertyResolver = new PropertyResolverProcessor(name, this); resolveImpl(propertyResolver); - if (!allVariants && propertyResolver.hasCandidates()) return propertyResolver.getCandidates(); + if (!allVariants) { + final GroovyResolveResult[] propertyCandidates = propertyResolver.getCandidates(); + for (GroovyResolveResult candidate : propertyCandidates) { + if (candidate.isStaticsOK() && candidate.isAccessible() && candidate.getElement() instanceof GrVariable && + !(candidate.getElement() instanceof GrField)) { + return propertyResolver.getCandidates(); + } + } + if (methodResolver.hasApplicableCandidates()) return methodResolver.getCandidates(); + if (propertyCandidates.length > 0) return propertyCandidates; + } if (allVariants) { if (list.isEmpty()) ContainerUtil.addAll(list, propertyResolver.getCandidates()); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy index 0617136a193b..4937336ba7e1 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy @@ -595,4 +595,10 @@ class Zoo { PsiElement resolved = ref.resolve() assertInstanceOf resolved, PsiMethod } + + public void testMethodVsLocalVariable() { + PsiReference ref = configureByFile("methodVsLocalVariable/A.groovy"); + def resolved = ref.resolve() + assertInstanceOf resolved, GrVariable + } } diff --git a/plugins/groovy/testdata/resolve/method/methodVsLocalVariable/A.groovy b/plugins/groovy/testdata/resolve/method/methodVsLocalVariable/A.groovy new file mode 100644 index 000000000000..11794808d86b --- /dev/null +++ b/plugins/groovy/testdata/resolve/method/methodVsLocalVariable/A.groovy @@ -0,0 +1,4 @@ +def foo() {"method"} +def foo = {"local variable"} + +assert foo() == "local variable" \ No newline at end of file