diff options
Diffstat (limited to 'sonar-css-plugin/src/main/java/org')
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); } |
