From 2c52d397abcac2b6da82df6e93f11cf9c993532b Mon Sep 17 00:00:00 2001 From: Valentina Kiryushkina Date: Fri, 27 Jan 2017 19:34:10 +0300 Subject: [PATCH] PY-21156 Fix tests --- .../PySubstitutionChunkReference.java | 83 +++++++++++-------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/python/src/com/jetbrains/python/codeInsight/PySubstitutionChunkReference.java b/python/src/com/jetbrains/python/codeInsight/PySubstitutionChunkReference.java index 23b54b8eaa3e..df0c82b7dbd7 100644 --- a/python/src/com/jetbrains/python/codeInsight/PySubstitutionChunkReference.java +++ b/python/src/com/jetbrains/python/codeInsight/PySubstitutionChunkReference.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -179,7 +179,7 @@ public class PySubstitutionChunkReference extends PsiReferenceBase resolvedRef = getElementFromDictLiteral((PyDictLiteralExpression)returnValueExpr, indexElement, resolveContext); + Ref resolvedRef = getElementFromDictLiteral(returnValueExpr, indexElement, resolveContext); if (resolvedRef != null) return resolvedRef; } else if (returnValueExpr instanceof PyCallExpression) { @@ -189,7 +189,7 @@ public class PySubstitutionChunkReference extends PsiReferenceBase resolvedRef = getElementFromDictLiteral((PyDictLiteralExpression)valueExpr, indexElement, resolveContext); + Ref resolvedRef = getElementFromDictLiteral(valueExpr, indexElement, resolveContext); if (resolvedRef != null) return resolvedRef; } else if (valueExpr instanceof PyReferenceExpression) { @@ -296,7 +296,7 @@ public class PySubstitutionChunkReference extends PsiReferenceBase getStarArguments(@NotNull PyArgumentList argumentList, boolean isKeyword) { + private static List getStarArguments(@NotNull PyArgumentList argumentList, + @SuppressWarnings("SameParameterValue") boolean isKeyword) { return Arrays.stream(argumentList.getArguments()) .map(expression -> PyUtil.as(expression, PyStarArgument.class)) .filter(argument -> argument != null && argument.isKeyword() == isKeyword).collect(Collectors.toList()); @@ -468,7 +469,16 @@ public class PySubstitutionChunkReference extends PsiReferenceBase getElementFromDictLiteral(@NotNull PyDictLiteralExpression expression, + private Ref getElementFromDictLiteral(@NotNull PyExpression expression, @NotNull String mappingKey, @NotNull PyResolveContext resolveContext) { - final PyKeyValueExpression[] keyValueExpressions = expression.getElements(); + if (expression instanceof PyDictLiteralExpression) { + final PyKeyValueExpression[] keyValueExpressions = ((PyDictLiteralExpression)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()); + 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; } } - 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) { - return getElementFromDictLiteral((PyDictLiteralExpression)underStarExpr, mappingKey, resolveContext); - } - else if (underStarExpr instanceof PyCallExpression) { - return getElementFromCallExpression((PyCallExpression)underStarExpr, mappingKey, resolveContext, true); + 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) { + return getElementFromDictLiteral(underStarExpr, mappingKey, resolveContext); + } + else if (underStarExpr instanceof PyCallExpression) { + return getElementFromCallExpression((PyCallExpression)underStarExpr, mappingKey, resolveContext, true); + } } } } - } - return allKeysForSure ? Ref.create() : null; + return allKeysForSure ? Ref.create() : null; + } + else if (expression instanceof PyCallExpression) { + return resolveDictCall((PyCallExpression)expression, mappingKey, false); + } + + return null; } @Nullable @@ -535,7 +552,7 @@ public class PySubstitutionChunkReference extends PsiReferenceBase element = getElementFromDictLiteral((PyDictLiteralExpression)expr, key, resolveContext); + Ref element = getElementFromDictLiteral(expr, key, resolveContext); if (element != null) return element; } else if (expr instanceof PyCallExpression) {