diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/PropertyResolverProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/PropertyResolverProcessor.java index c756a12a4a77..8f82f8bf9280 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/PropertyResolverProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/PropertyResolverProcessor.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.resolve.processors; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiField; import com.intellij.psi.PsiType; import com.intellij.psi.ResolveState; import org.jetbrains.annotations.NotNull; @@ -36,10 +37,10 @@ public class PropertyResolverProcessor extends ResolverProcessor { @Override public boolean execute(PsiElement element, ResolveState state) { - if (element instanceof GrReferenceExpression && ((GrReferenceExpression)element).getQualifier()!=null) { + if (element instanceof GrReferenceExpression && ((GrReferenceExpression)element).getQualifier() != null) { return true; } - return super.execute(element, state); + return super.execute(element, state) || state.get(RESOLVE_CONTEXT) != null; } @NotNull @@ -50,10 +51,21 @@ public class PropertyResolverProcessor extends ResolverProcessor { final int size = candidates.size(); if (size == 0) return GroovyResolveResult.EMPTY_ARRAY; final GroovyResolveResult last = candidates.get(size - 1); - if (last.isAccessible() && last.isStaticsOK()) return candidates.toArray(new GroovyResolveResult[candidates.size()]); + if (isCorrectLocalVarOrParam(last)) { + return new GroovyResolveResult[]{last}; + } for (GroovyResolveResult candidate : candidates) { - if (candidate.isStaticsOK()) return new GroovyResolveResult[]{candidate}; + if (candidate.isStaticsOK()) { + return new GroovyResolveResult[]{candidate}; + } } return candidates.toArray(new GroovyResolveResult[candidates.size()]); } + + private static boolean isCorrectLocalVarOrParam(GroovyResolveResult last) { + return !(last.getElement() instanceof PsiField) && + last.isAccessible() && + last.isStaticsOK() && + last.getCurrentFileResolveContext() == null; + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy index 98565ef793cc..1691b1b6f0c7 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy @@ -722,7 +722,7 @@ print map.class''') public void testResolveInsideWith0() { def resolved = resolve('a.groovy') - assertInstanceOf( resolved , GrAccessorMethod) + assertInstanceOf(resolved, GrAccessorMethod) assertEquals(resolved.containingClass.name, 'A') } @@ -733,4 +733,19 @@ print map.class''') assertEquals(resolved.containingClass.name, 'B') } + + void testLocalVarVsFieldInWithClosure() { + def ref = configureByText('''\ +class Test { + def var +} + +int var = 4 +new Test().with() { + print var +} +''') + assertFalse ref.resolve() instanceof GrField + assertTrue ref.resolve() instanceof GrVariable + } }