fixed PY-11281 Convert dict comprehension to dict call omits if expression

This commit is contained in:
Ekaterina Tuzova
2014-01-23 19:19:06 +04:00
parent 36d507f809
commit 1d6966b654
4 changed files with 37 additions and 8 deletions
@@ -52,16 +52,38 @@ public class ConvertDictCompQuickFix implements LocalQuickFix {
}
private static void replaceComprehension(Project project, PyDictCompExpression expression) {
List<ComprhForComponent> forComponents = expression.getForComponents();
if (expression.getResultExpression() instanceof PyKeyValueExpression) {
PyKeyValueExpression keyValueExpression = (PyKeyValueExpression)expression.getResultExpression();
PyElementGenerator elementGenerator = PyElementGenerator.getInstance(project);
final PyKeyValueExpression keyValueExpression = (PyKeyValueExpression)expression.getResultExpression();
final PyElementGenerator elementGenerator = PyElementGenerator.getInstance(project);
assert keyValueExpression.getValue() != null;
expression.replace(elementGenerator.createFromText(LanguageLevel.getDefault(), PyExpressionStatement.class,
"dict([(" + keyValueExpression.getKey().getText() + ", " +
keyValueExpression.getValue().getText() + ") for " +
forComponents.get(0).getIteratorVariable().getText() + " in " +
forComponents.get(0).getIteratedList().getText() + "])"));
final List<ComprehensionComponent> components = expression.getComponents();
final StringBuilder replacement = new StringBuilder("dict([(" + keyValueExpression.getKey().getText() + ", " +
keyValueExpression.getValue().getText() + ")");
int slashNum = 1;
for (ComprehensionComponent component : components) {
if (component instanceof ComprhForComponent) {
replacement.append("for ");
replacement.append(((ComprhForComponent)component).getIteratorVariable().getText());
replacement.append(" in ");
replacement.append(((ComprhForComponent)component).getIteratedList().getText());
replacement.append(" ");
}
if (component instanceof ComprhIfComponent) {
final PyExpression test = ((ComprhIfComponent)component).getTest();
if (test != null) {
replacement.append("if ");
replacement.append(test.getText());
replacement.append(" ");
}
}
for (int i = 0; i != slashNum; ++i)
replacement.append("\t");
++slashNum;
}
replacement.append("])");
expression.replace(elementGenerator.createFromText(LanguageLevel.getDefault(), PyExpressionStatement.class, replacement.toString()));
}
}
@@ -0,0 +1 @@
var = <warning descr="Python version 2.4, 2.5, 2.6, 3.0 do not support dictionary comprehensions">{k: v for k, v in zip('abc', <caret>range(3)) if k % 2}</warning>
@@ -0,0 +1 @@
var = dict([(k, v) for k, v in zip('abc', range(3)) if k % 2])
@@ -342,6 +342,11 @@ public class PyQuickFixTest extends PyTestCase {
PyBundle.message("QFIX.replace.function.set.with.literal"), true, true);
}
public void testDictComprehensionToCall() {
doInspectionTest("DictComprehensionToCall.py", PyCompatibilityInspection.class,
PyBundle.message("INTN.convert.dict.comp.to"), true, true);
}
public void testDocstringParams() { //PY-3394
PyDocumentationSettings documentationSettings = PyDocumentationSettings.getInstance(myFixture.getModule());
documentationSettings.setFormat(DocStringFormat.EPYTEXT);