in src/scip-lib/registry/partial_registry.go [101:167]
func (p *partialScipRegistry) Definition(sourceURI uri.URI, pos protocol.Position) (sourceSymOcc *model.SymbolOccurrence, defSymOcc *model.SymbolOccurrence, err error) {
doc, err := p.Index.LoadDocument(p.uriToRelativePath(sourceURI))
if err != nil {
p.logger.Errorf("failed to load document %s: %s", p.uriToRelativePath(sourceURI), err)
return nil, nil, err
}
if doc == nil {
return nil, nil, nil
}
var sourceOccurrence *model.Occurrence
var definitionOcc *model.Occurrence
var symbolInformation *model.SymbolInformation
var defDocURI uri.URI
sourceOccurrence = utils.GetOccurrenceForPosition(doc.Occurrences, pos)
if sourceOccurrence == nil {
return nil, nil, nil
}
if scip.IsLocalSymbol(sourceOccurrence.Symbol) {
// Local symbols are file unique, so we can just return the first definition occurrence
definitionOccs := utils.GetOccurrencesForSymbol(doc.Occurrences, sourceOccurrence.Symbol, scip.SymbolRole_Definition)
if len(definitionOccs) > 0 {
definitionOcc = definitionOccs[0]
defDocURI = sourceURI
}
// A local symbol may not have SymbolInformation
symbolInformation = utils.GetLocalSymbolInformation(doc.Symbols, sourceOccurrence.Symbol)
} else {
// Descriptor-based lookup in the prefix tree for global symbols.
symbol, err := model.ParseScipSymbol(sourceOccurrence.Symbol)
if err != nil {
p.logger.Errorf("failed to parse symbol %s: %s", sourceOccurrence.Symbol, err)
return nil, nil, err
}
def, err := p.GetSymbolDefinitionOccurrence(mapper.ScipDescriptorsToModelDescriptors(symbol.Descriptors), symbol.Package.Version)
if err != nil {
p.logger.Errorf("failed to get symbol definition occurrence for %s: %s", sourceOccurrence.Symbol, err)
return nil, nil, err
} else if def == nil {
p.logger.Errorf("failed to get symbol definition occurrence for %s: %s", sourceOccurrence.Symbol, err)
return nil, nil, nil
}
definitionOcc = def.Occurrence
defDocURI = def.Location
symbolInformation = def.Info
}
sourceSymOcc = &model.SymbolOccurrence{
Info: symbolInformation,
Occurrence: sourceOccurrence,
Location: sourceURI,
}
defSymOcc = &model.SymbolOccurrence{
Info: symbolInformation,
Occurrence: definitionOcc,
Location: defDocURI,
}
return sourceSymOcc, defSymOcc, nil
}