Don't evaluate reference if it resolves to more than one elements (PY-19856)

This commit is contained in:
Semyon Proshev
2018-02-20 13:56:12 +03:00
parent fbd0af0914
commit ebac009906
2 changed files with 15 additions and 1 deletions
@@ -16,6 +16,7 @@
package com.jetbrains.python.psi.impl;
import com.intellij.psi.PsiElement;
import com.intellij.psi.ResolveResult;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyNames;
@@ -240,7 +241,11 @@ public class PyEvaluator {
if (myNamespace != null) {
return myNamespace.get(expression.getReferencedName());
}
PsiElement result = expression.getReference(PyResolveContext.noImplicits()).resolve();
final ResolveResult[] results = expression.getReference(PyResolveContext.noImplicits()).multiResolve(false);
if (results.length != 1) {
return null;
}
PsiElement result = results[0].getElement();
if (result instanceof PyTargetExpression) {
result = ((PyTargetExpression)result).findAssignedValue();
}
@@ -255,6 +255,15 @@ public class PyEvaluatorTest extends PyTestCase {
assertTrue(byExpression("not False", Boolean.class));
}
public void testMultiResolve() {
final PyExpression expression = parseText("if condition:\n" +
" a = 1\n" +
"else:\n" +
" a = 3\n" +
"expr = a < 2");
assertNull(new PyEvaluator().evaluate(expression));
}
@NotNull
private <T> T byExpression(@NotNull String expression, @NotNull Class<T> cls) {
final Object value = new PyEvaluator().evaluate(parseExpression(expression));