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.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 DartOperatorExpressionImpl extends DartExpressionImpl implements DartReference { public DartOperatorExpressionImpl(ASTNode node) { super(node); } @Override public PsiElement getElement() { return this; } @Override public PsiReference getReference() { return null; } @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() { if (this instanceof DartSuffixExpression) { return DartResolveUtil.findCoreClass(this, "num"); } final DartReference[] references = PsiTreeUtil.getChildrenOfType(this, DartReference.class); if (references == null || references.length == 0) { return DartClassResolveResult.EMPTY; } final DartClassResolveResult leftClassResolveResult = references[0].resolveDartClass(); final DartClass dartClass = leftClassResolveResult.getDartClass(); if (dartClass == null) { return DartClassResolveResult.EMPTY; } // ignore right class. it's a warning. final DartMethodDeclaration operator = dartClass.findOperator(getOperatorSign(), null); return DartResolveUtil.getDartClassResolveResult(operator, leftClassResolveResult.getSpecialization()); } private String getOperatorSign() { if (this instanceof DartLogicOrExpression) { return "||"; } if (this instanceof DartLogicAndExpression) { return "&&"; } if (this instanceof DartCompareExpression) { final DartCompareExpression compareExpression = (DartCompareExpression)this; final DartEqualityOperator equalityOperator = compareExpression.getEqualityOperator(); final DartRelationalOperator relationalOperator = compareExpression.getRelationalOperator(); return DartResolveUtil.getOperatorString(equalityOperator == null ? relationalOperator : equalityOperator); } if (this instanceof DartBitwiseExpression) { return DartResolveUtil.getOperatorString(((DartBitwiseExpression)this).getBitwiseOperator()); } if (this instanceof DartShiftExpression) { return DartResolveUtil.getOperatorString(((DartShiftExpression)this).getShiftOperator()); } if (this instanceof DartAdditiveExpression) { return DartResolveUtil.getOperatorString(((DartAdditiveExpression)this).getAdditiveOperator()); } if (this instanceof DartMultiplicativeExpression) { return DartResolveUtil.getOperatorString(((DartMultiplicativeExpression)this).getMultiplicativeOperator()); } if (this instanceof DartPrefixExpression) { final DartPrefixOperator prefixOperator = ((DartPrefixExpression)this).getPrefixOperator(); return prefixOperator == null ? "" : prefixOperator.getText(); } return ""; } }