in src/ulsp/controller/scip/scip.go [555:595]
func (c *controller) gotoDefinition(ctx context.Context, params *protocol.DefinitionParams, result *[]protocol.LocationLink) error {
sesh, err := c.sessions.GetFromContext(ctx)
if err != nil {
return err
}
reg := c.registries[sesh.WorkspaceRoot]
if reg == nil {
return nil
}
mappedPosition, err := c.getBasePosition(ctx, params.TextDocument, params.Position)
if err != nil {
return err
} else if mappedPosition == nil {
return nil
}
originOcc, definitionOcc, err := reg.Definition(params.TextDocument.URI, *mappedPosition)
if err != nil {
return fmt.Errorf("failed to get definition: %w", err)
}
if definitionOcc != nil {
l := protocol.LocationLink{
TargetURI: definitionOcc.Location,
}
if definitionOcc.Occurrence != nil {
rng := c.getLatestRange(ctx, protocol.TextDocumentIdentifier{URI: definitionOcc.Location}, mapper.ScipToProtocolRange(definitionOcc.Occurrence.Range))
l.TargetRange = rng
l.TargetSelectionRange = rng
}
if originOcc != nil {
rng := c.getLatestRange(ctx, protocol.TextDocumentIdentifier{URI: params.TextDocument.URI}, mapper.ScipToProtocolRange(originOcc.Occurrence.Range))
l.OriginSelectionRange = &rng
}
*result = append(*result, l)
}
return nil
}