mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
fixed PY-5588 Compatibility inspection: highlight using keyword argument in the list of base classes as errors under py2
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user