IDEA-82046 Groovy .with closure lookups class property instead of local variable

This commit is contained in:
Maxim.Medvedev
2012-03-26 18:11:00 +04:00
parent 4d139b9787
commit ccf014f060
2 changed files with 32 additions and 5 deletions
@@ -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;
}
}
@@ -722,7 +722,7 @@ print map.cla<caret>ss''')
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.cla<caret>ss''')
assertEquals(resolved.containingClass.name, 'B')
}
void testLocalVarVsFieldInWithClosure() {
def ref = configureByText('''\
class Test {
def var
}
int var = 4
new Test().with() {
print v<caret>ar
}
''')
assertFalse ref.resolve() instanceof GrField
assertTrue ref.resolve() instanceof GrVariable
}
}