blob: 15e0ea7571b879ee1c84ea49ba0eac44b2253eda [file] [log] [blame]
package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.ResolveResult;
import com.intellij.psi.impl.source.resolve.ResolveCache;
import com.intellij.psi.tree.TokenSet;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes;
import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrConstructorInvocation;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrThisSuperReferenceExpression;
import org.jetbrains.plugins.groovy.lang.psi.dataFlow.types.TypeInferenceHelper;
import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyResolveResultImpl;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
/**
* @author Maxim.Medvedev
*/
public abstract class GrThisSuperReferenceExpressionBase extends GrExpressionImpl implements GrThisSuperReferenceExpression {
private static final OurResolver OUR_RESOLVER = new OurResolver();
public GrThisSuperReferenceExpressionBase(ASTNode node) {
super(node);
}
@Nullable
public GrReferenceExpression getQualifier() {
return (GrReferenceExpression)findChildByType(GroovyElementTypes.REFERENCE_EXPRESSION);
}
@Override
public void setQualifier(@Nullable GrReferenceExpression newQualifier) {
PsiImplUtil.setQualifier(this, newQualifier);
}
@NotNull
@Override
public PsiElement getReferenceNameElement() {
return getLastChild();
}
@Override
public PsiElement getElement() {
return this;
}
@Override
public TextRange getRangeInElement() {
final PsiElement token = findNotNullChildByType(TokenSet.create(GroovyTokenTypes.kTHIS, GroovyTokenTypes.kSUPER));
return TextRange.from(token.getStartOffsetInParent(), token.getTextLength());
}
@Override
public PsiElement resolve() {
final ResolveResult[] results = TypeInferenceHelper.getCurrentContext().multiResolve(this, false, OUR_RESOLVER);
if (results.length == 1) return results[0].getElement();
return null;
}
@Nullable
protected PsiElement resolveInner() {
final PsiElement parent = getParent();
if (parent instanceof GrConstructorInvocation) {
return ((GrConstructorInvocation)parent).resolveMethod();
}
return null;
}
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
return this;
}
public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
return this;
}
public boolean isReferenceTo(PsiElement element) {
return getManager().areElementsEquivalent(element, resolve());
}
@NotNull
public Object[] getVariants() {
return ArrayUtil.EMPTY_OBJECT_ARRAY;
}
public boolean isSoft() {
return false;
}
@Override
public PsiReference getReference() {
return this;
}
@NotNull
public ResolveResult[] multiResolve(boolean incompleteCode) {
final PsiElement parent = getParent();
if (parent instanceof GrConstructorInvocation) {
return ((GrConstructorInvocation)parent).multiResolve(incompleteCode);
}
return ResolveResult.EMPTY_ARRAY;
}
@NotNull
@Override
public String getCanonicalText() {
return getReferenceName();
}
static class OurResolver implements ResolveCache.PolyVariantResolver<GrThisSuperReferenceExpressionBase> {
@NotNull
@Override
public ResolveResult[] resolve(@NotNull GrThisSuperReferenceExpressionBase ref, boolean incompleteCode) {
final PsiElement resolved = ref.resolveInner();
if (resolved == null) return ResolveResult.EMPTY_ARRAY;
return new GroovyResolveResult[]{new GroovyResolveResultImpl(resolved, true)};
}
}
}