func()

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
}