diff --git a/build.gradle.kts b/build.gradle.kts index b505e44259..b4e1b6b97d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -166,8 +166,9 @@ dependencies { implementation("org.apache.httpcomponents.client5:httpclient5:5.0.3") { exclude(module = "slf4j-api") } - implementation(project(":clion")) implementation(project(":common")) + implementation(project(":clion")) + implementation(project(":rider")) testImplementation("junit:junit:4.12") testImplementation("org.assertj:assertj-core:3.16.1") testImplementation("org.mockito:mockito-core:2.19.0") @@ -181,6 +182,7 @@ dependencies { "sqplugins"("org.sonarsource.slang:sonar-kotlin-plugin:1.8.3.2219@jar") "sqplugins"("org.sonarsource.slang:sonar-ruby-plugin:1.8.3.2219@jar") "sqplugins"("org.sonarsource.html:sonar-html-plugin:3.4.0.2754@jar") + "sqplugins"("org.sonarsource.sonarlint.omnisharp:sonarlint-omnisharp-plugin:1.0.0.33008@jar") if (artifactoryUsername.isNotEmpty() && artifactoryPassword.isNotEmpty()) { "sqplugins"("com.sonarsource.cpp:sonar-cfamily-plugin:6.21.0.32709@jar") } @@ -344,6 +346,3 @@ signing { }) sign(configurations.archives.get()) } - - - diff --git a/gradle.properties b/gradle.properties index d9b441f833..f699de3f33 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ version=4.17-SNAPSHOT org.gradle.jvmargs=-XX:MaxPermSize=256M -sonarlintCoreVersion=6.1.0.32613 +sonarlintCoreVersion=6.1.0.32869 intellijBuildVersion=IC-2020.1.3 clionBuildVersion=CL-2020.1.3 # Should be the same as the one embedded into SonarLint Core diff --git a/src/main/java/org/sonarlint/intellij/core/SonarLintEngineFactory.java b/src/main/java/org/sonarlint/intellij/core/SonarLintEngineFactory.java index 8117d55d46..6c92ef2118 100644 --- a/src/main/java/org/sonarlint/intellij/core/SonarLintEngineFactory.java +++ b/src/main/java/org/sonarlint/intellij/core/SonarLintEngineFactory.java @@ -20,6 +20,8 @@ package org.sonarlint.intellij.core; import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.util.SystemInfo; +import com.intellij.util.PlatformUtils; import java.io.IOException; import java.net.URL; import java.nio.file.DirectoryStream; @@ -29,6 +31,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -71,7 +74,6 @@ ConnectedSonarLintEngine createEngine(String serverId) { GlobalLogOutput globalLogOutput = SonarLintUtils.getService(GlobalLogOutput.class); final NodeJsManager nodeJsManager = SonarLintUtils.getService(NodeJsManager.class); - URL cFamilyPluginUrl = findEmbeddedCFamilyPlugin(getPluginsDir()); ConnectedGlobalConfiguration.Builder config = ConnectedGlobalConfiguration.builder() .setLogOutput(globalLogOutput) .setSonarLintUserHome(getSonarLintHome()) @@ -80,9 +82,14 @@ ConnectedSonarLintEngine createEngine(String serverId) { .setNodeJs(nodeJsManager.getNodeJsPath(), nodeJsManager.getNodeJsVersion()) .setWorkDir(getWorkDir()) .setConnectionId(serverId); + URL cFamilyPluginUrl = findEmbeddedCFamilyPlugin(getPluginsDir()); if (cFamilyPluginUrl != null) { config.useEmbeddedPlugin(Language.CPP.getPluginKey(), cFamilyPluginUrl); } + URL csPluginUrl = findEmbeddedCsharpPlugin(getPluginsDir()); + if (csPluginUrl != null) { + config.useEmbeddedPlugin(Language.CS.getPluginKey(), csPluginUrl); + } // it will also start it return new ConnectedSonarLintEngineImpl(config.build()); @@ -151,6 +158,19 @@ private static URL findEmbeddedCFamilyPlugin(Path pluginsDir) { } } + @CheckForNull + private static URL findEmbeddedCsharpPlugin(Path pluginsDir) { + try { + List pluginsUrls = findFilesInDir(pluginsDir, "sonarlint-omnisharp-plugin-*.jar", "Found CSharp plugin: "); + if (pluginsUrls.size() > 1) { + throw new IllegalStateException("Multiple plugins found"); + } + return pluginsUrls.size() == 1 ? pluginsUrls.get(0) : null; + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + private static URL[] getPluginsUrls(Path pluginsDir) throws IOException { return findFilesInDir(pluginsDir, "*.jar", "Found plugin: ").toArray(new URL[0]); } @@ -179,6 +199,26 @@ private static Path getWorkDir() { private static Map prepareExtraProps() { SonarLintPlugin plugin = SonarLintUtils.getService(SonarLintPlugin.class); - return Collections.singletonMap("sonar.typescript.internal.typescriptLocation", plugin.getPath().toString()); + Map extraProps = new HashMap<>(); + extraProps.put("sonar.typescript.internal.typescriptLocation", plugin.getPath().toString()); + if (PlatformUtils.isRider()) { + addOmnisharpServerPath(plugin, extraProps); + } + return extraProps; + } + + private static void addOmnisharpServerPath(SonarLintPlugin plugin, Map extraProps) { + String osDir; + if (SystemInfo.isWindows) { + osDir = "win"; + } else if (SystemInfo.isMac) { + osDir = "osx"; + } else if (SystemInfo.isLinux) { + osDir = "linux"; + } else { + GlobalLogOutput.get().log("Unsupported platform for Omnisharp", LogOutput.Level.WARN); + return; + } + extraProps.put("sonar.cs.internal.omnisharpLocation", plugin.getPath().resolve("omnisharp").resolve(osDir).toString()); } }