From ebac009906a00f4cf8976cafabd8e64fd66e6494 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Fri, 16 Feb 2018 17:40:42 +0300 Subject: [PATCH] Don't evaluate reference if it resolves to more than one elements (PY-19856) --- .../src/com/jetbrains/python/psi/impl/PyEvaluator.java | 7 ++++++- python/testSrc/com/jetbrains/python/PyEvaluatorTest.java | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java index cc71f722a8f5..b6b0e91cd305 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java +++ b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java @@ -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(); } diff --git a/python/testSrc/com/jetbrains/python/PyEvaluatorTest.java b/python/testSrc/com/jetbrains/python/PyEvaluatorTest.java index e96607330252..aee80fdb0e07 100644 --- a/python/testSrc/com/jetbrains/python/PyEvaluatorTest.java +++ b/python/testSrc/com/jetbrains/python/PyEvaluatorTest.java @@ -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 byExpression(@NotNull String expression, @NotNull Class cls) { final Object value = new PyEvaluator().evaluate(parseExpression(expression));