From a776768506979110e5de5a9531042d3c8716ceb3 Mon Sep 17 00:00:00 2001 From: Elena Vilchik Date: Fri, 27 Dec 2019 13:37:21 +0100 Subject: Analyze CSS in Vue Single File Components --- its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java | 3 ++- its/plugin/src/test/java/org/sonar/css/its/Tests.java | 2 ++ sonar-css-plugin/pom.xml | 4 ++-- .../src/main/java/org/sonar/css/plugin/CssRuleSensor.java | 14 +++++++++++--- .../test/java/org/sonar/css/plugin/CssRuleSensorTest.java | 9 ++++++--- .../src/test/resources/mock-start-server/startServer.js | 1 + 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java b/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java index cb6b9c1..8eee288 100644 --- a/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java +++ b/its/plugin/src/test/java/org/sonar/css/its/IssuesTest.java @@ -152,7 +152,8 @@ public class IssuesTest { tuple("css:S4655", "issues-project:src/file3.scss"), tuple("css:S4658", "issues-project:src/file3.scss"), tuple("css:S4661", "issues-project:src/file3.scss"), - tuple("css:S1116", "issues-project:src/file5.htm") + tuple("css:S1116", "issues-project:src/file5.htm"), + tuple("css:S1116", "issues-project:src/file6.vue") ); } diff --git a/its/plugin/src/test/java/org/sonar/css/its/Tests.java b/its/plugin/src/test/java/org/sonar/css/its/Tests.java index d6f109e..532b7bc 100644 --- a/its/plugin/src/test/java/org/sonar/css/its/Tests.java +++ b/its/plugin/src/test/java/org/sonar/css/its/Tests.java @@ -58,6 +58,8 @@ public class Tests { OrchestratorBuilder orchestratorBuilder = Orchestrator.builderEnv() .addPlugin(MavenLocation.of("org.sonarsource.php", "sonar-php-plugin", "LATEST_RELEASE")) .addPlugin(MavenLocation.of("org.sonarsource.html", "sonar-html-plugin", "LATEST_RELEASE")) + .addPlugin(MavenLocation.of("org.sonarsource.javascript", "sonar-javascript-plugin", "LATEST_RELEASE")) + .addPlugin(MavenLocation.of("org.sonarsource.typescript", "sonar-typescript-plugin", "LATEST_RELEASE")) .addPlugin(PLUGIN_LOCATION) .setSonarVersion(System.getProperty("sonar.runtimeVersion", "LATEST_RELEASE")); ORCHESTRATOR = orchestratorBuilder.build(); diff --git a/sonar-css-plugin/pom.xml b/sonar-css-plugin/pom.xml index c79869e..b8576c9 100644 --- a/sonar-css-plugin/pom.xml +++ b/sonar-css-plugin/pom.xml @@ -135,8 +135,8 @@ - 6800000 - 9000000 + 8000000 + 9500000 ${project.build.directory}/${project.build.finalName}.jar diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRuleSensor.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRuleSensor.java index db961df..9b2241c 100644 --- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRuleSensor.java +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRuleSensor.java @@ -142,8 +142,8 @@ public class CssRuleSensor implements Sensor { LOG.info(e.toString()); } catch (Exception e) { - // we can end up here in the following cases: file analysis request sending, or response parsing, server is not answering - // or some unpredicted state + // we can end up here in the following cases: fail to send file analysis request, fail to parse the response, server is not answering + // or some other unpredicted state String msg = "Failure during CSS analysis, " + cssAnalyzerBridgeServer.getCommandInfo(); logErrorOrWarn(context, msg, e); throwFailFast(context, e); @@ -245,10 +245,18 @@ public class CssRuleSensor implements Sensor { private static List getInputFiles(SensorContext context) { FileSystem fileSystem = context.fileSystem(); + FilePredicate mainFilePredicate = fileSystem.predicates().and( fileSystem.predicates().hasType(InputFile.Type.MAIN), fileSystem.predicates().hasLanguages(CssLanguage.KEY, "php", "web")); - return StreamSupport.stream(fileSystem.inputFiles(mainFilePredicate).spliterator(), false) + + FilePredicate vueFilePredicate = fileSystem.predicates().and( + fileSystem.predicates().hasType(InputFile.Type.MAIN), + fileSystem.predicates().hasExtension("vue"), + // by default 'vue' extension is defined for JS language, but 'vue' files can contain TS code and thus language can be changed + fileSystem.predicates().hasLanguages("js", "ts")); + + return StreamSupport.stream(fileSystem.inputFiles(fileSystem.predicates().or(mainFilePredicate, vueFilePredicate)).spliterator(), false) .collect(Collectors.toList()); } diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java index 429722d..5490194 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java @@ -129,14 +129,15 @@ public class CssRuleSensorTest { DefaultInputFile fileCss = addInputFile("file.css"); DefaultInputFile fileHtml = addInputFile("file.web"); DefaultInputFile filePhp = addInputFile("file.php"); + DefaultInputFile fileVue = addInputFile("file.vue"); addInputFile("file.js"); sensor.execute(context); - assertThat(context.allIssues()).hasSize(3); + assertThat(context.allIssues()).hasSize(4); assertThat(context.allIssues()) .extracting("primaryLocation.component") - .containsOnly(fileCss, fileHtml, filePhp); + .containsOnly(fileCss, fileHtml, filePhp, fileVue); } @Test @@ -322,8 +323,10 @@ public class CssRuleSensorTest { } private DefaultInputFile addInputFile(String relativePath) { + String extension = relativePath.split("\\.")[1]; + String language = extension.equals("vue") ? "js" : extension; DefaultInputFile inputFile = new TestInputFileBuilder("moduleKey", relativePath) - .setLanguage(relativePath.split("\\.")[1]) + .setLanguage(language) .setCharset(StandardCharsets.UTF_8) .setContents("some css content\n on 2 lines") .build(); diff --git a/sonar-css-plugin/src/test/resources/mock-start-server/startServer.js b/sonar-css-plugin/src/test/resources/mock-start-server/startServer.js index 87298a9..b224e48 100644 --- a/sonar-css-plugin/src/test/resources/mock-start-server/startServer.js +++ b/sonar-css-plugin/src/test/resources/mock-start-server/startServer.js @@ -24,6 +24,7 @@ const requestHandler = (request, response) => { case "file.css": case "file.web": case "file.php": + case "file.vue": case "file.js": // to test that we will not save this issue even if it's provided by response response.end(JSON.stringify([ {line: 2, rule: "block-no-empty", text: "Unexpected empty block"} -- cgit v1.2.3