diff --git a/python-checks/src/main/java/org/sonar/python/checks/BreakContinueOutsideLoopCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BreakContinueOutsideLoopCheck.java index 398f7da19d..1fc9a19675 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BreakContinueOutsideLoopCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BreakContinueOutsideLoopCheck.java @@ -19,41 +19,35 @@ */ package org.sonar.python.checks; -import com.sonar.sslr.api.AstNode; -import com.sonar.sslr.api.AstNodeType; -import java.util.Set; +import com.jetbrains.python.PyElementTypes; +import com.jetbrains.python.psi.PyBreakStatement; +import com.jetbrains.python.psi.PyContinueStatement; +import com.jetbrains.python.psi.PyLoopStatement; +import com.jetbrains.python.psi.PyStatement; +import javax.annotation.Nullable; import org.sonar.check.Rule; import org.sonar.python.PythonCheck; -import org.sonar.python.api.PythonGrammar; +import org.sonar.python.SubscriptionContext; -@Rule(key = BreakContinueOutsideLoopCheck.CHECK_KEY) +@Rule(key = "S1716") public class BreakContinueOutsideLoopCheck extends PythonCheck { - private static final String MESSAGE = "Remove this \"%s\" statement"; - public static final String CHECK_KEY = "S1716"; - @Override - public Set subscribedKinds() { - return immutableSet(PythonGrammar.BREAK_STMT, PythonGrammar.CONTINUE_STMT); + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(PyElementTypes.BREAK_STATEMENT, ctx -> { + PyBreakStatement node = (PyBreakStatement) ctx.syntaxNode(); + checkLoopStatement(ctx, node, node.getLoopStatement(), "Remove this \"break\" statement"); + }); + context.registerSyntaxNodeConsumer(PyElementTypes.CONTINUE_STATEMENT, ctx -> { + PyContinueStatement node = (PyContinueStatement) ctx.syntaxNode(); + checkLoopStatement(ctx, node, node.getLoopStatement(), "Remove this \"continue\" statement"); + }); } - @Override - public void visitNode(AstNode node) { - AstNode currentParent = node.getParent(); - while (currentParent != null){ - if (currentParent.is(PythonGrammar.WHILE_STMT, PythonGrammar.FOR_STMT)){ - return; - } else if (currentParent.is(PythonGrammar.FUNCDEF, PythonGrammar.CLASSDEF)){ - raiseIssue(node); - return; - } - currentParent = currentParent.getParent(); + private static void checkLoopStatement(SubscriptionContext ctx, PyStatement node, @Nullable PyLoopStatement loopStatement, String message) { + if (loopStatement == null) { + ctx.addIssue(node.getNode().getFirstChildNode().getPsi(), message); } - raiseIssue(node); } - private void raiseIssue(AstNode node) { - addIssue(node, String.format(MESSAGE, node.getToken().getValue())); - } } - diff --git a/python-checks/src/main/java/org/sonar/python/checks/CommentRegularExpressionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CommentRegularExpressionCheck.java index 88b5eadb11..9a38370f02 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CommentRegularExpressionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CommentRegularExpressionCheck.java @@ -19,16 +19,14 @@ */ package org.sonar.python.checks; -import com.sonar.sslr.api.Token; -import com.sonar.sslr.api.Trivia; +import com.jetbrains.python.PyTokenTypes; import java.util.regex.Pattern; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; import org.sonar.python.PythonCheck; -@Rule(key = CommentRegularExpressionCheck.CHECK_KEY) +@Rule(key = "CommentRegularExpression") public class CommentRegularExpressionCheck extends PythonCheck { - public static final String CHECK_KEY = "CommentRegularExpression"; private static final String DEFAULT_REGULAR_EXPRESSION = ""; private static final String DEFAULT_MESSAGE = "The regular expression matches this comment"; @@ -61,14 +59,12 @@ private Pattern pattern() { } @Override - public void visitToken(Token token) { - if (pattern() != null) { - for (Trivia trivia : token.getTrivia()) { - if (trivia.isComment() && pattern().matcher(trivia.getToken().getOriginalValue()).matches()) { - addIssue(trivia.getToken(), message); - } + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(PyTokenTypes.END_OF_LINE_COMMENT, ctx -> { + if (pattern().matcher(ctx.syntaxNode().getText()).matches()) { + ctx.addIssue(ctx.syntaxNode(), message); } - } + }); } } diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index 11d17e098a..6efdeaa00f 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -721,6 +721,7 @@ com/intellij/psi/PsiBinaryFile.class com/intellij/psi/PsiCheckedRenameElement.class com/intellij/psi/PsiComment.class + com/intellij/psi/PsiDirectory.class com/intellij/psi/PsiElement.class com/intellij/psi/PsiElementVisitor$1.class com/intellij/psi/PsiElementVisitor.class