diff --git a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java index edeaaec947aa..c6453735022c 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java +++ b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java @@ -60,6 +60,11 @@ public class PyEvaluator { */ private boolean myEnableResolve = true; + /** + * Store expressions as values if they can't be evaludated + */ + private boolean myAllowExpressionsAsValues = false; + public void setNamespace(@Nullable Map namespace) { myNamespace = namespace; } @@ -68,6 +73,10 @@ public class PyEvaluator { myEvaluateCollectionItems = evaluateCollectionItems; } + public void setAllowExpressionsAsValues(final boolean allowExpressionsAsValues) { + myAllowExpressionsAsValues = allowExpressionsAsValues; + } + public void setEvaluateKeys(boolean evaluateKeys) { myEvaluateKeys = evaluateKeys; } @@ -304,13 +313,34 @@ public class PyEvaluator { } return result; } - } + final PyExpression[] arguments = expression.getArguments(); + //dict(foo="spam") + if (arguments.length > 0) { + final Map result = new HashMap<>(); + for (final PyExpression argument : arguments) { + if (!(argument instanceof PyKeywordArgument)) { + continue; + } + final PyKeywordArgument keywordArgument = (PyKeywordArgument)argument; + final String keyword = keywordArgument.getKeyword(); + if (keyword == null) { + continue; + } + addRecordFromDict(result, keyword, keywordArgument.getValueExpression()); + } + return result; + } + } return null; } private void addRecordFromDict(@NotNull Map result, @NotNull PyExpression key, @Nullable PyExpression value) { - result.put(myEvaluateKeys ? evaluate(key) : key, myEvaluateCollectionItems ? evaluate(value) : value); + result.put(myEvaluateKeys ? evaluate(key) : key, myEvaluateCollectionItems ? evaluateOrGet(value) : value); + } + + private void addRecordFromDict(@NotNull Map result, @NotNull String key, @Nullable PyExpression value) { + result.put(key, myEvaluateCollectionItems ? evaluateOrGet(value) : value); } @NotNull @@ -430,4 +460,13 @@ public class PyEvaluator { return null; } + + @Nullable + private Object evaluateOrGet(@Nullable final PyExpression expression) { + final Object result = evaluate(expression); + if (result !=null) { + return result; + } + return myAllowExpressionsAsValues ? expression : null; + } }