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(); } } } }
@Test public void write_syntax_highlighting() { // no data yet assertThat(underTest.hasComponentData(FileStructure.Domain.SYNTAX_HIGHLIGHTINGS, 1)).isFalse(); underTest.writeComponentSyntaxHighlighting(1, asList( ScannerReport.SyntaxHighlightingRule.newBuilder() .setRange(ScannerReport.TextRange.newBuilder() .setStartLine(1) .setEndLine(1) .build()) .setType(HighlightingType.ANNOTATION) .build())); assertThat(underTest.hasComponentData(FileStructure.Domain.SYNTAX_HIGHLIGHTINGS, 1)).isTrue(); }
@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())); }
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(); } } } }
/** * Get highlighting types at a given position in an inputfile * * @param lineOffset 0-based offset in file */ public List<TypeOfText> highlightingTypeFor(InputFile file, int line, int lineOffset) { int ref = ((DefaultInputComponent) file).scannerId(); if (!reader.hasSyntaxHighlighting(ref)) { return Collections.emptyList(); } TextPointer pointer = file.newPointer(line, lineOffset); List<TypeOfText> result = new ArrayList<>(); try (CloseableIterator<ScannerReport.SyntaxHighlightingRule> it = reader.readComponentSyntaxHighlighting(ref)) { while (it.hasNext()) { ScannerReport.SyntaxHighlightingRule rule = it.next(); TextRange ruleRange = toRange(file, rule.getRange()); if (ruleRange.start().compareTo(pointer) <= 0 && ruleRange.end().compareTo(pointer) > 0) { result.add(ScannerReportUtils.toBatchType(rule.getType())); } } } catch (Exception e) { throw new IllegalStateException("Can't read syntax highlighting for " + file, e); } return result; }
@CheckForNull private ScannerReport.SyntaxHighlightingRule getNextHighlightingMatchingLine(int line) { // Get next element (if exists) if (currentItem == null && lineHighlightingIterator.hasNext()) { currentItem = lineHighlightingIterator.next(); } // Return current element if lines match if (currentItem != null && currentItem.getRange().getStartLine() == line) { return currentItem; } return null; }
public CloseableIterator<ScannerReport.SyntaxHighlightingRule> readComponentSyntaxHighlighting(int fileRef) { File file = fileStructure.fileFor(FileStructure.Domain.SYNTAX_HIGHLIGHTINGS, fileRef); if (fileExists(file)) { return Protobuf.readStream(file, ScannerReport.SyntaxHighlightingRule.parser()); } return emptyCloseableIterator(); }
@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); } }
@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())); }
/** * Get highlighting types at a given position in an inputfile * * @param lineOffset 0-based offset in file */ public List<TypeOfText> highlightingTypeFor(InputFile file, int line, int lineOffset) { int ref = ((DefaultInputComponent) file).scannerId(); if (!reader.hasSyntaxHighlighting(ref)) { return Collections.emptyList(); } TextPointer pointer = file.newPointer(line, lineOffset); List<TypeOfText> result = new ArrayList<>(); try (CloseableIterator<ScannerReport.SyntaxHighlightingRule> it = reader.readComponentSyntaxHighlighting(ref)) { while (it.hasNext()) { ScannerReport.SyntaxHighlightingRule rule = it.next(); TextRange ruleRange = toRange(file, rule.getRange()); if (ruleRange.start().compareTo(pointer) <= 0 && ruleRange.end().compareTo(pointer) > 0) { result.add(ScannerReportUtils.toBatchType(rule.getType())); } } } catch (Exception e) { throw new IllegalStateException("Can't read syntax highlighting for " + file, e); } return result; }
private void addHighlighting(List<ScannerReport.SyntaxHighlightingRule> syntaxHighlightingList, int startLine, int startOffset, int endLine, int endOffset, HighlightingType type) { TextRange.Builder textRangeBuilder = TextRange.newBuilder(); ScannerReport.SyntaxHighlightingRule.Builder ruleBuilder = ScannerReport.SyntaxHighlightingRule.newBuilder(); syntaxHighlightingList.add(ruleBuilder .setRange(textRangeBuilder .setStartLine(startLine).setEndLine(endLine) .setStartOffset(startOffset).setEndOffset(endOffset) .build()) .setType(type) .build()); }
@CheckForNull private ScannerReport.SyntaxHighlightingRule getNextHighlightingMatchingLine(int line) { // Get next element (if exists) if (currentItem == null && lineHighlightingIterator.hasNext()) { currentItem = lineHighlightingIterator.next(); } // Return current element if lines match if (currentItem != null && currentItem.getRange().getStartLine() == line) { return currentItem; } return null; }
private HighlightingLineReader newReader(Map<TextRange, HighlightingType> textRangeByType) { List<ScannerReport.SyntaxHighlightingRule> syntaxHighlightingList = new ArrayList<>(); for (Map.Entry<TextRange, HighlightingType> entry : textRangeByType.entrySet()) { syntaxHighlightingList.add(ScannerReport.SyntaxHighlightingRule.newBuilder() .setRange(entry.getKey()) .setType(entry.getValue()) .build()); } return new HighlightingLineReader(FILE, syntaxHighlightingList.iterator(), rangeOffsetConverter); }
public CloseableIterator<ScannerReport.SyntaxHighlightingRule> readComponentSyntaxHighlighting(int fileRef) { File file = fileStructure.fileFor(FileStructure.Domain.SYNTAX_HIGHLIGHTINGS, fileRef); if (fileExists(file)) { return Protobuf.readStream(file, ScannerReport.SyntaxHighlightingRule.parser()); } return emptyCloseableIterator(); }