Skip to content
This repository was archived by the owner on Feb 2, 2026. It is now read-only.

Commit c276cc8

Browse files
pynicolasvilchik-elena
authored andcommitted
SONARJS-775 Set up default profile for SonarLint (SonarSource#397)
1 parent 5114fc7 commit c276cc8

File tree

4 files changed

+42
-15
lines changed

4 files changed

+42
-15
lines changed

sonar-javascript-plugin/src/main/java/org/sonar/plugins/javascript/JavaScriptPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public void define(Context context) {
6969
context.addExtensions(
7070
JavaScriptLanguage.class,
7171
JavaScriptSquidSensor.class,
72-
JavaScriptRulesDefinition.class,
72+
new JavaScriptRulesDefinition(context.getSonarQubeVersion()),
7373
JavaScriptProfile.class);
7474

7575
// Do not waste resources adding coverage sensors to SonarLint, as they are handled as no-ops.

sonar-javascript-plugin/src/main/java/org/sonar/plugins/javascript/JavaScriptProfile.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@
3131
import org.sonar.api.rules.RuleFinder;
3232
import org.sonar.api.utils.ValidationMessages;
3333
import org.sonar.javascript.checks.CheckList;
34-
import org.sonarsource.api.sonarlint.SonarLintSide;
3534

36-
@SonarLintSide
3735
public class JavaScriptProfile extends ProfileDefinition {
3836

3937
private final RuleFinder ruleFinder;
@@ -61,22 +59,22 @@ private void loadFromCommonRepository(RulesProfile profile) {
6159
}
6260

6361
private void loadActiveKeysFromJsonProfile(RulesProfile rulesProfile) {
64-
URL profileUrl = JavaScriptProfile.class.getResource("/org/sonar/l10n/javascript/rules/javascript/Sonar_way_profile.json");
62+
for (String ruleKey : activatedRuleKeys()) {
63+
Rule rule = ruleFinder.findByKey(CheckList.REPOSITORY_KEY, ruleKey);
64+
rulesProfile.activateRule(rule, null);
65+
}
66+
}
6567

68+
public static Set<String> activatedRuleKeys() {
69+
URL profileUrl = JavaScriptProfile.class.getResource("/org/sonar/l10n/javascript/rules/javascript/Sonar_way_profile.json");
6670
try {
6771
Gson gson = new Gson();
68-
Profile profile = gson.fromJson(Resources.toString(profileUrl, Charsets.UTF_8), Profile.class);
69-
for (String ruleKey : profile.ruleKeys) {
70-
Rule rule = ruleFinder.findByKey(CheckList.REPOSITORY_KEY, ruleKey);
71-
rulesProfile.activateRule(rule, null);
72-
}
73-
72+
return gson.fromJson(Resources.toString(profileUrl, Charsets.UTF_8), Profile.class).ruleKeys;
7473
} catch (IOException e) {
7574
throw new IllegalStateException("Failed to read: " + profileUrl, e);
7675
}
7776
}
7877

79-
8078
private static class Profile {
8179
Set<String> ruleKeys;
8280
}

sonar-javascript-plugin/src/main/java/org/sonar/plugins/javascript/rules/JavaScriptRulesDefinition.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,26 @@
2525
import java.io.IOException;
2626
import java.net.URL;
2727
import java.util.Locale;
28+
import java.util.Set;
2829
import javax.annotation.Nullable;
2930
import org.sonar.api.rule.RuleStatus;
3031
import org.sonar.api.rules.RuleType;
3132
import org.sonar.api.server.debt.DebtRemediationFunction;
3233
import org.sonar.api.server.rule.RulesDefinition;
34+
import org.sonar.api.utils.Version;
3335
import org.sonar.javascript.checks.CheckList;
3436
import org.sonar.plugins.javascript.JavaScriptLanguage;
37+
import org.sonar.plugins.javascript.JavaScriptProfile;
3538
import org.sonar.squidbridge.annotations.AnnotationBasedRulesDefinition;
3639

3740
public class JavaScriptRulesDefinition implements RulesDefinition {
3841

3942
private final Gson gson = new Gson();
43+
private final Version sonarRuntimeVersion;
44+
45+
public JavaScriptRulesDefinition(Version sonarRuntimeVersion) {
46+
this.sonarRuntimeVersion = sonarRuntimeVersion;
47+
}
4048

4149
@Override
4250
public void define(Context context) {
@@ -55,6 +63,14 @@ public void define(Context context) {
5563
addMetadata(rule, metadataKey);
5664
}
5765

66+
boolean shouldSetupSonarLintProfile = sonarRuntimeVersion.isGreaterThanOrEqual(Version.parse("6.0"));
67+
if (shouldSetupSonarLintProfile) {
68+
Set<String> activatedRuleKeys = JavaScriptProfile.activatedRuleKeys();
69+
for (NewRule rule : repository.rules()) {
70+
rule.setActivatedByDefault(activatedRuleKeys.contains(rule.key()));
71+
}
72+
}
73+
5874
repository.done();
5975
}
6076

sonar-javascript-plugin/src/test/java/org/sonar/plugins/javascript/rules/JavaScriptRulesDefinitionTest.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.sonar.api.server.rule.RulesDefinition.Param;
2828
import org.sonar.api.server.rule.RulesDefinition.Repository;
2929
import org.sonar.api.server.rule.RulesDefinition.Rule;
30+
import org.sonar.api.utils.Version;
3031
import org.sonar.javascript.checks.CheckList;
3132

3233
import static org.assertj.core.api.Assertions.assertThat;
@@ -35,10 +36,7 @@ public class JavaScriptRulesDefinitionTest {
3536

3637
@Test
3738
public void test() {
38-
JavaScriptRulesDefinition rulesDefinition = new JavaScriptRulesDefinition();
39-
RulesDefinition.Context context = new RulesDefinition.Context();
40-
rulesDefinition.define(context);
41-
RulesDefinition.Repository repository = context.repository("javascript");
39+
RulesDefinition.Repository repository = buildRepository(Version.parse("5.6"));
4240

4341
assertThat(repository.name()).isEqualTo("SonarAnalyzer");
4442
assertThat(repository.language()).isEqualTo("js");
@@ -49,6 +47,21 @@ public void test() {
4947
assertAllRuleParametersHaveDescription(repository);
5048
}
5149

50+
@Test
51+
public void sonarlint() {
52+
RulesDefinition.Repository repository = buildRepository(Version.parse("6.0"));
53+
assertThat(repository.rule("ContinueStatement").activatedByDefault()).isFalse();
54+
assertThat(repository.rule("S2583").activatedByDefault()).isTrue();
55+
}
56+
57+
private RulesDefinition.Repository buildRepository(Version sonarRuntimeVersion) {
58+
JavaScriptRulesDefinition rulesDefinition = new JavaScriptRulesDefinition(sonarRuntimeVersion);
59+
RulesDefinition.Context context = new RulesDefinition.Context();
60+
rulesDefinition.define(context);
61+
RulesDefinition.Repository repository = context.repository("javascript");
62+
return repository;
63+
}
64+
5265
private void assertParameterProperties(Repository repository) {
5366
// TooManyLinesInFunctionCheck
5467
Param max = repository.rule("S138").param("max");

0 commit comments

Comments
 (0)