From 73b28eacc7cfcd0ee2aac8d185ccbcee60e274e6 Mon Sep 17 00:00:00 2001 From: Valentina Kiryushkina Date: Fri, 12 May 2017 18:43:52 +0300 Subject: [PATCH] Fix resolving dict: 1) Remove dict call resolving part from getElementFromDictLiteral 2) Get rid of useless getElementFromCallExpression --- .../PySubstitutionChunkReference.java | 94 ++++++++----------- 1 file changed, 38 insertions(+), 56 deletions(-) diff --git a/python/src/com/jetbrains/python/codeInsight/PySubstitutionChunkReference.java b/python/src/com/jetbrains/python/codeInsight/PySubstitutionChunkReference.java index e15915c4d6d8..ad0d7033e544 100644 --- a/python/src/com/jetbrains/python/codeInsight/PySubstitutionChunkReference.java +++ b/python/src/com/jetbrains/python/codeInsight/PySubstitutionChunkReference.java @@ -179,7 +179,7 @@ public class PySubstitutionChunkReference extends PsiReferenceBase resolvedRef = getElementFromDictLiteral(valueExpr, indexElement); + Ref resolvedRef = getElementFromDictLiteral((PyDictLiteralExpression)valueExpr, indexElement); if (resolvedRef != null) return resolvedRef; } else if (valueExpr instanceof PyReferenceExpression) { @@ -240,7 +240,7 @@ public class PySubstitutionChunkReference extends PsiReferenceBase expr = getElementFromCallExpression((PyCallExpression)underStarExpr, index.toString()); + Ref expr = resolveDictCall((PyCallExpression)underStarExpr, index.toString(), true); allKeysForSure = expr != null; if (expr != null && !expr.isNull()) return expr; } @@ -253,16 +253,6 @@ public class PySubstitutionChunkReference extends PsiReferenceBase getElementFromCallExpression(@NotNull PyCallExpression valueExpr, - @NotNull String key) { - final PyExpression callee = valueExpr.getCallee(); - if (callee != null && "dict".equals(callee.getName())) { - return resolveDictCall(valueExpr, key, true); - } - return null; - } - @Nullable public static Ref getElementByIndex(@NotNull PyExpression listTupleExpr, int index) { boolean noElementsForSure = true; @@ -345,8 +335,8 @@ public class PySubstitutionChunkReference extends PsiReferenceBase resolvedRef = getElementFromDictLiteral(containedExpr, key); + if (PyUtil.instanceOf(containedExpr, PyDictLiteralExpression.class)) { + final Ref resolvedRef = getElementFromDictLiteral((PyDictLiteralExpression)containedExpr, key); return resolvedRef != null ? resolvedRef.get() : containedExpr; } else if (PyUtil.instanceOf(containedExpr, PyLiteralExpression.class, PySetLiteralExpression.class, @@ -441,55 +431,47 @@ public class PySubstitutionChunkReference extends PsiReferenceBase getElementFromDictLiteral(@NotNull PyExpression expression, - @NotNull String mappingKey) { - if (expression instanceof PyDictLiteralExpression) { - final PyKeyValueExpression[] keyValueExpressions = ((PyDictLiteralExpression)expression).getElements(); + private Ref getElementFromDictLiteral(@NotNull PyDictLiteralExpression expression, @NotNull String mappingKey) { + final PyKeyValueExpression[] keyValueExpressions = expression.getElements(); - boolean allKeysForSure = true; - for (PyKeyValueExpression keyValueExpression : keyValueExpressions) { - PyExpression keyExpression = keyValueExpression.getKey(); - if (keyExpression instanceof PyStringLiteralExpression) { - final PyStringLiteralExpression key = (PyStringLiteralExpression)keyExpression; - if (key.getStringValue().equals(mappingKey)) { - return Ref.create(keyValueExpression.getValue()); - } - } - else if (!(keyExpression instanceof PyLiteralExpression)) { - allKeysForSure = false; + boolean allKeysForSure = true; + for (PyKeyValueExpression keyValueExpression : keyValueExpressions) { + PyExpression keyExpression = keyValueExpression.getKey(); + if (keyExpression instanceof PyStringLiteralExpression) { + final PyStringLiteralExpression key = (PyStringLiteralExpression)keyExpression; + if (key.getStringValue().equals(mappingKey)) { + return Ref.create(keyValueExpression.getValue()); } } + else if (!(keyExpression instanceof PyLiteralExpression)) { + allKeysForSure = false; + } + } - final LanguageLevel languageLevel = LanguageLevel.forElement(expression); - PyDoubleStarExpression[] starExpressions = PsiTreeUtil.getChildrenOfType(expression, PyDoubleStarExpression.class); - if (languageLevel.isAtLeast(LanguageLevel.PYTHON35) && starExpressions != null) { - for (PyDoubleStarExpression expr : starExpressions) { - PyExpression underStarExpr = PyPsiUtils.flattenParens(expr.getExpression()); - if (underStarExpr != null) { - if (underStarExpr instanceof PyDictLiteralExpression) { - Ref element = getElementFromDictLiteral(underStarExpr, mappingKey); - allKeysForSure = element != null; - if (element != null && !element.isNull()) return element; - } - else if (underStarExpr instanceof PyCallExpression) { - Ref element = getElementFromCallExpression((PyCallExpression)underStarExpr, mappingKey); - allKeysForSure = element != null; - if (element != null && !element.isNull()) return element; - } - else { - allKeysForSure = false; - } + final LanguageLevel languageLevel = LanguageLevel.forElement(expression); + PyDoubleStarExpression[] starExpressions = PsiTreeUtil.getChildrenOfType(expression, PyDoubleStarExpression.class); + if (languageLevel.isAtLeast(LanguageLevel.PYTHON35) && starExpressions != null) { + for (PyDoubleStarExpression expr : starExpressions) { + PyExpression underStarExpr = PyPsiUtils.flattenParens(expr.getExpression()); + if (underStarExpr != null) { + if (underStarExpr instanceof PyDictLiteralExpression) { + Ref element = getElementFromDictLiteral((PyDictLiteralExpression)underStarExpr, mappingKey); + allKeysForSure = element != null; + if (element != null && !element.isNull()) return element; + } + else if (underStarExpr instanceof PyCallExpression) { + Ref element = resolveDictCall((PyCallExpression)underStarExpr, mappingKey, true); + allKeysForSure = element != null; + if (element != null && !element.isNull()) return element; + } + else { + allKeysForSure = false; } } } + } - return allKeysForSure ? Ref.create() : null; - } - else if (expression instanceof PyCallExpression) { - return resolveDictCall((PyCallExpression)expression, mappingKey, false); - } - - return null; + return allKeysForSure ? Ref.create() : null; } @Nullable @@ -505,7 +487,7 @@ public class PySubstitutionChunkReference extends PsiReferenceBase element = getElementFromDictLiteral(expr, key); + Ref element = getElementFromDictLiteral((PyDictLiteralExpression)expr, key); if (element != null) return element; } else if (expr instanceof PyCallExpression) {