From e930b6ad7fbfecbcae70de99472be2ebe0881308 Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Thu, 3 Jun 2010 12:02:30 +0400 Subject: [PATCH] resolve references with '@' to fields --- .../expressions/GrReferenceExpression.java | 2 ++ .../GrReferenceExpressionImpl.java | 26 ++++++++++++++----- .../lang/resolve/ResolvePropertyTest.groovy | 16 ++++++++++++ 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/expressions/GrReferenceExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/expressions/GrReferenceExpression.java index 1ccc4cc70460..d10804b2c020 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/expressions/GrReferenceExpression.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/expressions/GrReferenceExpression.java @@ -41,6 +41,8 @@ public interface GrReferenceExpression extends GrExpression, GrReferenceElement, @Nullable PsiElement getDotToken(); + boolean hasAt(); + void replaceDotToken(PsiElement newDotToken); //not caching! 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 bce292db98c4..c5a2157a9f7c 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 @@ -442,13 +442,17 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements EnumSet 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(); 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 40df6e79ffb6..7402d5dcbff0 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 @@ -529,4 +529,20 @@ print foo""") 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().@foo +""") + + def ref = findReference() + def resolved = ref.resolve() + assertInstanceOf(resolved, GrField) + } } \ No newline at end of file