in tools/languageserver/src/main/java/com/google/cloud/verticals/foundations/dataharmonization/lsp/SymbolLookup.java [121:167]
ImmutableList<Location> fetchLocationFromPosition(
String documentUri, int lineNumber, int columnPosition, Set<String> documentImportURIs) {
SymbolWithPosition referenceSymbol =
documentUriToReferenceSymbols.get(documentUri).stream()
.filter(
symbolSourceReference ->
lineAndColumnInSource(
symbolSourceReference.getZeroBasedSource(), lineNumber, columnPosition))
.min(this::compareSymbolRefSize)
.orElse(null);
if (referenceSymbol == null) {
// Try searching through write symbols
SymbolWithPosition writeSymbol =
documentUriToWriteSymbols.get(documentUri).stream()
.filter(
symbolSourceReference ->
lineAndColumnInSource(
symbolSourceReference.getZeroBasedSource(), lineNumber, columnPosition))
.min(this::compareSymbolRefSize)
.orElse(null);
if (writeSymbol != null) {
// Search through both other write and definition symbols for this write symbol
ImmutableList<Location> foundDefSymbol =
searchSymbolCollection(
documentUriToDefinitionSymbols.get(documentUri), writeSymbol, lineNumber);
return !foundDefSymbol.isEmpty()
? foundDefSymbol
: searchSymbolCollection(
documentUriToWriteSymbols.get(documentUri), writeSymbol, lineNumber);
}
// Nothing found, no symbols at this location.
logger.atInfo().log("No symbol found at position %s:%s", lineNumber, columnPosition);
return ImmutableList.of();
}
// Search through both write and definition symbols for the reference symbol
ImmutableList<Location> foundWriteSymbol =
searchSymbolCollection(
documentUriToWriteSymbols.get(documentUri), referenceSymbol, lineNumber);
// If no write symbols are found in the current file, we search through all definition symbols
// in the current file, and any imports it includes.
return !foundWriteSymbol.isEmpty()
? foundWriteSymbol
: searchDefinitionSymbols(documentUri, referenceSymbol, documentImportURIs, lineNumber);
}