Skip to content

Commit

Permalink
SONARJS-505 Make SubscriptionTreeVisitor available for custom rules
Browse files Browse the repository at this point in the history
  • Loading branch information
lindamartin committed Aug 24, 2015
1 parent 56192c0 commit ef05d14
Show file tree
Hide file tree
Showing 155 changed files with 320 additions and 232 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@
import org.sonar.squidbridge.annotations.SqaleSubCharacteristic;

@Rule(
key = "example",
key = "base",
priority = Priority.MINOR,
name = "Example",
name = "Base tree visitor check",
description = "desc")
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.SECURITY_FEATURES)
@SqaleConstantRemediation("5min")
public class ExampleCheck extends BaseTreeVisitor {
public class BaseTreeVisitorCheck extends BaseTreeVisitor {

@Override
public void visitFunctionExpression(FunctionExpressionTree tree) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ public String repositoryKey() {

@Override
public Class[] checkClasses() {
return new Class[] {ExampleCheck.class} ;
return new Class[] {
BaseTreeVisitorCheck.class,
SubscriptionBaseVisitorCheck.class
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2009-2013 SonarSource SA
* All rights reserved
* mailto:contact AT sonarsource DOT com
*/
package org.sonar.samples.javascript;

import com.google.common.collect.ImmutableList;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.squidbridge.annotations.SqaleConstantRemediation;
import org.sonar.squidbridge.annotations.SqaleSubCharacteristic;

import java.util.List;

@Rule(
key = "subscription",
priority = Priority.MINOR,
name = "Subscription base visitor check",
description = "desc")
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.SECURITY_FEATURES)
@SqaleConstantRemediation("10min")
public class SubscriptionBaseVisitorCheck extends SubscriptionBaseTreeVisitor {

@Override
public List<Tree.Kind> nodesToVisit() {
return ImmutableList.of(
Tree.Kind.FOR_IN_STATEMENT
);
}

@Override
public void visitNode(Tree tree) {
getContext().addIssue(this, tree, "For in statement.");
}

}
13 changes: 13 additions & 0 deletions its/plugin/projects/custom_rules/src/dir/Person.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/** BaseTreeVisitor **/
var Person = function(first, last, middle) {
this.first = first;
this.middle = middle;
this.last = last;
};

/** SubscriptionBaseVisitor **/
var myArray = [1, 2, 3];

for (props in myArray) {
// do something;
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,31 +19,32 @@
*/
package com.sonar.javascript.it.plugin;

import com.sonar.orchestrator.Orchestrator;
import com.sonar.orchestrator.build.SonarRunner;
import static org.fest.assertions.Assertions.assertThat;

import java.util.List;

import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.sonar.wsclient.issue.Issue;
import org.sonar.wsclient.issue.IssueClient;
import org.sonar.wsclient.issue.IssueQuery;

import java.util.List;

import static org.fest.assertions.Assertions.assertThat;
import static org.junit.Assume.assumeTrue;
import com.sonar.orchestrator.Orchestrator;
import com.sonar.orchestrator.build.SonarRunner;

public class CustomRulesTests {

@ClassRule
public static Orchestrator orchestrator = Tests.ORCHESTRATOR;

@Test
public void test() throws InterruptedException {
assumeTrue(Tests.is_strictly_after_plugin("2.5"));
private static IssueClient issueClient;

@BeforeClass
public static void prepare() throws InterruptedException {
orchestrator.resetData();
SonarRunner build = Tests.createSonarRunnerBuild()
.setProjectDir(TestUtils.projectDir("metrics"))
.setProjectDir(TestUtils.projectDir("custom_rules"))
.setProjectKey("custom-rules")
.setProjectName("Custom Rules")
.setProjectVersion("1.0")
Expand All @@ -52,15 +53,31 @@ public void test() throws InterruptedException {
orchestrator.getServer().associateProjectToQualityProfile("custom-rules", "js", "javascript-custom-rules-profile");
orchestrator.executeBuild(build);

IssueClient issueClient = orchestrator.getServer().wsClient().issueClient();
issueClient = orchestrator.getServer().wsClient().issueClient();
}

@Test
public void base_tree_visitor_check() {
List<Issue> issues = issueClient.find(IssueQuery.create().rules("javascript-custom-rules:base")).list();

assertThat(issues).hasSize(1);

List<Issue> issues = issueClient.find(IssueQuery.create().rules("javascript-custom-rules:example")).list();
Issue issue = issues.get(0);
assertThat(issue.line()).isEqualTo(2);
assertThat(issue.message()).isEqualTo("Function expression.");
assertThat(issue.debt()).isEqualTo("5min");
}

@Test
public void subscription_base_visitor_check() {
List<Issue> issues = issueClient.find(IssueQuery.create().rules("javascript-custom-rules:subscription")).list();

// We found issues so the extension rule was properly set.
assertThat(issues).hasSize(2);
// technical debt is properly set for the issue so SQALE model definition has been well define
if (Tests.is_strictly_after_plugin("2.6")) {
assertThat(issues.get(0).debt()).isEqualTo("5min");
}
assertThat(issues).hasSize(1);

Issue issue = issues.get(0);
assertThat(issue.line()).isEqualTo(11);
assertThat(issue.message()).isEqualTo("For in statement.");
assertThat(issue.debt()).isEqualTo("10min");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@
<rules>
<rule>
<repositoryKey>javascript-custom-rules</repositoryKey>
<key>example</key>
<key>base</key>
<priority>MAJOR</priority>
</rule>
<rule>
<repositoryKey>javascript-custom-rules</repositoryKey>
<key>subscription</key>
<priority>MAJOR</priority>
</rule>
</rules>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.Tree.Kind;
import org.sonar.plugins.javascript.api.tree.statement.IfStatementTree;
Expand All @@ -42,7 +42,7 @@
tags = {Tags.CERT, Tags.CWE, Tags.MISRA, Tags.PITFALL})
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.READABILITY)
@SqaleConstantRemediation("2min")
public class AlwaysUseCurlyBracesCheck extends SubscriptionBaseVisitor {
public class AlwaysUseCurlyBracesCheck extends SubscriptionBaseTreeVisitor {

@Override
public List<Kind> nodesToVisit() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.javascript.checks.utils.CheckUtils;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.Tree.Kind;
import org.sonar.plugins.javascript.api.tree.declaration.FunctionDeclarationTree;
Expand All @@ -47,7 +47,7 @@
tags = {Tags.OBSOLETE})
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.INSTRUCTION_RELIABILITY)
@SqaleConstantRemediation("30min")
public class ArgumentsCallerCalleeUsageCheck extends SubscriptionBaseVisitor {
public class ArgumentsCallerCalleeUsageCheck extends SubscriptionBaseTreeVisitor {

private static final String ARGUMENTS = "arguments";
private static final String CALLER = "caller";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.expression.AssignmentExpressionTree;
import org.sonar.plugins.javascript.api.tree.expression.BinaryExpressionTree;
Expand All @@ -43,7 +43,7 @@
@ActivatedByDefault
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.UNDERSTANDABILITY)
@SqaleConstantRemediation("5min")
public class BitwiseOperatorsCheck extends SubscriptionBaseVisitor {
public class BitwiseOperatorsCheck extends SubscriptionBaseTreeVisitor {

@Override
public List<Tree.Kind> nodesToVisit() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.check.RuleProperty;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.Tree.Kind;
import org.sonar.plugins.javascript.api.tree.lexical.SyntaxToken;
Expand All @@ -43,7 +43,7 @@
priority = Priority.MAJOR)
@RuleTemplate
@NoSqale
public class CommentRegularExpressionCheck extends SubscriptionBaseVisitor {
public class CommentRegularExpressionCheck extends SubscriptionBaseTreeVisitor {

private static final String DEFAULT_REGULAR_EXPRESSION = "";
private static final String DEFAULT_MESSAGE = "The regular expression matches this comment.";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import org.sonar.check.Rule;
import org.sonar.javascript.lexer.JavaScriptKeyword;
import org.sonar.javascript.tree.JavaScriptCommentAnalyser;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.Tree.Kind;
import org.sonar.plugins.javascript.api.tree.lexical.SyntaxToken;
Expand All @@ -54,7 +54,7 @@
@ActivatedByDefault
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.UNDERSTANDABILITY)
@SqaleConstantRemediation("5min")
public class CommentedCodeCheck extends SubscriptionBaseVisitor {
public class CommentedCodeCheck extends SubscriptionBaseTreeVisitor {

private static final JavaScriptCommentAnalyser COMMENT_ANALYSER = new JavaScriptCommentAnalyser();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.Tree.Kind;
import org.sonar.plugins.javascript.api.tree.expression.BinaryExpressionTree;
Expand All @@ -44,7 +44,7 @@
@ActivatedByDefault
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.LOGIC_RELIABILITY)
@SqaleConstantRemediation("5min")
public class ComparisonWithNaNCheck extends SubscriptionBaseVisitor {
public class ComparisonWithNaNCheck extends SubscriptionBaseTreeVisitor {

@Override
public List<Kind> nodesToVisit() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.lexical.SyntaxToken;
import org.sonar.plugins.javascript.api.tree.lexical.SyntaxTrivia;
Expand All @@ -41,13 +41,13 @@
@ActivatedByDefault
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.LOGIC_RELIABILITY)
@SqaleConstantRemediation("5min")
public class ConditionalCommentCheck extends SubscriptionBaseVisitor {
public class ConditionalCommentCheck extends SubscriptionBaseTreeVisitor {

@Override
public List<Tree.Kind> nodesToVisit() {
return ImmutableList.of(Tree.Kind.TOKEN);
}

@Override
public void visitNode(Tree tree) {
SyntaxToken token = (SyntaxToken) tree;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.Tree.Kind;
import org.sonar.plugins.javascript.api.tree.expression.CallExpressionTree;
Expand All @@ -43,7 +43,7 @@
@ActivatedByDefault
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.SECURITY_FEATURES)
@SqaleConstantRemediation("5min")
public class ConsoleLoggingCheck extends SubscriptionBaseVisitor {
public class ConsoleLoggingCheck extends SubscriptionBaseTreeVisitor {

@Override
public List<Kind> nodesToVisit() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.check.RuleProperty;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.Tree.Kind;
import org.sonar.squidbridge.annotations.ActivatedByDefault;
Expand All @@ -41,7 +41,7 @@
tags = {Tags.BRAIN_OVERLOAD})
@ActivatedByDefault
@NoSqale
public class ExpressionComplexityCheck extends SubscriptionBaseVisitor {
public class ExpressionComplexityCheck extends SubscriptionBaseTreeVisitor {

private static final int DEFAULT = 3;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.lexical.SyntaxToken;
import org.sonar.squidbridge.annotations.ActivatedByDefault;
Expand All @@ -39,7 +39,7 @@
@ActivatedByDefault
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.INSTRUCTION_RELIABILITY)
@SqaleConstantRemediation("20min")
public class FixmeTagPresenceCheck extends SubscriptionBaseVisitor {
public class FixmeTagPresenceCheck extends SubscriptionBaseTreeVisitor {

private static final String PATTERN = "FIXME";
private static final String MESSAGE = "Take the required action to fix the issue indicated by this comment.";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.check.RuleProperty;
import org.sonar.javascript.checks.utils.SubscriptionBaseVisitor;
import org.sonar.plugins.javascript.api.visitors.SubscriptionBaseTreeVisitor;
import org.sonar.plugins.javascript.api.tree.Tree;
import org.sonar.plugins.javascript.api.tree.Tree.Kind;
import org.sonar.plugins.javascript.api.tree.expression.CallExpressionTree;
Expand All @@ -46,7 +46,7 @@
@ActivatedByDefault
@SqaleSubCharacteristic(RulesDefinition.SubCharacteristics.UNIT_TESTABILITY)
@SqaleConstantRemediation("1h")
public class FunctionComplexityCheck extends SubscriptionBaseVisitor {
public class FunctionComplexityCheck extends SubscriptionBaseTreeVisitor {

private static final int DEFAULT_MAXIMUM_FUNCTION_COMPLEXITY_THRESHOLD = 10;

Expand Down
Loading

0 comments on commit ef05d14

Please sign in to comment.