package com.jetbrains.lang.dart.psi.impl; 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.impl.source.tree.LeafPsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.jetbrains.lang.dart.psi.*; import com.jetbrains.lang.dart.util.DartClassResolveResult; import com.jetbrains.lang.dart.util.DartResolveUtil; import org.jetbrains.annotations.NotNull; public class DartClassReferenceImpl extends DartExpressionImpl implements DartReference { public DartClassReferenceImpl(ASTNode node) { super(node); } @Override public PsiElement getElement() { return this; } @Override public PsiReference getReference() { return this; } @Override public TextRange getRangeInElement() { final TextRange textRange = getTextRange(); return new TextRange(0, textRange.getEndOffset() - textRange.getStartOffset()); } @NotNull @Override public String getCanonicalText() { return getText(); } @Override public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException { return this; } @Override public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException { return this; } @Override public boolean isReferenceTo(PsiElement element) { return false; } @Override public boolean isSoft() { return false; } @Override public PsiElement resolve() { return null; } @NotNull @Override public Object[] getVariants() { return ArrayUtil.EMPTY_OBJECT_ARRAY; } @NotNull @Override public DartClassResolveResult resolveDartClass() { final DartReference childReference = PsiTreeUtil.getChildOfType(this, DartReference.class); if (this instanceof DartParenthesizedExpression) { return childReference == null ? DartClassResolveResult.EMPTY : childReference.resolveDartClass(); } if (this instanceof DartArrayAccessExpression) { final DartReference reference = PsiTreeUtil.getChildOfType(this, DartReference.class); if (reference != null) { final DartClassResolveResult resolveResult = reference.resolveDartClass(); final DartClass resolveResultDartClass = resolveResult.getDartClass(); if (resolveResultDartClass == null) { return resolveResult; } return DartResolveUtil.getDartClassResolveResult(resolveResultDartClass.findOperator("[]", null), resolveResult.getSpecialization()); } } if (this instanceof DartAsExpression) { return DartResolveUtil.resolveClassByType(((DartAsExpression)this).getType()); } if (this instanceof DartStringLiteralExpression) { return DartResolveUtil.findCoreClass(this, "String"); } if (this instanceof DartListLiteralExpression) { final DartClassResolveResult classResolveResult = DartResolveUtil.findCoreClass(this, "List"); classResolveResult.specializeByParameters(((DartListLiteralExpression)this).getTypeArguments()); return classResolveResult; } if (this instanceof DartMapLiteralExpression) { final DartClassResolveResult classResolveResult = DartResolveUtil.findCoreClass(this, "Map"); classResolveResult.specializeByParameters(((DartMapLiteralExpression)this).getTypeArguments()); return classResolveResult; } final PsiElement firstChild = getFirstChild(); if (firstChild instanceof LeafPsiElement) { final String literalText = firstChild.getText(); if ("true".equals(literalText) || "false".equals(literalText)) { return DartResolveUtil.findCoreClass(this, "bool"); } else if ("null".equals(literalText)) { return DartClassResolveResult.EMPTY; } else { final boolean isFloat = literalText.indexOf('.') != -1 || literalText.indexOf('E') != -1 || literalText.indexOf('e') != -1; return DartResolveUtil.findCoreClass(this, isFloat ? "double" : "int"); } } return DartClassResolveResult.EMPTY; } }