aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-css-plugin/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'sonar-css-plugin/src/main/java')
-rw-r--r--sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssPlugin.java1
-rw-r--r--sonar-css-plugin/src/main/java/org/sonar/css/plugin/MetricSensor.java86
-rw-r--r--sonar-css-plugin/src/main/java/org/sonar/css/plugin/Tokenizer.java9
3 files changed, 91 insertions, 5 deletions
diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssPlugin.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssPlugin.java
index 07b4feb..65e6453 100644
--- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssPlugin.java
+++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssPlugin.java
@@ -34,6 +34,7 @@ public class CssPlugin implements Plugin {
@Override
public void define(Context context) {
context.addExtensions(
+ MetricSensor.class,
CssLanguage.class,
SonarWayProfile.class,
diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/MetricSensor.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/MetricSensor.java
new file mode 100644
index 0000000..fb9c522
--- /dev/null
+++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/MetricSensor.java
@@ -0,0 +1,86 @@
+/*
+ * SonarCSS
+ * Copyright (C) 2018-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.css.plugin;
+
+import org.sonar.api.batch.fs.FileSystem;
+import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.batch.sensor.Sensor;
+import org.sonar.api.batch.sensor.SensorContext;
+import org.sonar.api.batch.sensor.SensorDescriptor;
+import org.sonar.api.batch.sensor.highlighting.NewHighlighting;
+import org.sonar.api.batch.sensor.highlighting.TypeOfText;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
+
+import javax.script.ScriptException;
+
+import java.io.IOException;
+import java.util.Optional;
+
+public class MetricSensor implements Sensor {
+
+ private static final Logger LOG = Loggers.get(MetricSensor.class);
+
+ @Override
+ public void describe(SensorDescriptor descriptor) {
+ descriptor
+ .onlyOnLanguage(CssLanguage.KEY);
+ }
+
+ @Override
+ public void execute(SensorContext context) {
+ FileSystem fileSystem = context.fileSystem();
+ Iterable<InputFile> inputFiles = fileSystem.inputFiles(fileSystem.predicates().hasLanguage(CssLanguage.KEY));
+
+ Tokenizer tokenizer = new Tokenizer();
+
+ for (InputFile input : inputFiles) {
+ saveHighlights(context, input, tokenizer);
+ }
+ }
+
+ private static void saveHighlights(SensorContext sensorContext, InputFile input, Tokenizer tokenizer) {
+ try {
+ NewHighlighting highlighting = sensorContext.newHighlighting().onFile(input);
+ tokenizer.tokenize(input.contents())
+ .forEach(token -> getHighlightingType(token).ifPresent(type ->
+ highlighting.highlight(token.startLine, token.startColumn, token.endLine, token.endColumn, type)));
+ highlighting.save();
+
+ } catch (ScriptException e) {
+ LOG.error(String.format("Failed to tokenize file '%s'", input.toString()), e);
+ } catch (IOException e) {
+ LOG.error(String.format("Failed to read file '%s'", input.toString()), e);
+ }
+ }
+
+ private static Optional<TypeOfText> getHighlightingType(Token token) {
+ switch (token.type) {
+ case COMMENT:
+ return Optional.of(TypeOfText.COMMENT);
+
+ case STRING:
+ return Optional.of(TypeOfText.STRING);
+
+ default:
+ return Optional.empty();
+ }
+ }
+}
diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/Tokenizer.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/Tokenizer.java
index 8f03492..220bfaa 100644
--- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/Tokenizer.java
+++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/Tokenizer.java
@@ -26,16 +26,15 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
-import org.sonar.api.internal.apachecommons.lang.StringEscapeUtils;
+import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
+import org.apache.commons.lang.StringEscapeUtils;
import org.sonar.css.plugin.Token.Type;
public class Tokenizer {
public List<Token> tokenize(String css) throws ScriptException {
- ScriptEngineManager factory = new ScriptEngineManager();
- ScriptEngine engine = factory.getEngineByName("JavaScript");
+ ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine();
InputStream tokenizeScript = Tokenizer.class.getClassLoader().getResourceAsStream("tokenize.js");
engine.eval(new InputStreamReader(tokenizeScript, StandardCharsets.UTF_8));
String cssInput = "tokenize('" + StringEscapeUtils.escapeJavaScript(css) + "')";
@@ -105,7 +104,7 @@ public class Tokenizer {
if (value instanceof Double) {
return ((Double) value).intValue();
} else if (value instanceof Integer) {
- return (Integer) value;
+ return (Integer) value;
} else {
throw new IllegalStateException("Failed to convert to number: " + value);
}