fixed PY-5588 Compatibility inspection: highlight using keyword argument in the list of base classes as errors under py2

This commit is contained in:
Ekaterina Tuzova
2012-03-12 21:31:20 +04:00
parent 0d8205ae95
commit 0334bb96f7
4 changed files with 45 additions and 8 deletions
@@ -1,6 +1,7 @@
package com.jetbrains.python.inspections;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.roots.ProjectFileIndex;
@@ -115,9 +116,10 @@ public class PyCompatibilityInspection extends PyInspection {
myHolder = holder;
}
@Override
protected final void registerProblem(@Nullable final PsiElement element,
@NotNull final String message,
final LocalQuickFix quickFix, boolean asError){
@Nullable final LocalQuickFix quickFix, final boolean asError){
if (element == null || element.getTextLength() == 0){
return;
}
@@ -215,5 +217,23 @@ public class PyCompatibilityInspection extends PyInspection {
len, source, null, false);
}
}
@Override
public void visitPyArgumentList(final PyArgumentList node) { //PY-5588
final List<PyElement> problemElements = new ArrayList<PyElement>();
if (node.getParent() instanceof PyClass) {
for (final PyExpression expression : node.getArguments()) {
if (expression instanceof PyKeywordArgument)
problemElements.add(expression);
}
}
final String errorMessage = "This syntax available only since py3";
final boolean isPy3 = LanguageLevel.forElement(node).isPy3K();
if (compatibleWithPy2() || !isPy3) {
for (final PyElement problemElement : problemElements)
myHolder.registerProblem(problemElement, errorMessage, isPy3? ProblemHighlightType.GENERIC_ERROR_OR_WARNING :
ProblemHighlightType.GENERIC_ERROR);
}
}
}
}
}
@@ -12,6 +12,7 @@ import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.actions.*;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyQualifiedName;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet;
import java.util.List;
@@ -455,13 +456,13 @@ public abstract class CompatibilityVisitor extends PyAnnotator {
return false;
}
protected abstract void registerProblem(PsiElement node, String s, LocalQuickFix localQuickFix, boolean asError);
protected abstract void registerProblem(PsiElement node, String s, @Nullable LocalQuickFix localQuickFix, boolean asError);
protected void registerProblem(PsiElement node, String s, LocalQuickFix localQuickFix) {
protected void registerProblem(final PsiElement node, final String s, @Nullable final LocalQuickFix localQuickFix) {
registerProblem(node, s, localQuickFix, true);
}
protected void registerProblem(PsiElement node, String s) {
protected void registerProblem(final PsiElement node, final String s) {
registerProblem(node, s, null);
}
@@ -492,10 +493,14 @@ public abstract class CompatibilityVisitor extends PyAnnotator {
}
@Override
public void visitPyNonlocalStatement(PyNonlocalStatement node) {
if (myVersionsToProcess.contains(LanguageLevel.PYTHON24) || myVersionsToProcess.contains(LanguageLevel.PYTHON25) ||
myVersionsToProcess.contains(LanguageLevel.PYTHON26) || myVersionsToProcess.contains(LanguageLevel.PYTHON27)) {
public void visitPyNonlocalStatement(final PyNonlocalStatement node) {
if (compatibleWithPy2()) {
registerProblem(node, "nonlocal keyword available only since py3", null, false);
}
}
protected boolean compatibleWithPy2() {
return myVersionsToProcess.contains(LanguageLevel.PYTHON24) || myVersionsToProcess.contains(LanguageLevel.PYTHON25) ||
myVersionsToProcess.contains(LanguageLevel.PYTHON26) || myVersionsToProcess.contains(LanguageLevel.PYTHON27);
}
}
@@ -0,0 +1,8 @@
class Foo(base1, base2, <error descr="This syntax available only since py3">metaclass=mymeta</error>):
pass
class Foo(base1, base2):
pass
def foo(base1, base2, metaclass=mymeta):
pass
@@ -110,6 +110,10 @@ public class PyCompatibilityInspectionTest extends PyTestCase {
doTest();
}
public void testClassBaseList() {
doTest();
}
private void doTest() {
myFixture.configureByFile("inspections/PyCompatibilityInspection/" + getTestName(true) + ".py");
myFixture.enableInspections(PyCompatibilityInspection.class);