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