diff options
| author | Amaury Levé | 2018-06-21 11:33:42 +0200 | 
|---|---|---|
| committer | Elena Vilchik | 2018-06-21 11:33:42 +0200 | 
| commit | 913028fc4c913fec3bbc1800c00e526413040e01 (patch) | |
| tree | 0d1b7cadc4d45d82a1f0e3c91e96670d4b813551 /sonar-css-plugin/src/main | |
| parent | 6472431ad488158bfcf863a7b4a5655e1ecc55e8 (diff) | |
| download | sonar-css-913028fc4c913fec3bbc1800c00e526413040e01.tar.bz2 | |
Add comment lines and lines of code metrics (#49)
Diffstat (limited to 'sonar-css-plugin/src/main')
| -rw-r--r-- | sonar-css-plugin/src/main/java/org/sonar/css/plugin/MetricSensor.java | 142 | 
1 files changed, 90 insertions, 52 deletions
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 index 6257b74..1c635c7 100644 --- 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 @@ -20,7 +20,10 @@  package org.sonar.css.plugin;  import java.io.IOException; +import java.util.HashSet;  import java.util.List; +import java.util.Set; +  import org.sonar.api.batch.fs.FileSystem;  import org.sonar.api.batch.fs.InputFile;  import org.sonar.api.batch.sensor.Sensor; @@ -28,6 +31,9 @@ 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.measures.CoreMetrics; +import org.sonar.api.measures.FileLinesContext; +import org.sonar.api.measures.FileLinesContextFactory;  import org.sonar.api.utils.log.Logger;  import org.sonar.api.utils.log.Loggers; @@ -35,10 +41,16 @@ public class MetricSensor implements Sensor {    private static final Logger LOG = Loggers.get(MetricSensor.class); +  private final FileLinesContextFactory fileLinesContextFactory; + +  public MetricSensor(FileLinesContextFactory fileLinesContextFactory) { +    this.fileLinesContextFactory = fileLinesContextFactory; +  } +    @Override    public void describe(SensorDescriptor descriptor) {      descriptor -      .onlyOnLanguage(CssLanguage.KEY); +        .onlyOnLanguage(CssLanguage.KEY);    }    @Override @@ -48,72 +60,98 @@ public class MetricSensor implements Sensor {      Tokenizer tokenizer = new Tokenizer(); -    for (InputFile input : inputFiles) { -      saveHighlights(context, input, tokenizer); +    for (InputFile file : inputFiles) { +      try { +        List<CssToken> tokenList = tokenizer.tokenize(file.contents()); + +        saveHighlights(context, file, tokenList); +        saveLineTypes(context, file, tokenList); + +      } catch (IOException e) { +        LOG.error(String.format("Failed to read file '%s'", file.toString()), e); +      }      }    } -  private static void saveHighlights(SensorContext sensorContext, InputFile input, Tokenizer tokenizer) { -    try { -      NewHighlighting highlighting = sensorContext.newHighlighting().onFile(input); -      List<CssToken> tokenList = tokenizer.tokenize(input.contents()); +  private static void saveHighlights(SensorContext context, InputFile file, List<CssToken> tokenList) { +    NewHighlighting highlighting = context.newHighlighting().onFile(file); -      for (int i = 0; i < tokenList.size(); i++) { -        CssToken currentToken = tokenList.get(i); -        CssToken nextToken = i + 1 < tokenList.size() ? tokenList.get(i + 1) : null; +    for (int i = 0; i < tokenList.size(); i++) { +      CssToken currentToken = tokenList.get(i); +      CssToken nextToken = i + 1 < tokenList.size() ? tokenList.get(i + 1) : null; -        TypeOfText highlightingType = null; -        switch (currentToken.type) { -          case COMMENT: -            highlightingType = TypeOfText.COMMENT; -            break; +      TypeOfText highlightingType = null; +      switch (currentToken.type) { +        case COMMENT: +          highlightingType = TypeOfText.COMMENT; +          break; -          case STRING: -            highlightingType = TypeOfText.STRING; -            break; +        case STRING: +          highlightingType = TypeOfText.STRING; +          break; -          case NUMBER: -            highlightingType = TypeOfText.CONSTANT; -            break; +        case NUMBER: +          highlightingType = TypeOfText.CONSTANT; +          break; -          case AT_IDENTIFIER: -            highlightingType = TypeOfText.ANNOTATION; -            break; +        case AT_IDENTIFIER: +          highlightingType = TypeOfText.ANNOTATION; +          break; -          case DOLLAR_IDENTIFIER: +        case DOLLAR_IDENTIFIER: +          highlightingType = TypeOfText.KEYWORD; +          break; + +        case HASH_IDENTIFIER: +          if (currentToken.text.matches("^#[0-9a-fA-F]+$")) { +            highlightingType = TypeOfText.CONSTANT; +          } else {              highlightingType = TypeOfText.KEYWORD; -            break; - -          case HASH_IDENTIFIER: -            if (currentToken.text.matches("^#[0-9a-fA-F]+$")) { -              highlightingType = TypeOfText.CONSTANT; -            } else { -              highlightingType = TypeOfText.KEYWORD; -            } -            break; - -          case IDENTIFIER: -            // We want to highlight the property key of a css/scss/less file and as the tokenizer is putting the ':' into another token -            // we need to look for identifier followed by a PUNCTUATOR token with text ':'. -            if (nextToken != null && nextToken.text.equals(":")) { -              highlightingType = TypeOfText.KEYWORD_LIGHT; -            } -            break; - -          default: -            highlightingType = null; -        } +          } +          break; + +        case IDENTIFIER: +          // We want to highlight the property key of a css/scss/less file and as the tokenizer is putting the ':' into another token +          // we need to look for identifier followed by a PUNCTUATOR token with text ':'. +          if (nextToken != null && nextToken.text.equals(":")) { +            highlightingType = TypeOfText.KEYWORD_LIGHT; +          } +          break; + +        default: +          highlightingType = null; +      } -        if (highlightingType != null) { -          highlighting.highlight(currentToken.startLine, currentToken.startColumn, currentToken.endLine, currentToken.endColumn, highlightingType); -        } +      if (highlightingType != null) { +        highlighting.highlight(currentToken.startLine, currentToken.startColumn, currentToken.endLine, currentToken.endColumn, highlightingType);        } +    } -      highlighting.save(); +    highlighting.save(); +  } -    } catch (IOException e) { -      LOG.error(String.format("Failed to read file '%s'", input.toString()), e); +  private void saveLineTypes(SensorContext context, InputFile file, List<CssToken> tokenList) { +    // collect line types +    Set<Integer> linesOfCode = new HashSet<>(); +    Set<Integer> linesOfComment = new HashSet<>(); + +    for (CssToken token : tokenList) { +      for (int line = token.startLine; line <= token.endLine; line++) { +        if (token.type.equals(CssTokenType.COMMENT)) { +          linesOfComment.add(line); +        } else { +          linesOfCode.add(line); +        } +      }      } + +    context.<Integer>newMeasure().on(file).forMetric(CoreMetrics.NCLOC).withValue(linesOfCode.size()).save(); +    context.<Integer>newMeasure().on(file).forMetric(CoreMetrics.COMMENT_LINES).withValue(linesOfComment.size()).save(); + +    FileLinesContext fileLinesContext = fileLinesContextFactory.createFor(file); +    linesOfCode.forEach(line -> fileLinesContext.setIntValue(CoreMetrics.NCLOC_DATA_KEY, line, 1)); +    linesOfComment.forEach(line -> fileLinesContext.setIntValue(CoreMetrics.COMMENT_LINES_DATA_KEY, line, 1)); +    fileLinesContext.save();    }  }  | 
