diff --git a/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java b/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java index 08c7aa5d4dd7..3145b8e241b7 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java +++ b/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java @@ -58,7 +58,7 @@ public interface NameDefiner extends PsiElement { for (PyElement elt : it) { if (elt != null) { // qualified refs don't match by last name, and we're not checking FQNs here - if (elt instanceof PyQualifiedExpression && ((PyQualifiedExpression)elt).getQualifier() != null) continue; + if (elt instanceof PyQualifiedExpression && ((PyQualifiedExpression)elt).isQualified()) continue; if (name.equals(elt.getName())) { // plain name matches ret = elt; break; diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyQualifiedExpression.java b/python/psi-api/src/com/jetbrains/python/psi/PyQualifiedExpression.java index 012ed417e23b..48927bbb1d70 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyQualifiedExpression.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyQualifiedExpression.java @@ -30,6 +30,13 @@ public interface PyQualifiedExpression extends PyExpression { @Nullable PyExpression getQualifier(); + /** + * Checks if the expression is qualified. + * + * Unlike {@link #getQualifier()}, it may not require AST access. + */ + boolean isQualified(); + /** * Returns the name to the right of the qualifier. * diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyTargetExpression.java b/python/psi-api/src/com/jetbrains/python/psi/PyTargetExpression.java index fd028d6d8b29..0b67d85d3dc3 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyTargetExpression.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyTargetExpression.java @@ -57,6 +57,4 @@ public interface PyTargetExpression extends PyQualifiedExpression, PsiNamedEleme @Nullable PyClass getContainingClass(); - - boolean isQualified(); } diff --git a/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java b/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java index 8e29ae5d1255..24318f85ad04 100644 --- a/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java +++ b/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java @@ -54,7 +54,7 @@ public class PyClassNameCompletionContributor extends CompletionContributor { if (parameters.isExtendedCompletion()) { final PsiElement element = parameters.getPosition(); final PsiElement parent = element.getParent(); - if (parent instanceof PyReferenceExpression && ((PyReferenceExpression)parent).getQualifier() != null) { + if (parent instanceof PyReferenceExpression && ((PyReferenceExpression)parent).isQualified()) { return; } if (parent instanceof PyStringLiteralExpression) { diff --git a/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java b/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java index d0eb37630afb..32b0c4d4b579 100644 --- a/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java +++ b/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java @@ -181,7 +181,7 @@ public class ScopeImpl implements Scope { @Override public void visitPyTargetExpression(PyTargetExpression node) { final PsiElement parent = node.getParent(); - if (node.getQualifier() == null && !(parent instanceof PyImportElement)) { + if (!node.isQualified() && !(parent instanceof PyImportElement)) { super.visitPyTargetExpression(node); } } diff --git a/python/src/com/jetbrains/python/codeInsight/imports/AutoImportQuickFix.java b/python/src/com/jetbrains/python/codeInsight/imports/AutoImportQuickFix.java index 4b4641324836..47c9ca9f8ee5 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/AutoImportQuickFix.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/AutoImportQuickFix.java @@ -129,7 +129,7 @@ public class AutoImportQuickFix implements LocalQuickFix, HighPriorityAction { if (HintManager.getInstance().hasShownHintsThatWillHideByOtherHint(true)) { return false; } - if ((myNode instanceof PyQualifiedExpression) && ((((PyQualifiedExpression)myNode).getQualifier() != null))) return false; // we cannot be qualified + if ((myNode instanceof PyQualifiedExpression) && ((((PyQualifiedExpression)myNode).isQualified()))) return false; // we cannot be qualified String name = getNameToImport(); if (!name.equals(myInitialName)) { return false; diff --git a/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java b/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java index f90ce61f76b7..58254d999a90 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java @@ -82,7 +82,7 @@ public class ImportFromExistingAction implements QuestionAction { // check if the tree is sane PsiDocumentManager.getInstance(myTarget.getProject()).commitAllDocuments(); if (!myTarget.isValid()) return false; - if ((myTarget instanceof PyQualifiedExpression) && ((((PyQualifiedExpression)myTarget).getQualifier() != null))) return false; // we cannot be qualified + if ((myTarget instanceof PyQualifiedExpression) && ((((PyQualifiedExpression)myTarget).isQualified()))) return false; // we cannot be qualified for (ImportCandidateHolder item : mySources) { if (!item.getImportable().isValid()) return false; if (!item.getFile().isValid()) return false; diff --git a/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java b/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java index 06e4f8962c1e..ae96ac5df383 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java @@ -69,7 +69,7 @@ public class PythonReferenceImporter implements ReferenceImporter { for (PsiElement element : elements) { if (element instanceof PyReferenceExpression && isImportable(element)) { final PyReferenceExpression refExpr = (PyReferenceExpression)element; - if (refExpr.getQualifier() == null) { + if (!refExpr.isQualified()) { final PsiPolyVariantReference reference = refExpr.getReference(); if (reference.resolve() == null) { AutoImportQuickFix fix = proposeImportFix(refExpr, reference); @@ -92,7 +92,7 @@ public class PythonReferenceImporter implements ReferenceImporter { PsiReference element = file.findReferenceAt(offset); if (element instanceof PyReferenceExpression && isImportable((PsiElement)element)) { final PyReferenceExpression refExpr = (PyReferenceExpression)element; - if (refExpr.getQualifier() == null) { + if (!refExpr.isQualified()) { final PsiPolyVariantReference reference = refExpr.getReference(); if (reference.resolve() == null) { AutoImportQuickFix fix = proposeImportFix(refExpr, reference); diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/ImportFromToImportIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/ImportFromToImportIntention.java index 9f1c366ec545..1b4a7c0012a6 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/ImportFromToImportIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/ImportFromToImportIntention.java @@ -211,7 +211,7 @@ public class ImportFromToImportIntention implements IntentionAction { public boolean execute(@NotNull PsiElement element) { if (element instanceof PyReferenceExpression && PsiTreeUtil.getParentOfType(element, PyImportElement.class) == null && element.isValid()) { PyReferenceExpression ref = (PyReferenceExpression)element; - if (ref.getQualifier() == null) { + if (!ref.isQualified()) { ResolveResult[] resolved = ref.getReference().multiResolve(false); for (ResolveResult rr : resolved) { if (rr.isValidResult()) { diff --git a/python/src/com/jetbrains/python/documentation/doctest/PyDocReferenceExpression.java b/python/src/com/jetbrains/python/documentation/doctest/PyDocReferenceExpression.java index 119958301907..62356d2c08fb 100644 --- a/python/src/com/jetbrains/python/documentation/doctest/PyDocReferenceExpression.java +++ b/python/src/com/jetbrains/python/documentation/doctest/PyDocReferenceExpression.java @@ -19,7 +19,6 @@ import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPolyVariantReference; import com.intellij.psi.util.PsiTreeUtil; -import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.PyFromImportStatement; import com.jetbrains.python.psi.PyImportElement; import com.jetbrains.python.psi.impl.PyReferenceExpressionImpl; @@ -40,8 +39,7 @@ public class PyDocReferenceExpression extends PyReferenceExpressionImpl { @NotNull public PsiPolyVariantReference getReference(PyResolveContext context) { - final PyExpression qualifier = getQualifier(); - if (qualifier != null) { + if (isQualified()) { return new PyQualifiedReference(this, context); } final PsiElement importParent = PsiTreeUtil.getParentOfType(this, PyImportElement.class, PyFromImportStatement.class); diff --git a/python/src/com/jetbrains/python/inspections/PyMethodFirstArgAssignmentInspection.java b/python/src/com/jetbrains/python/inspections/PyMethodFirstArgAssignmentInspection.java index bb5dfab94a99..0d29a058fea0 100644 --- a/python/src/com/jetbrains/python/inspections/PyMethodFirstArgAssignmentInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyMethodFirstArgAssignmentInspection.java @@ -57,7 +57,7 @@ public class PyMethodFirstArgAssignmentInspection extends PyInspection { } private void handleTarget(PyQualifiedExpression target, String name) { - if (target.getQualifier() == null && name.equals(target.getText())) { + if (!target.isQualified() && name.equals(target.getText())) { complain(target, name); } } diff --git a/python/src/com/jetbrains/python/inspections/PySetFunctionToLiteralInspection.java b/python/src/com/jetbrains/python/inspections/PySetFunctionToLiteralInspection.java index aaebc16b82f4..f0bdeb399a1b 100644 --- a/python/src/com/jetbrains/python/inspections/PySetFunctionToLiteralInspection.java +++ b/python/src/com/jetbrains/python/inspections/PySetFunctionToLiteralInspection.java @@ -93,7 +93,7 @@ public class PySetFunctionToLiteralInspection extends PyInspection { } private static boolean isInBuiltins(PyExpression callee) { - if (callee instanceof PyQualifiedExpression && (((PyQualifiedExpression)callee).getQualifier() != null)) { + if (callee instanceof PyQualifiedExpression && (((PyQualifiedExpression)callee).isQualified())) { return false; } PsiReference reference = callee.getReference(); diff --git a/python/src/com/jetbrains/python/inspections/PyShadowingBuiltinsInspection.java b/python/src/com/jetbrains/python/inspections/PyShadowingBuiltinsInspection.java index 8f6b5af76492..fa7a1b98e2b1 100644 --- a/python/src/com/jetbrains/python/inspections/PyShadowingBuiltinsInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyShadowingBuiltinsInspection.java @@ -92,7 +92,7 @@ public class PyShadowingBuiltinsInspection extends PyInspection { @Override public void visitPyTargetExpression(@NotNull PyTargetExpression node) { - if (node.getQualifier() == null) { + if (!node.isQualified()) { processElement(node); } } diff --git a/python/src/com/jetbrains/python/inspections/PyShadowingNamesInspection.java b/python/src/com/jetbrains/python/inspections/PyShadowingNamesInspection.java index 82b3cdc87da2..07f92ff3606d 100644 --- a/python/src/com/jetbrains/python/inspections/PyShadowingNamesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyShadowingNamesInspection.java @@ -77,7 +77,7 @@ public class PyShadowingNamesInspection extends PyInspection { @Override public void visitPyTargetExpression(@NotNull PyTargetExpression node) { - if (node.getQualifier() == null) { + if (!node.isQualified()) { processElement(node); } } diff --git a/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java b/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java index b35a6f75377c..5aec8ce7232e 100644 --- a/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java @@ -79,7 +79,7 @@ public class PyStatementEffectInspection extends PyInspection { if (checkStringLiteral(expression)) { return; } - if (expression instanceof PyReferenceExpression && ((PyReferenceExpression)expression).getQualifier() == null) { + if (expression instanceof PyReferenceExpression && !((PyReferenceExpression)expression).isQualified()) { registerProblem(expression, PyBundle.message("INSP.NAME.statement.message")); } else { diff --git a/python/src/com/jetbrains/python/inspections/PyUnboundLocalVariableInspection.java b/python/src/com/jetbrains/python/inspections/PyUnboundLocalVariableInspection.java index 38b0a47826e4..abec5b165fb9 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnboundLocalVariableInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnboundLocalVariableInspection.java @@ -79,7 +79,7 @@ public class PyUnboundLocalVariableInspection extends PyInspection { return; } // Ignore qualifier inspections - if (node.getQualifier() != null) { + if (node.isQualified()) { return; } // Ignore import subelements diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index 7b71bdb7cfde..790e8d8fb3f5 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -458,7 +458,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection { if (PyNames.COMPARISON_OPERATORS.contains(refname)) { return; } - if (refex.getQualifier() != null) { + if (refex.isQualified()) { final PyClassTypeImpl object_type = (PyClassTypeImpl)PyBuiltinCache.getInstance(node).getObjectType(); if ((object_type != null) && object_type.getPossibleInstanceMembers().contains(refname)) return; } diff --git a/python/src/com/jetbrains/python/psi/impl/PropertyBunch.java b/python/src/com/jetbrains/python/psi/impl/PropertyBunch.java index 64f8986b9fa4..59cc28743167 100644 --- a/python/src/com/jetbrains/python/psi/impl/PropertyBunch.java +++ b/python/src/com/jetbrains/python/psi/impl/PropertyBunch.java @@ -74,7 +74,7 @@ public abstract class PropertyBunch { PyExpression callee = call.getCallee(); if (callee instanceof PyReferenceExpression) { PyReferenceExpression ref = (PyReferenceExpression)callee; - if (ref.getQualifier() != null) return null; + if (ref.isQualified()) return null; if (PyNames.PROPERTY.equals(callee.getName())) { PsiFile file = source.getContainingFile(); if (isBuiltinFile(file) || !resolvesLocally(ref)) { diff --git a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java index 1ee93e25aa33..9f767985c282 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java @@ -209,7 +209,7 @@ public class PyAssignmentStatementImpl extends PyElementImpl implements PyAssign final List expressions = PyUtil.flattenedParensAndStars(getTargets()); List result = new ArrayList(); for (PyExpression expression : expressions) { - if (expression instanceof PyQualifiedExpression && ((PyQualifiedExpression)expression).getQualifier() != null) { + if (expression instanceof PyQualifiedExpression && ((PyQualifiedExpression)expression).isQualified()) { continue; } result.add(expression); @@ -223,7 +223,7 @@ public class PyAssignmentStatementImpl extends PyElementImpl implements PyAssign PyExpression[] targets = getTargets(); if (targets.length == 1 && targets[0] instanceof PyTargetExpression) { PyTargetExpression target = (PyTargetExpression)targets[0]; - return target.getQualifier() == null && the_name.equals(target.getName()) ? target : null; + return !target.isQualified() && the_name.equals(target.getName()) ? target : null; } return IterHelper.findName(iterateNames(), the_name); } diff --git a/python/src/com/jetbrains/python/psi/impl/PyBinaryExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyBinaryExpressionImpl.java index 095e322145d8..0948536d4d23 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyBinaryExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyBinaryExpressionImpl.java @@ -23,7 +23,10 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.PyNames; -import com.jetbrains.python.psi.*; +import com.jetbrains.python.psi.PyBinaryExpression; +import com.jetbrains.python.psi.PyElementType; +import com.jetbrains.python.psi.PyElementVisitor; +import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.impl.references.PyOperatorReference; import com.jetbrains.python.psi.resolve.PyResolveContext; import com.jetbrains.python.psi.types.*; @@ -149,6 +152,11 @@ public class PyBinaryExpressionImpl extends PyElementImpl implements PyBinaryExp return getLeftExpression(); } + @Override + public boolean isQualified() { + return getQualifier() != null; + } + @Override public String getReferencedName() { final PyElementType t = getOperator(); diff --git a/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java index 83b2949d26d1..c561eb694182 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java +++ b/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java @@ -93,7 +93,7 @@ public class PyBlockEvaluator { public void visitPyAugAssignmentStatement(PyAugAssignmentStatement node) { PyExpression target = node.getTarget(); String name = target.getName(); - if (target instanceof PyReferenceExpression && ((PyReferenceExpression)target).getQualifier() == null && name != null) { + if (target instanceof PyReferenceExpression && !((PyReferenceExpression)target).isQualified() && name != null) { Object currentValue = myNamespace.get(name); if (currentValue != null) { Object rhs = prepareEvaluator().evaluate(node.getValue()); @@ -121,7 +121,7 @@ public class PyBlockEvaluator { PyExpression qualifier = calleeRef.getQualifier(); if (qualifier instanceof PyReferenceExpression) { PyReferenceExpression qualifierRef = (PyReferenceExpression)qualifier; - if (qualifierRef.getQualifier() == null) { + if (!qualifierRef.isQualified()) { if (PyNames.EXTEND.equals(calleeRef.getReferencedName()) && node.getArguments().length == 1) { processExtendCall(node, qualifierRef.getReferencedName()); } diff --git a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java index db114dfdb4d0..321ffc446a1e 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java +++ b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java @@ -105,7 +105,7 @@ public class PyEvaluator { } protected Object evaluateReferenceExpression(PyReferenceExpression expr) { - if (expr.getQualifier() == null) { + if (!expr.isQualified()) { if (myNamespace != null) { return myNamespace.get(expr.getReferencedName()); } diff --git a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java index e3c589922bec..56172826ee69 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java @@ -614,7 +614,7 @@ public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression { @Nullable private List getStringListFromValue(PyExpression expression) { - if (expression instanceof PyReferenceExpression && ((PyReferenceExpression)expression).getQualifier() == null) { + if (expression instanceof PyReferenceExpression && !((PyReferenceExpression)expression).isQualified()) { return myDunderLike.get(((PyReferenceExpression)expression).getReferencedName()); } return PyUtil.strListValue(expression); diff --git a/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java index d5e1527c0f8b..7a221659b991 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java +++ b/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java @@ -85,7 +85,7 @@ public class PyPathEvaluator extends PyEvaluator { else if (PyNames.CURDIR.equals(expr.getName())) { return "."; } - if (expr.getQualifier() == null && PyNames.FILE.equals(expr.getReferencedName())) { + if (!expr.isQualified() && PyNames.FILE.equals(expr.getReferencedName())) { return myContainingFilePath; } return super.evaluateReferenceExpression(expr); diff --git a/python/src/com/jetbrains/python/psi/impl/PyPrefixExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyPrefixExpressionImpl.java index 946e719ba1f5..bbd4b1115095 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyPrefixExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyPrefixExpressionImpl.java @@ -98,6 +98,11 @@ public class PyPrefixExpressionImpl extends PyElementImpl implements PyPrefixExp return getOperand(); } + @Override + public boolean isQualified() { + return getQualifier() != null; + } + @Override public String getReferencedName() { PyElementType t = getOperator(); diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java index 17e0704711d3..111efa05698f 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java @@ -101,6 +101,11 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere return (PyExpression)(nodes.length == 1 ? nodes[0].getPsi() : null); } + @Override + public boolean isQualified() { + return getQualifier() != null; + } + @Nullable public String getReferencedName() { final ASTNode nameElement = getNameElement(); @@ -191,8 +196,8 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere return null; } try { - final PyExpression qualifier = getQualifier(); - if (qualifier == null) { + final boolean qualified = isQualified(); + if (!qualified) { String name = getReferencedName(); if (PyNames.NONE.equals(name)) { return PyNoneType.INSTANCE; @@ -202,7 +207,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere if (type != null) { return type; } - if (qualifier != null) { + if (qualified) { PyType maybe_type = PyUtil.getSpecialAttributeType(this, context); if (maybe_type != null) return maybe_type; Ref typeOfProperty = getTypeOfProperty(context); diff --git a/python/src/com/jetbrains/python/psi/impl/PySubscriptionExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PySubscriptionExpressionImpl.java index bfa1f6dfe4b9..01feab373a86 100644 --- a/python/src/com/jetbrains/python/psi/impl/PySubscriptionExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PySubscriptionExpressionImpl.java @@ -107,6 +107,11 @@ public class PySubscriptionExpressionImpl extends PyElementImpl implements PySub return getOperand(); } + @Override + public boolean isQualified() { + return getQualifier() != null; + } + @Override public String getReferencedName() { String res = PyNames.GETITEM; diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyFromImportSourceReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyFromImportSourceReference.java index 61ffb43f3c98..8cba7fb624ad 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyFromImportSourceReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyFromImportSourceReference.java @@ -18,7 +18,6 @@ package com.jetbrains.python.psi.impl.references; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; -import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.PyFromImportStatement; import com.jetbrains.python.psi.impl.PyReferenceExpressionImpl; import com.jetbrains.python.psi.resolve.PyResolveContext; @@ -53,7 +52,6 @@ public class PyFromImportSourceReference extends PyImportReference { @Override public HighlightSeverity getUnresolvedHighlightSeverity(TypeEvalContext context) { - PyExpression qualifier = myElement.getQualifier(); - return qualifier == null ? HighlightSeverity.ERROR : HighlightSeverity.WARNING; + return myElement.isQualified() ? HighlightSeverity.WARNING : HighlightSeverity.ERROR; } } diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java index 6a1b11645378..df4fb34c39ce 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java @@ -550,10 +550,10 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference } private boolean haveQualifiers(PsiElement element) { - if (myElement.getQualifier() != null) { + if (myElement.isQualified()) { return true; } - if (element instanceof PyQualifiedExpression && ((PyQualifiedExpression)element).getQualifier() != null) { + if (element instanceof PyQualifiedExpression && ((PyQualifiedExpression)element).isQualified()) { return true; } return false; diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java index f2a0678297e1..aa535e824ae7 100644 --- a/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java @@ -85,7 +85,7 @@ public class PyTargetExpressionElementType extends PyStubElementType 0) { @@ -71,7 +71,7 @@ public class PyBuiltinAnnotator extends PyAnnotator { if (PyNames.UnderscoredAttributes.contains(name) || PyNames.getBuiltinMethods(languageLevel).containsKey(name)) { // things like __len__ if ( - (node.getQualifier() != null) // foo.__len__ + node.isQualified() // foo.__len__ || (PyUtil.getConcealingParent(node) instanceof PyClass) // class Foo: ... __len__ = myLenImpl ) { final ASTNode astNode = node.getNode();