Hi All,
I’m developing a custom kotlin plugin using sonar-kotlin-plugin.
I am able to see the plugin registered successfully with the rules within it displayed on SonarQube. But I failed to get the rule picked up when scanning from scanner side.
Would appreciate if anyone could kindly help? Thank you very much in advance!
I have added this in my pom file:
<!-- https://mvnrepository.com/artifact/org.sonarsource.slang/sonar-kotlin-plugin -->
<dependency>
<groupId>org.sonarsource.slang</groupId>
<artifactId>sonar-kotlin-plugin</artifactId>
<version>1.7.0.883</version>
</dependency>
My plugin class:
public class MyKotlinPlugin extends KotlinPlugin {
public void define(Context context) {
context.addExtensions(
MyKotlinRulesDefinition.class
);
}
}
My RuleDefinition class:
package custom.rule;
import java.util.ArrayList;
import org.sonar.api.SonarRuntime;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonarsource.analyzer.commons.RuleMetadataLoader;
import org.sonarsource.kotlin.plugin.KotlinCheckList;
import org.sonarsource.kotlin.plugin.KotlinPlugin;
import org.sonarsource.kotlin.plugin.KotlinProfileDefinition;
import org.sonarsource.slang.checks.CommentedCodeCheck;
import org.sonarsource.slang.checks.utils.Language;
import org.sonarsource.slang.plugin.RulesDefinitionUtils;
public class MyKotlinRulesDefinition implements RulesDefinition {
private static final String RESOURCE_FOLDER = "org/sonar/l10n/kotlin/rules/kotlin";
private final SonarRuntime sonarRuntime;
public MyKotlinRulesDefinition (SonarRuntime sonarRuntime) {
this.sonarRuntime = sonarRuntime;
}
@Override
public void define(Context context) {
NewRepository repository = context
.createRepository("my-key", "kotlin")
.setName("my-repo-name");
RuleMetadataLoader ruleMetadataLoader = new RuleMetadataLoader(RESOURCE_FOLDER);
ArrayList<Class> checks = new ArrayList<>(MyKotlinCheckList.checks());
ruleMetadataLoader.addRulesByAnnotatedClass(repository, checks);
RulesDefinitionUtils.setDefaultValuesForParameters(repository, checks, Language.KOTLIN);
repository.done();
}
}
My custom rule:
@Rule(key = "MyKotlin")
public class MyKotlinRule implements SlangCheck {
@Override
public void initialize(InitContext initContext) {
initContext.register(StringLiteralTree.class, (ctx, tree) -> {
String content = tree.content();
System.out.println("tree content:" + content);
ctx.reportIssue(tree, content);
});
}
}
MyKotlinCheckList.class
public class MyKotlinCheckList{
private static final Class[] CHECKS= new Class[]{MyKotlinRule.class};
private MyKotlinCheckList() {
}
public static List<Class> checks() {
return Arrays.asList(CHECKS);
}
}