diff --git a/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java index 0a2aab2ae7bb..d6a8d48fdbd0 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java +++ b/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java @@ -19,6 +19,7 @@ public class PyBlockEvaluator { private final Set myDeclarationsToTrack = new HashSet(); private String myCurrentFilePath; private Object myReturnValue; + private boolean myEvaluateCollectionItems = true; public PyBlockEvaluator() { myVisitedFiles = new HashSet(); @@ -177,6 +178,7 @@ public class PyBlockEvaluator { private PyEvaluator prepareEvaluator() { PyEvaluator evaluator = createEvaluator(); evaluator.setNamespace(myNamespace); + evaluator.setEvaluateCollectionItems(myEvaluateCollectionItems); return evaluator; } @@ -231,4 +233,8 @@ public class PyBlockEvaluator { public Object getReturnValue() { return myReturnValue; } + + public void setEvaluateCollectionItems(boolean evaluateCollectionItems) { + myEvaluateCollectionItems = evaluateCollectionItems; + } } diff --git a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java index 765a2a455ea7..dd55a9be33d6 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java +++ b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java @@ -14,11 +14,16 @@ import java.util.*; public class PyEvaluator { private Set myVisited = new HashSet(); private Map myNamespace; + private boolean myEvaluateCollectionItems = true; public void setNamespace(Map namespace) { myNamespace = namespace; } + public void setEvaluateCollectionItems(boolean evaluateCollectionItems) { + myEvaluateCollectionItems = evaluateCollectionItems; + } + public Object evaluate(PyExpression expr) { if (expr == null || myVisited.contains(expr)) { return null; @@ -34,7 +39,8 @@ public class PyEvaluator { for (PyKeyValueExpression keyValueExpression : ((PyDictLiteralExpression)expr).getElements()) { Object dictKey = evaluate(keyValueExpression.getKey()); if (dictKey != null) { - result.put(dictKey, evaluate(keyValueExpression.getValue())); + PyExpression value = keyValueExpression.getValue(); + result.put(dictKey, myEvaluateCollectionItems ? evaluate(value) : value); } } return result; @@ -42,7 +48,7 @@ public class PyEvaluator { else { List result = new ArrayList(); for (PyExpression element : elements) { - result.add(evaluate(element)); + result.add(myEvaluateCollectionItems ? evaluate(element) : element); } return result; } diff --git a/python/testSrc/com/jetbrains/python/PyBlockEvaluatorTest.java b/python/testSrc/com/jetbrains/python/PyBlockEvaluatorTest.java index d1f391921309..960815bf9ad1 100644 --- a/python/testSrc/com/jetbrains/python/PyBlockEvaluatorTest.java +++ b/python/testSrc/com/jetbrains/python/PyBlockEvaluatorTest.java @@ -4,6 +4,7 @@ import com.intellij.psi.PsiFileFactory; import com.jetbrains.python.fixtures.PyTestCase; import com.jetbrains.python.psi.PyFile; import com.jetbrains.python.psi.PyFunction; +import com.jetbrains.python.psi.PyStringLiteralExpression; import com.jetbrains.python.psi.impl.PyBlockEvaluator; import java.util.ArrayList; @@ -53,6 +54,13 @@ public class PyBlockEvaluatorTest extends PyTestCase { assertEquals("c", map.get("b")); } + public void testDictNoEvaluate() { + PyBlockEvaluator eval = doEvaluate("a={'b': 'c'}", true); + Map map = (Map) eval.getValue("a"); + assertEquals(1, map.size()); + assertTrue(map.get("b") instanceof PyStringLiteralExpression); + } + public void testDictAssign() { PyBlockEvaluator eval = doEvaluate("a={}\na['b']='c'"); Map map = (Map) eval.getValue("a"); @@ -76,7 +84,14 @@ public class PyBlockEvaluatorTest extends PyTestCase { } private PyBlockEvaluator doEvaluate(String text) { + return doEvaluate(text, false); + } + + private PyBlockEvaluator doEvaluate(String text, boolean skipEvaluatingCollectionItems) { PyBlockEvaluator eval = new PyBlockEvaluator(); + if (skipEvaluatingCollectionItems) { + eval.setEvaluateCollectionItems(false); + } PyFile file = (PyFile)PsiFileFactory.getInstance(myFixture.getProject()).createFileFromText("a.py", PythonFileType.INSTANCE, text); eval.evaluate(file); return eval;