-
Notifications
You must be signed in to change notification settings - Fork 675
Support LocationLink in go-to-definition with default enablement #1490
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
- Add client capability checking for DefinitionClientCapabilities.LinkSupport - Modify ProvideDefinition to accept client capabilities parameter - Create createDefinitionResponse function to decide between LocationLink[] and Location[] - Implement createLocationLinksFromDeclarations with proper origin selection range - Update fourslash test infrastructure to handle DefinitionLinks gracefully - Add helper function getDefinitionClientCapabilities in server - Ensure backward compatibility with existing Location[] responses Co-authored-by: DanielRosenwasser <972891+DanielRosenwasser@users.noreply.github.com>
- Created TestLocationLinkEndToEnd to validate full functionality - Test uses client capabilities with LinkSupport enabled - Verifies that cross-file go-to-definition works with LocationLink format - Demonstrates proper integration between server, client capabilities, and definition provider Co-authored-by: DanielRosenwasser <972891+DanielRosenwasser@users.noreply.github.com>
LocationLink
in go-to-definitionThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Get rid of this test, we have coverage elsewhere.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed the test as requested. Commit 694ad3b.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Get rid of this test, it's not a language service test.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed the compiler test as requested. Commit 694ad3b.
internal/fourslash/fourslash.go
Outdated
@@ -891,7 +891,14 @@ func (f *FourslashTest) VerifyBaselineGoToDefinition( | |||
} else if result.Location != nil { | |||
resultAsLocations = []lsproto.Location{*result.Location} | |||
} else if result.DefinitionLinks != nil { | |||
t.Fatalf("Unexpected definition response type at marker '%s': %T", *f.lastKnownMarkerName, result.DefinitionLinks) | |||
// Convert DefinitionLinks to Locations for baseline comparison | |||
resultAsLocations = make([]lsproto.Location, len(*result.DefinitionLinks)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The right thing is not to normalize to Location
s. Instead, what the original code did was roughly checking if there was a single result, and if so, set the appropriate additionalSpan
for getBaselineContentForFile
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed the normalization logic to use additionalSpan for single DefinitionLink results instead of converting to Locations. Now properly sets the origin selection range as additionalSpan for baseline comparison. Commit 694ad3b.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay, but switch this to use core.Map
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Switched to use core.Map
instead of manual loop. Commit 0abc02d.
@copilot address feedback. |
…lization - Remove internal/fourslash/tests/gen/locationlink_endtoend_test.go (coverage exists elsewhere) - Remove testdata/tests/cases/compiler/gotoDefinitionLocationLink.ts (not a language service test) - Fix fourslash.go to properly handle DefinitionLinks by setting additionalSpan instead of normalizing to Locations - When single DefinitionLink with origin selection range, use it as additionalSpan for baseline comparison Co-authored-by: DanielRosenwasser <972891+DanielRosenwasser@users.noreply.github.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good foundation, but you need to enable the default capabilities for definition requests and update the baselines.
internal/fourslash/fourslash.go
Outdated
@@ -891,7 +891,14 @@ func (f *FourslashTest) VerifyBaselineGoToDefinition( | |||
} else if result.Location != nil { | |||
resultAsLocations = []lsproto.Location{*result.Location} | |||
} else if result.DefinitionLinks != nil { | |||
t.Fatalf("Unexpected definition response type at marker '%s': %T", *f.lastKnownMarkerName, result.DefinitionLinks) | |||
// Convert DefinitionLinks to Locations for baseline comparison | |||
resultAsLocations = make([]lsproto.Location, len(*result.DefinitionLinks)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay, but switch this to use core.Map
@copilot address feedback |
Co-authored-by: DanielRosenwasser <972891+DanielRosenwasser@users.noreply.github.com>
Default LinkSupport capabilities enabled and baselines updated. Commit 0abc02d. |
This PR implements support for
LocationLink
in go-to-definition requests as specified in LSP 3.14.0+, with LocationLinks enabled by default to provide enhanced navigation experience out of the box.Key Features
Enhanced Definition Response:
The
LocationLink
type provides richer information compared to basicLocation
:originSelectionRange
: The span of the queried symbol (bound span for highlighting during interaction)targetRange
: Full declaration range including body and commentstargetSelectionRange
: Precise name/identifier location for navigationDefault Enablement:
LocationLink support is now enabled by default when clients don't specify definition capabilities, ensuring users get the enhanced experience without requiring explicit client configuration. Clients can still opt out by explicitly setting
linkSupport: false
.Example Enhancement:
This enables editors to provide enhanced UX like highlighting the origin span during mouse interaction and showing the full context of target declarations.
Fixes #1439.
💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.