public String offsetToString(ScannerReport.TextRange range, int lineIndex, int lineLength) { validateOffsetOrder(range, lineIndex); validateStartOffsetNotGreaterThanLineLength(range, lineLength, lineIndex); validateEndOffsetNotGreaterThanLineLength(range, lineLength, lineIndex); int startOffset = range.getStartLine() == lineIndex ? range.getStartOffset() : 0; int endOffset = range.getEndLine() == lineIndex ? range.getEndOffset() : lineLength; StringBuilder element = new StringBuilder(); if (startOffset < endOffset) { element.append(startOffset).append(OFFSET_SEPARATOR); element.append(endOffset); } return element.toString(); }
private void processHighlighting(Iterator<ScannerReport.SyntaxHighlightingRule> syntaxHighlightingIterator, StringBuilder highlighting, DbFileSources.Line.Builder lineBuilder) { ScannerReport.SyntaxHighlightingRule syntaxHighlighting = syntaxHighlightingIterator.next(); int line = lineBuilder.getLine(); ScannerReport.TextRange range = syntaxHighlighting.getRange(); if (range.getStartLine() <= line) { String offsets = rangeOffsetConverter.offsetToString(syntaxHighlighting.getRange(), line, lineBuilder.getSource().length()); if (offsets.isEmpty()) { if (range.getEndLine() == line) { syntaxHighlightingIterator.remove(); } } else { if (highlighting.length() > 0) { highlighting.append(SYMBOLS_SEPARATOR); } highlighting.append(offsets) .append(OFFSET_SEPARATOR) .append(getCssClass(syntaxHighlighting.getType())); if (range.getEndLine() == line) { syntaxHighlightingIterator.remove(); } } } }
private static void putForTextRange(SetMultimap<Integer, ScannerReport.Symbol> res, ScannerReport.Symbol symbol, ScannerReport.TextRange declaration) { for (int i = declaration.getStartLine(); i <= declaration.getEndLine(); i++) { res.put(i, symbol); } }
@Test public void testIntraFileDuplications() throws IOException { File srcDir = new File(baseDir, "src"); srcDir.mkdir(); String content = "Sample xoo\ncontent\nfoo\nbar\nSample xoo\ncontent\n"; File xooFile = new File(srcDir, "sample.xoo"); FileUtils.write(xooFile, content); AnalysisResult result = tester.newAnalysis() .properties(builder .put("sonar.sources", "src") .put("sonar.cpd.xoo.minimumTokens", "2") .put("sonar.cpd.xoo.minimumLines", "2") .put("sonar.verbose", "true") .build()) .execute(); InputFile inputFile = result.inputFile("src/sample.xoo"); // One clone group List<ScannerReport.Duplication> duplicationGroups = result.duplicationsFor(inputFile); assertThat(duplicationGroups).hasSize(1); ScannerReport.Duplication cloneGroup = duplicationGroups.get(0); assertThat(cloneGroup.getOriginPosition().getStartLine()).isEqualTo(1); assertThat(cloneGroup.getOriginPosition().getEndLine()).isEqualTo(2); assertThat(cloneGroup.getDuplicateList()).hasSize(1); assertThat(cloneGroup.getDuplicate(0).getRange().getStartLine()).isEqualTo(5); assertThat(cloneGroup.getDuplicate(0).getRange().getEndLine()).isEqualTo(6); }
@Test public void read_syntax_highlighting() { ScannerReportWriter writer = new ScannerReportWriter(dir); writer.writeMetadata(ScannerReport.Metadata.newBuilder() .setRootComponentRef(1) .build()); writer.writeComponent(ScannerReport.Component.newBuilder() .setRef(1).build()); writer.writeComponentSyntaxHighlighting(1, asList( ScannerReport.SyntaxHighlightingRule.newBuilder() .setRange(ScannerReport.TextRange.newBuilder() .setStartLine(1) .setEndLine(10) .build()) .setType(HighlightingType.ANNOTATION) .build())); try (CloseableIterator<ScannerReport.SyntaxHighlightingRule> it = underTest.readComponentSyntaxHighlighting(1)) { ScannerReport.SyntaxHighlightingRule syntaxHighlighting = it.next(); assertThat(syntaxHighlighting.getRange()).isNotNull(); assertThat(syntaxHighlighting.getRange().getStartLine()).isEqualTo(1); assertThat(syntaxHighlighting.getRange().getEndLine()).isEqualTo(10); assertThat(syntaxHighlighting.getType()).isEqualTo(HighlightingType.ANNOTATION); } }
public static TrackedIssue toTrackedIssue(InputComponent component, ScannerReport.Issue rawIssue, @Nullable SourceHashHolder hashes) { RuleKey ruleKey = RuleKey.of(rawIssue.getRuleRepository(), rawIssue.getRuleKey()); Preconditions.checkNotNull(component.key(), "Component key must be set"); Preconditions.checkNotNull(ruleKey, "Rule key must be set"); TrackedIssue issue = new TrackedIssue(hashes != null ? hashes.getHashedSource() : null); issue.setKey(Uuids.createFast()); issue.setComponentKey(component.key()); issue.setRuleKey(ruleKey); issue.setGap(rawIssue.getGap() != 0 ? rawIssue.getGap() : null); issue.setSeverity(rawIssue.getSeverity().name()); issue.setMessage(StringUtils.trimToNull(rawIssue.getMsg())); issue.setResolution(null); issue.setStatus(Issue.STATUS_OPEN); issue.setNew(true); if (rawIssue.hasTextRange()) { TextRange r = rawIssue.getTextRange(); issue.setStartLine(r.getStartLine()); issue.setStartLineOffset(r.getStartOffset()); issue.setEndLine(r.getEndLine()); issue.setEndLineOffset(r.getEndOffset()); } return issue; }
@Test public void testFlowWithSingleLocation() throws Exception { List<Issue> issues = result.issuesFor(result.inputFile("xources/hello/Multiple.xoo")); assertThat(issues).hasSize(1); Issue issue = issues.get(0); assertThat(issue.getMsg()).isEqualTo("Primary location"); assertThat(issue.getTextRange().getStartLine()).isEqualTo(6); assertThat(issue.getTextRange().getStartOffset()).isEqualTo(23); assertThat(issue.getTextRange().getEndLine()).isEqualTo(6); assertThat(issue.getTextRange().getEndOffset()).isEqualTo(50); assertThat(issue.getFlowList()).hasSize(1); Flow flow = issue.getFlow(0); assertThat(flow.getLocationList()).hasSize(1); IssueLocation additionalLocation = flow.getLocation(0); assertThat(additionalLocation.getMsg()).isEqualTo("Flow step #1"); assertThat(additionalLocation.getTextRange().getStartLine()).isEqualTo(7); assertThat(additionalLocation.getTextRange().getStartOffset()).isEqualTo(26); assertThat(additionalLocation.getTextRange().getEndLine()).isEqualTo(7); assertThat(additionalLocation.getTextRange().getEndOffset()).isEqualTo(53); }
private static boolean matchLine(ScannerReport.TextRange range, int line) { return range.getStartLine() <= line && range.getEndLine() >= line; }
private static TextRange toRange(InputFile file, ScannerReport.TextRange reportRange) { return file.newRange(file.newPointer(reportRange.getStartLine(), reportRange.getStartOffset()), file.newPointer(reportRange.getEndLine(), reportRange.getEndOffset())); }
private DetailedTextBlock convert(ScannerReport.TextRange textRange, int id) { return new DetailedTextBlock(id, textRange.getStartLine(), textRange.getEndLine()); } }
private TextBlock convert(ScannerReport.TextRange textRange) { return new TextBlock(textRange.getStartLine(), textRange.getEndLine()); } }
private static void validateEndOffsetNotGreaterThanLineLength(ScannerReport.TextRange range, int lineLength, int line) { checkExpression(range.getEndLine() != line || range.getEndOffset() <= lineLength, "End offset %s is defined outside the length (%s) of the line %s", range.getEndOffset(), lineLength, line); }
private static void validateOffsetOrder(ScannerReport.TextRange range, int line) { checkExpression(range.getStartLine() != range.getEndLine() || range.getStartOffset() <= range.getEndOffset(), "End offset %s cannot be defined before start offset %s on line %s", range.getEndOffset(), range.getStartOffset(), line); }
private void assertDuplication(Duplication d, int originStartLine, int originEndLine, @Nullable Integer otherFileRef, int rangeStartLine, int rangeEndLine) { assertThat(d.getOriginPosition().getStartLine()).isEqualTo(originStartLine); assertThat(d.getOriginPosition().getEndLine()).isEqualTo(originEndLine); assertThat(d.getDuplicateList()).hasSize(1); if (otherFileRef != null) { assertThat(d.getDuplicate(0).getOtherFileRef()).isEqualTo(otherFileRef); } else { assertThat(d.getDuplicate(0).getOtherFileRef()).isEqualTo(0); } assertThat(d.getDuplicate(0).getRange().getStartLine()).isEqualTo(rangeStartLine); assertThat(d.getDuplicate(0).getRange().getEndLine()).isEqualTo(rangeEndLine); }
private void assertDuplication(Duplication d, int originStartLine, int originEndLine, int numDuplicates) { assertThat(d.getOriginPosition().getStartLine()).isEqualTo(originStartLine); assertThat(d.getOriginPosition().getEndLine()).isEqualTo(originEndLine); assertThat(d.getDuplicateList()).hasSize(numDuplicates); }
private void assertDuplicate(Duplicate d, int otherFileRef, int rangeStartLine, int rangeEndLine) { assertThat(d.getOtherFileRef()).isEqualTo(otherFileRef); assertThat(d.getRange().getStartLine()).isEqualTo(rangeStartLine); assertThat(d.getRange().getEndLine()).isEqualTo(rangeEndLine); }
private DbCommons.TextRange.Builder convertTextRange(ScannerReport.TextRange sourceRange) { DbCommons.TextRange.Builder targetRange = DbCommons.TextRange.newBuilder(); targetRange.setStartLine(sourceRange.getStartLine()); targetRange.setStartOffset(sourceRange.getStartOffset()); targetRange.setEndLine(sourceRange.getEndLine()); targetRange.setEndOffset(sourceRange.getEndOffset()); return targetRange; } }
@Override public TextRange textRange() { if (!rawIssue.hasTextRange()) { return null; } return new DefaultTextRange( new DefaultTextPointer(rawIssue.getTextRange().getStartLine(), rawIssue.getTextRange().getStartOffset()), new DefaultTextPointer(rawIssue.getTextRange().getEndLine(), rawIssue.getTextRange().getEndOffset())); }
@Test public void testMultilineIssueRange() throws Exception { List<Issue> issues = result.issuesFor(result.inputFile("xources/hello/Multiline.xoo")); assertThat(issues).hasSize(1); Issue issue = issues.get(0); assertThat(issue.getMsg()).isEqualTo("Primary location"); assertThat(issue.getTextRange().getStartLine()).isEqualTo(6); assertThat(issue.getTextRange().getStartOffset()).isEqualTo(23); assertThat(issue.getTextRange().getEndLine()).isEqualTo(7); assertThat(issue.getTextRange().getEndOffset()).isEqualTo(23); }
@Test public void testIssueRange() throws Exception { List<Issue> issues = result.issuesFor(result.inputFile("xources/hello/Single.xoo")); assertThat(issues).hasSize(1); Issue issue = issues.get(0); assertThat(issue.getMsg()).isEqualTo("Primary location"); assertThat(issue.getTextRange().getStartLine()).isEqualTo(6); assertThat(issue.getTextRange().getStartOffset()).isEqualTo(23); assertThat(issue.getTextRange().getEndLine()).isEqualTo(6); assertThat(issue.getTextRange().getEndOffset()).isEqualTo(50); }