func()

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
}