resolve references with '@' to fields

This commit is contained in:
Maxim Medvedev
2010-06-03 12:02:30 +04:00
parent 3fa64fe8c2
commit e930b6ad7f
3 changed files with 37 additions and 7 deletions
@@ -41,6 +41,8 @@ public interface GrReferenceExpression extends GrExpression, GrReferenceElement,
@Nullable
PsiElement getDotToken();
boolean hasAt();
void replaceDotToken(PsiElement newDotToken);
//not caching!
@@ -442,13 +442,17 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements
EnumSet<ClassHint.ResolveKind> kinds = refExpr.getParent() instanceof GrReferenceExpression
? EnumSet.of(ClassHint.ResolveKind.CLASS, ClassHint.ResolveKind.PACKAGE)
: EnumSet.of(ClassHint.ResolveKind.CLASS);
ResolverProcessor classProcessor = new ClassResolverProcessor(refExpr.getReferenceName(), refExpr, kinds);
resolveImpl(refExpr, classProcessor);
final GroovyResolveResult[] classCandidates = classProcessor.getCandidates();
for (GroovyResolveResult classCandidate : classCandidates) {
final PsiElement element = classCandidate.getElement();
if (element instanceof PsiClass && ((PsiClass)element).isEnum()) {
return classCandidates;
boolean hasAt = refExpr.hasAt();
GroovyResolveResult[] classCandidates = GroovyResolveResult.EMPTY_ARRAY;
if (!hasAt) {
ResolverProcessor classProcessor = new ClassResolverProcessor(refExpr.getReferenceName(), refExpr, kinds);
resolveImpl(refExpr, classProcessor);
classCandidates = classProcessor.getCandidates();
for (GroovyResolveResult classCandidate : classCandidates) {
final PsiElement element = classCandidate.getElement();
if (element instanceof PsiClass && ((PsiClass)element).isEnum()) {
return classCandidates;
}
}
}
@@ -456,6 +460,10 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements
resolveImpl(refExpr, processor);
final GroovyResolveResult[] fieldCandidates = processor.getCandidates();
if (refExpr.hasAt()) {
return fieldCandidates;
}
//if reference expression is in class we need to return field instead of accessor method
for (GroovyResolveResult candidate : fieldCandidates) {
final PsiElement element = candidate.getElement();
@@ -671,6 +679,10 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements
return getRangeInElement().substring(getElement().getText());
}
public boolean hasAt() {
return findChildByType(GroovyTokenTypes.mAT) != null;
}
public boolean isReferenceTo(PsiElement element) {
if (element instanceof PsiMethod && GroovyPropertyUtils.isSimplePropertyAccessor((PsiMethod) element)) {
final PsiElement target = resolve();
@@ -529,4 +529,20 @@ print fo<caret>o""")
def resolved = ref.resolve()
assertInstanceOf(resolved, GrAccessorMethod)
}
public void testFieldAccessOutsideClass() {
myFixture.configureByText("A.groovy", """
class X {
public def foo = 3
def getFoo() {2}
def setFoo(def foo) {}
}
print new X().@f<caret>oo
""")
def ref = findReference()
def resolved = ref.resolve()
assertInstanceOf(resolved, GrField)
}
}