mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
resolve references with '@' to fields
This commit is contained in:
+2
@@ -41,6 +41,8 @@ public interface GrReferenceExpression extends GrExpression, GrReferenceElement,
|
||||
@Nullable
|
||||
PsiElement getDotToken();
|
||||
|
||||
boolean hasAt();
|
||||
|
||||
void replaceDotToken(PsiElement newDotToken);
|
||||
|
||||
//not caching!
|
||||
|
||||
+19
-7
@@ -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();
|
||||
|
||||
+16
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user