private void processSymbols(DbFileSources.Line.Builder lineBuilder) { int line = lineBuilder.getLine(); List<ScannerReport.Symbol> lineSymbols = new ArrayList<>(this.symbolsPerLine.get(line)); // Sort symbols to have deterministic results and avoid false variation that would lead to an unnecessary update of the source files // data lineSymbols.sort(SymbolsComparator.INSTANCE); StringBuilder symbolString = new StringBuilder(); for (ScannerReport.Symbol lineSymbol : lineSymbols) { int symbolId = idsBySymbol.get(lineSymbol); appendSymbol(symbolString, lineSymbol.getDeclaration(), line, symbolId, lineBuilder.getSource()); for (ScannerReport.TextRange range : lineSymbol.getReferenceList()) { appendSymbol(symbolString, range, line, symbolId, lineBuilder.getSource()); } } if (symbolString.length() > 0) { lineBuilder.setSymbols(symbolString.toString()); } }
private static SetMultimap<Integer, ScannerReport.Symbol> buildSymbolsPerLine(List<ScannerReport.Symbol> symbols) { SetMultimap<Integer, ScannerReport.Symbol> res = HashMultimap.create(); for (ScannerReport.Symbol symbol : symbols) { putForTextRange(res, symbol, symbol.getDeclaration()); for (ScannerReport.TextRange textRange : symbol.getReferenceList()) { putForTextRange(res, symbol, textRange); } } return res; }
@Override public int compare(ScannerReport.Symbol o1, ScannerReport.Symbol o2) { if (o1.getDeclaration().getStartLine() == o2.getDeclaration().getStartLine()) { return Integer.compare(o1.getDeclaration().getStartOffset(), o2.getDeclaration().getStartOffset()); } else { return Integer.compare(o1.getDeclaration().getStartLine(), o2.getDeclaration().getStartLine()); } } }
/** * Get list of all start positions of a symbol in an inputfile * * @param symbolStartLine 0-based start offset for the symbol in file * @param symbolStartLineOffset 0-based end offset for the symbol in file */ @CheckForNull public List<ScannerReport.TextRange> symbolReferencesFor(InputFile file, int symbolStartLine, int symbolStartLineOffset) { int ref = ((DefaultInputComponent) file).scannerId(); try (CloseableIterator<Symbol> symbols = getReportReader().readComponentSymbols(ref)) { while (symbols.hasNext()) { Symbol symbol = symbols.next(); if (symbol.getDeclaration().getStartLine() == symbolStartLine && symbol.getDeclaration().getStartOffset() == symbolStartLineOffset) { return symbol.getReferenceList(); } } } return Collections.emptyList(); }
private void processSymbols(DbFileSources.Line.Builder lineBuilder) { int line = lineBuilder.getLine(); List<ScannerReport.Symbol> lineSymbols = new ArrayList<>(this.symbolsPerLine.get(line)); // Sort symbols to have deterministic results and avoid false variation that would lead to an unnecessary update of the source files // data Collections.sort(lineSymbols, SymbolsComparator.INSTANCE); StringBuilder symbolString = new StringBuilder(); for (ScannerReport.Symbol lineSymbol : lineSymbols) { int symbolId = idsBySymbol.get(lineSymbol); appendSymbol(symbolString, lineSymbol.getDeclaration(), line, symbolId, lineBuilder.getSource()); for (ScannerReport.TextRange range : lineSymbol.getReferenceList()) { appendSymbol(symbolString, range, line, symbolId, lineBuilder.getSource()); } } if (symbolString.length() > 0) { lineBuilder.setSymbols(symbolString.toString()); } }
@Override public int compare(ScannerReport.Symbol o1, ScannerReport.Symbol o2) { if (o1.getDeclaration().getStartLine() == o2.getDeclaration().getStartLine()) { return Integer.compare(o1.getDeclaration().getStartOffset(), o2.getDeclaration().getStartOffset()); } else { return Integer.compare(o1.getDeclaration().getStartLine(), o2.getDeclaration().getStartLine()); } } }
private static SetMultimap<Integer, ScannerReport.Symbol> buildSymbolsPerLine(List<ScannerReport.Symbol> symbols) { SetMultimap<Integer, ScannerReport.Symbol> res = HashMultimap.create(); for (ScannerReport.Symbol symbol : symbols) { putForTextRange(res, symbol, symbol.getDeclaration()); for (ScannerReport.TextRange textRange : symbol.getReferenceList()) { putForTextRange(res, symbol, textRange); } } return res; }
/** * Get list of all start positions of a symbol in an inputfile * * @param symbolStartLine 0-based start offset for the symbol in file * @param symbolStartLineOffset 0-based end offset for the symbol in file */ @CheckForNull public List<ScannerReport.TextRange> symbolReferencesFor(InputFile file, int symbolStartLine, int symbolStartLineOffset) { int ref = ((DefaultInputComponent) file).scannerId(); try (CloseableIterator<Symbol> symbols = getReportReader().readComponentSymbols(ref)) { while (symbols.hasNext()) { Symbol symbol = symbols.next(); if (symbol.getDeclaration().getStartLine() == symbolStartLine && symbol.getDeclaration().getStartOffset() == symbolStartLineOffset) { return symbol.getReferenceList(); } } } return Collections.emptyList(); }