@Override public int compareTo(TextPointer o) { if (this.line == o.line()) { return Integer.compare(this.lineOffset, o.lineOffset()); } return Integer.compare(this.line, o.line()); }
private void checkValid(TextPointer pointer, String owner) { Preconditions.checkArgument(pointer.line() >= 1, "%s is not a valid line for a file", pointer.line()); Preconditions.checkArgument(pointer.line() <= this.metadata.lines(), "%s is not a valid line for %s. File %s has %s line(s)", pointer.line(), owner, this, metadata.lines()); Preconditions.checkArgument(pointer.lineOffset() >= 0, "%s is not a valid line offset for a file", pointer.lineOffset()); int lineLength = lineLength(pointer.line()); Preconditions.checkArgument(pointer.lineOffset() <= lineLength, "%s is not a valid line offset for %s. File %s has %s character(s) at line %s", pointer.lineOffset(), owner, this, lineLength, pointer.line()); }
private static ScannerReport.TextRange toProtobufTextRange(ScannerReport.TextRange.Builder textRangeBuilder, TextRange primaryTextRange) { textRangeBuilder.clear(); textRangeBuilder.setStartLine(primaryTextRange.start().line()); textRangeBuilder.setStartOffset(primaryTextRange.start().lineOffset()); textRangeBuilder.setEndLine(primaryTextRange.end().line()); textRangeBuilder.setEndOffset(primaryTextRange.end().lineOffset()); return textRangeBuilder.build(); }
@Override public void store(DefaultSignificantCode significantCode) { ScannerReportWriter writer = reportPublisher.getWriter(); DefaultInputFile inputFile = (DefaultInputFile) significantCode.inputFile(); if (shouldSkipStorage(inputFile)) { return; } inputFile.setPublished(true); int componentRef = inputFile.scannerId(); if (writer.hasComponentData(FileStructure.Domain.SGNIFICANT_CODE, componentRef)) { throw new UnsupportedOperationException( "Trying to save significant code information twice for the same file is not supported: " + significantCode.inputFile()); } List<ScannerReport.LineSgnificantCode> protobuf = significantCode.significantCodePerLine().values().stream() .map(range -> ScannerReport.LineSgnificantCode.newBuilder() .setLine(range.start().line()) .setStartOffset(range.start().lineOffset()) .setEndOffset(range.end().lineOffset()) .build()) .collect(Collectors.toList()); writer.writeComponentSignificantCode(componentRef, protobuf); } }
@Test public void checkValidRangeUsingGlobalOffset() { Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {9, 15}, 16); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); TextRange newRange = file.newRange(10, 13); assertThat(newRange.start().line()).isEqualTo(2); assertThat(newRange.start().lineOffset()).isEqualTo(0); assertThat(newRange.end().line()).isEqualTo(2); assertThat(newRange.end().lineOffset()).isEqualTo(3); }
@Test public void checkValidPointerUsingGlobalOffset() { Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {8, 15}, 16); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); assertThat(file.newPointer(0).line()).isEqualTo(1); assertThat(file.newPointer(0).lineOffset()).isEqualTo(0); assertThat(file.newPointer(9).line()).isEqualTo(1); // Ignore eol characters assertThat(file.newPointer(9).lineOffset()).isEqualTo(8); assertThat(file.newPointer(10).line()).isEqualTo(2); assertThat(file.newPointer(10).lineOffset()).isEqualTo(0); assertThat(file.newPointer(15).line()).isEqualTo(2); assertThat(file.newPointer(15).lineOffset()).isEqualTo(5); assertThat(file.newPointer(16).line()).isEqualTo(2); // Ignore eol characters assertThat(file.newPointer(16).lineOffset()).isEqualTo(5); try { file.newPointer(-1); fail(); } catch (Exception e) { assertThat(e).hasMessage("-1 is not a valid offset for a file"); } try { file.newPointer(17); fail(); } catch (Exception e) { assertThat(e).hasMessage("17 is not a valid offset for file src/Foo.php. Max offset is 16"); } }
TextRange declaration = input.getKey(); builder.setDeclaration(rangeBuilder.setStartLine(declaration.start().line()) .setStartOffset(declaration.start().lineOffset()) .setEndLine(declaration.end().line()) .setEndOffset(declaration.end().lineOffset()) .build()); for (TextRange reference : input.getValue()) { builder.addReference(rangeBuilder.setStartLine(reference.start().line()) .setStartOffset(reference.start().lineOffset()) .setEndLine(reference.end().line()) .setEndOffset(reference.end().lineOffset()) .build());
@Test public void selectLine() { Metadata metadata = new FileMetadata().readMetadata(new StringReader("bla bla a\nabcde\n\nabc")); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); assertThat(file.selectLine(1).start().line()).isEqualTo(1); assertThat(file.selectLine(1).start().lineOffset()).isEqualTo(0); assertThat(file.selectLine(1).end().line()).isEqualTo(1); assertThat(file.selectLine(1).end().lineOffset()).isEqualTo(9); // Don't fail when selecting empty line assertThat(file.selectLine(3).start().line()).isEqualTo(3); assertThat(file.selectLine(3).start().lineOffset()).isEqualTo(0); assertThat(file.selectLine(3).end().line()).isEqualTo(3); assertThat(file.selectLine(3).end().lineOffset()).isEqualTo(0); try { file.selectLine(5); fail(); } catch (Exception e) { assertThat(e).hasMessage("5 is not a valid line for pointer. File src/Foo.php has 4 line(s)"); } }
@Override public void store(DefaultHighlighting highlighting) { ScannerReportWriter writer = reportPublisher.getWriter(); DefaultInputFile inputFile = (DefaultInputFile) highlighting.inputFile(); if (shouldSkipStorage(inputFile)) { return; } inputFile.setPublished(true); int componentRef = inputFile.scannerId(); if (writer.hasComponentData(FileStructure.Domain.SYNTAX_HIGHLIGHTINGS, componentRef)) { throw new UnsupportedOperationException("Trying to save highlighting twice for the same file is not supported: " + inputFile); } final ScannerReport.SyntaxHighlightingRule.Builder builder = ScannerReport.SyntaxHighlightingRule.newBuilder(); final ScannerReport.TextRange.Builder rangeBuilder = ScannerReport.TextRange.newBuilder(); writer.writeComponentSyntaxHighlighting(componentRef, highlighting.getSyntaxHighlightingRuleSet().stream() .map(input -> { builder.setRange(rangeBuilder.setStartLine(input.range().start().line()) .setStartOffset(input.range().start().lineOffset()) .setEndLine(input.range().end().line()) .setEndOffset(input.range().end().lineOffset()) .build()); builder.setType(ScannerReportUtils.toProtocolType(input.getTextType())); return builder.build(); }).collect(toList())); }
DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); assertThat(file.newPointer(1, 0).line()).isEqualTo(1); assertThat(file.newPointer(1, 0).lineOffset()).isEqualTo(0);
private static void createIssues(InputFile file, SensorContext context, String repo) { RuleKey ruleKey = RuleKey.of(repo, RULE_KEY); for (int line = 1; line <= file.lines(); line++) { TextRange text = file.selectLine(line); // do not count empty lines, which can be a pain with end-of-file return if (text.end().lineOffset() == 0) { continue; } NewIssue newIssue = context.newIssue(); newIssue .forRule(ruleKey) .at(newIssue.newLocation() .on(file) .at(text) .message("This bug issue is generated on each line")) .save(); } }
@Override public Integer getStartLineOffset() { return textRange != null ? textRange.start().lineOffset() : null; }
@Override public Integer getEndLineOffset() { return textRange != null ? textRange.end().lineOffset() : null; }
@Override public int compareTo(TextPointer o) { if (this.line == o.line()) { return Integer.compare(this.lineOffset, o.lineOffset()); } return Integer.compare(this.line, o.line()); }
private void checkValid(TextPointer pointer, String owner) { Preconditions.checkArgument(pointer.line() >= 1, "%s is not a valid line for a file", pointer.line()); Preconditions.checkArgument(pointer.line() <= this.metadata.lines(), "%s is not a valid line for %s. File %s has %s line(s)", pointer.line(), owner, this, metadata.lines()); Preconditions.checkArgument(pointer.lineOffset() >= 0, "%s is not a valid line offset for a file", pointer.lineOffset()); int lineLength = lineLength(pointer.line()); Preconditions.checkArgument(pointer.lineOffset() <= lineLength, "%s is not a valid line offset for %s. File %s has %s character(s) at line %s", pointer.lineOffset(), owner, this, lineLength, pointer.line()); }
@Override public void store(DefaultSignificantCode significantCode) { ScannerReportWriter writer = reportPublisher.getWriter(); DefaultInputFile inputFile = (DefaultInputFile) significantCode.inputFile(); if (shouldSkipStorage(inputFile)) { return; } inputFile.setPublished(true); int componentRef = inputFile.scannerId(); if (writer.hasComponentData(FileStructure.Domain.SGNIFICANT_CODE, componentRef)) { throw new UnsupportedOperationException( "Trying to save significant code information twice for the same file is not supported: " + significantCode.inputFile()); } List<ScannerReport.LineSgnificantCode> protobuf = significantCode.significantCodePerLine().values().stream() .map(range -> ScannerReport.LineSgnificantCode.newBuilder() .setLine(range.start().line()) .setStartOffset(range.start().lineOffset()) .setEndOffset(range.end().lineOffset()) .build()) .collect(Collectors.toList()); writer.writeComponentSignificantCode(componentRef, protobuf); } }
private static ScannerReport.TextRange toProtobufTextRange(ScannerReport.TextRange.Builder textRangeBuilder, TextRange primaryTextRange) { textRangeBuilder.clear(); textRangeBuilder.setStartLine(primaryTextRange.start().line()); textRangeBuilder.setStartOffset(primaryTextRange.start().lineOffset()); textRangeBuilder.setEndLine(primaryTextRange.end().line()); textRangeBuilder.setEndOffset(primaryTextRange.end().lineOffset()); return textRangeBuilder.build(); }
private org.sonar.batch.protocol.output.BatchReport.TextRange toProtobufTextRange(TextRange primaryTextRange) { textRangeBuilder.clear(); textRangeBuilder.setStartLine(primaryTextRange.start().line()); textRangeBuilder.setStartOffset(primaryTextRange.start().lineOffset()); textRangeBuilder.setEndLine(primaryTextRange.end().line()); textRangeBuilder.setEndOffset(primaryTextRange.end().lineOffset()); return textRangeBuilder.build(); }
@Override public BatchReport.SyntaxHighlighting apply(@Nonnull SyntaxHighlightingRule input) { builder.setRange(rangeBuilder.setStartLine(input.range().start().line()) .setStartOffset(input.range().start().lineOffset()) .setEndLine(input.range().end().line()) .setEndOffset(input.range().end().lineOffset()) .build()); builder.setType(BatchReportUtils.toProtocolType(input.getTextType())); return builder.build(); } }
private static void createIssues(InputFile file, SensorContext context, String repo) { RuleKey ruleKey = RuleKey.of(repo, RULE_KEY); for (int line = 1; line <= file.lines(); line++) { TextRange text = file.selectLine(line); // do not count empty lines, which can be a pain with end-of-file return if (text.end().lineOffset() == 0) { continue; } NewIssue newIssue = context.newIssue(); newIssue .forRule(ruleKey) .at(newIssue.newLocation() .on(file) .at(text) .message("This bug issue is generated on each line")) .save(); } }