Skip to content

Commit 77bd4f4

Browse files
Avoid loading SonarlintPythonIndexer on older versions of SonarLint (#923)
1 parent b823950 commit 77bd4f4

File tree

3 files changed

+45
-2
lines changed

3 files changed

+45
-2
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
<sonar.version>8.9.0.43852</sonar.version>
9393
<sonar.orchestrator.version>3.35.1.2719</sonar.orchestrator.version>
9494
<sonar-analyzer-commons.version>1.14.1.690</sonar-analyzer-commons.version>
95-
<sonarlint-core.version>5.4.0.31832</sonarlint-core.version>
95+
<sonarlint-core.version>5.4.0.31923</sonarlint-core.version>
9696
<sslr.version>1.23</sslr.version>
9797
</properties>
9898

sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonPlugin.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.sonar.api.SonarRuntime;
2626
import org.sonar.api.config.PropertyDefinition;
2727
import org.sonar.api.resources.Qualifiers;
28+
import org.sonar.api.utils.log.Logger;
29+
import org.sonar.api.utils.log.Loggers;
2830
import org.sonar.plugins.python.bandit.BanditRulesDefinition;
2931
import org.sonar.plugins.python.bandit.BanditSensor;
3032
import org.sonar.plugins.python.coverage.PythonCoverageSensor;
@@ -39,6 +41,7 @@
3941
public class PythonPlugin implements Plugin {
4042

4143
private static final String PYTHON_CATEGORY = "Python";
44+
private static final Logger LOG = Loggers.get(PythonPlugin.class);
4245

4346
// Subcategories
4447
private static final String GENERAL = "General";
@@ -81,7 +84,8 @@ public void define(Context context) {
8184
addFlake8Extensions(context);
8285
}
8386
if (sonarRuntime.getProduct() == SonarProduct.SONARLINT) {
84-
context.addExtension(SonarLintPythonIndexer.class);
87+
SonarLintPluginAPIManager sonarLintPluginAPIManager = new SonarLintPluginAPIManager();
88+
sonarLintPluginAPIManager.addSonarlintPythonIndexer(context, new SonarLintPluginAPIVersion());
8589
}
8690
}
8791

@@ -175,4 +179,26 @@ private static void addFlake8Extensions(Context context) {
175179
Flake8RulesDefinition.class);
176180
}
177181

182+
static class SonarLintPluginAPIManager {
183+
184+
public void addSonarlintPythonIndexer(Context context, SonarLintPluginAPIVersion sonarLintPluginAPIVersion) {
185+
if (sonarLintPluginAPIVersion.isDependencyAvailable()) {
186+
context.addExtension(SonarLintPythonIndexer.class);
187+
} else {
188+
LOG.debug("Error while trying to inject SonarLintPythonIndexer");
189+
}
190+
}
191+
}
192+
193+
static class SonarLintPluginAPIVersion {
194+
195+
boolean isDependencyAvailable() {
196+
try {
197+
Class.forName("org.sonarsource.sonarlint.plugin.api.module.file.ModuleFileListener");
198+
} catch (ClassNotFoundException e) {
199+
return false;
200+
}
201+
return true;
202+
}
203+
}
178204
}

sonar-python-plugin/src/test/java/org/sonar/plugins/python/PythonPluginTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,19 @@
2727
import org.sonar.api.SonarRuntime;
2828
import org.sonar.api.internal.SonarRuntimeImpl;
2929
import org.sonar.api.utils.Version;
30+
import org.sonar.api.utils.log.LogTester;
31+
import org.sonar.api.utils.log.LoggerLevel;
3032
import org.sonar.plugins.python.warnings.DefaultAnalysisWarningsWrapper;
3133

3234
import static org.assertj.core.api.Assertions.assertThat;
35+
import static org.mockito.Mockito.mock;
36+
import static org.mockito.Mockito.when;
3337

3438
public class PythonPluginTest {
3539

40+
@org.junit.Rule
41+
public LogTester logTester = new LogTester();
42+
3643
@Test
3744
public void testGetExtensions() {
3845
Version v79 = Version.create(7, 9);
@@ -42,6 +49,16 @@ public void testGetExtensions() {
4249
assertThat(extensions(SonarRuntimeImpl.forSonarLint(v79))).hasSize(6);
4350
}
4451

52+
@Test
53+
public void classNotAvailable() {
54+
PythonPlugin.SonarLintPluginAPIVersion sonarLintPluginAPIVersion = mock(PythonPlugin.SonarLintPluginAPIVersion.class);
55+
when(sonarLintPluginAPIVersion.isDependencyAvailable()).thenReturn(false);
56+
PythonPlugin.SonarLintPluginAPIManager sonarLintPluginAPIManager = new PythonPlugin.SonarLintPluginAPIManager();
57+
Plugin.Context context = mock(Plugin.Context.class);
58+
sonarLintPluginAPIManager.addSonarlintPythonIndexer(context, sonarLintPluginAPIVersion);
59+
assertThat(logTester.logs(LoggerLevel.DEBUG)).containsExactly("Error while trying to inject SonarLintPythonIndexer");
60+
}
61+
4562
private static List extensions(SonarRuntime runtime) {
4663
Plugin.Context context = new Plugin.Context(runtime);
4764
new PythonPlugin().define(context);

0 commit comments

Comments
 (0)