Skip to content

Commit cfb67ad

Browse files
authored
Generate LSP response types, redo nullable, delete aliases, statically type LSP handlers (#1441)
1 parent 2e8b060 commit cfb67ad

19 files changed

+2837
-1950
lines changed

internal/fourslash/baselineutil.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ type baselineFourslashLocationsOptions struct {
4949
additionalSpan *lsproto.Location
5050
}
5151

52-
func (f *FourslashTest) getBaselineForLocationsWithFileContents(spans []*lsproto.Location, options baselineFourslashLocationsOptions) string {
53-
return f.getBaselineForGroupedLocationsWithFileContents(collections.GroupBy(spans, func(span *lsproto.Location) lsproto.DocumentUri { return span.Uri }), options)
52+
func (f *FourslashTest) getBaselineForLocationsWithFileContents(spans []lsproto.Location, options baselineFourslashLocationsOptions) string {
53+
return f.getBaselineForGroupedLocationsWithFileContents(collections.GroupBy(spans, func(span lsproto.Location) lsproto.DocumentUri { return span.Uri }), options)
5454
}
5555

56-
func (f *FourslashTest) getBaselineForGroupedLocationsWithFileContents(groupedLocations *collections.MultiMap[lsproto.DocumentUri, *lsproto.Location], options baselineFourslashLocationsOptions) string {
56+
func (f *FourslashTest) getBaselineForGroupedLocationsWithFileContents(groupedLocations *collections.MultiMap[lsproto.DocumentUri, lsproto.Location], options baselineFourslashLocationsOptions) string {
5757
// We must always print the file containing the marker,
5858
// but don't want to print it twice at the end if it already
5959
// found in a file with ranges.
@@ -85,9 +85,9 @@ func (f *FourslashTest) getBaselineForGroupedLocationsWithFileContents(groupedLo
8585
foundMarker = true
8686
}
8787

88-
documentSpans := core.Map(locations, func(location *lsproto.Location) *documentSpan {
88+
documentSpans := core.Map(locations, func(location lsproto.Location) *documentSpan {
8989
return &documentSpan{
90-
Location: *location,
90+
Location: location,
9191
}
9292
})
9393
baselineEntries = append(baselineEntries, f.getBaselineContentForFile(path, content, documentSpans, nil, options))

internal/fourslash/fourslash.go

Lines changed: 54 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,8 @@ func (f *FourslashTest) initialize(t *testing.T, capabilities *lsproto.ClientCap
230230
params := &lsproto.InitializeParams{}
231231
params.Capabilities = getCapabilitiesWithDefaults(capabilities)
232232
// !!! check for errors?
233-
f.sendRequest(t, lsproto.MethodInitialize, params)
234-
f.sendNotification(t, lsproto.MethodInitialized, &lsproto.InitializedParams{})
233+
sendRequest(t, f, lsproto.InitializeInfo, params)
234+
sendNotification(t, f, lsproto.InitializedInfo, &lsproto.InitializedParams{})
235235
}
236236

237237
var (
@@ -267,20 +267,25 @@ func getCapabilitiesWithDefaults(capabilities *lsproto.ClientCapabilities) *lspr
267267
return &capabilitiesWithDefaults
268268
}
269269

270-
func (f *FourslashTest) sendRequest(t *testing.T, method lsproto.Method, params any) *lsproto.Message {
270+
func sendRequest[Params, Resp any](t *testing.T, f *FourslashTest, mapping lsproto.RequestInfo[Params, Resp], params Params) (*lsproto.Message, Resp, bool) {
271271
id := f.nextID()
272272
req := lsproto.NewRequestMessage(
273-
method,
273+
mapping.Method,
274274
lsproto.NewID(lsproto.IntegerOrString{Integer: &id}),
275275
params,
276276
)
277277
f.writeMsg(t, req.Message())
278-
return f.readMsg(t)
278+
resp := f.readMsg(t)
279+
if resp == nil {
280+
return nil, *new(Resp), false
281+
}
282+
result, ok := resp.AsResponse().Result.(Resp)
283+
return resp, result, ok
279284
}
280285

281-
func (f *FourslashTest) sendNotification(t *testing.T, method lsproto.Method, params any) {
286+
func sendNotification[Params any](t *testing.T, f *FourslashTest, info lsproto.NotificationInfo[Params], params Params) {
282287
notification := lsproto.NewNotificationMessage(
283-
method,
288+
info.Method,
284289
params,
285290
)
286291
f.writeMsg(t, notification.Message())
@@ -439,7 +444,7 @@ func (f *FourslashTest) openFile(t *testing.T, filename string) {
439444
t.Fatalf("File %s not found in test data", filename)
440445
}
441446
f.activeFilename = filename
442-
f.sendNotification(t, lsproto.MethodTextDocumentDidOpen, &lsproto.DidOpenTextDocumentParams{
447+
sendNotification(t, f, lsproto.TextDocumentDidOpenInfo, &lsproto.DidOpenTextDocumentParams{
443448
TextDocument: &lsproto.TextDocumentItem{
444449
Uri: ls.FileNameToDocumentURI(filename),
445450
LanguageId: getLanguageKind(filename),
@@ -553,17 +558,14 @@ func (f *FourslashTest) verifyCompletionsWorker(t *testing.T, expected *Completi
553558
TextDocumentPositionParams: f.currentTextDocumentPositionParams(),
554559
Context: &lsproto.CompletionContext{},
555560
}
556-
resMsg := f.sendRequest(t, lsproto.MethodTextDocumentCompletion, params)
561+
resMsg, result, resultOk := sendRequest(t, f, lsproto.TextDocumentCompletionInfo, params)
557562
if resMsg == nil {
558563
t.Fatalf(prefix+"Nil response received for completion request", f.lastKnownMarkerName)
559564
}
560-
result := resMsg.AsResponse().Result
561-
switch result := result.(type) {
562-
case *lsproto.CompletionList:
563-
f.verifyCompletionsResult(t, f.currentCaretPosition, result, expected, prefix)
564-
default:
565-
t.Fatalf(prefix+"Unexpected response type for completion request: %v", result)
565+
if !resultOk {
566+
t.Fatalf(prefix+"Unexpected response type for completion request: %T", resMsg.AsResponse().Result)
566567
}
568+
f.verifyCompletionsResult(t, f.currentCaretPosition, result.CompletionList, expected, prefix)
567569
}
568570

569571
func (f *FourslashTest) verifyCompletionsResult(
@@ -741,15 +743,14 @@ var completionIgnoreOpts = cmp.FilterPath(
741743

742744
func (f *FourslashTest) verifyCompletionItem(t *testing.T, prefix string, actual *lsproto.CompletionItem, expected *lsproto.CompletionItem) {
743745
if expected.Detail != nil || expected.Documentation != nil {
744-
response := f.sendRequest(t, lsproto.MethodCompletionItemResolve, actual)
745-
if response == nil {
746+
resMsg, result, resultOk := sendRequest(t, f, lsproto.CompletionItemResolveInfo, actual)
747+
if resMsg == nil {
746748
t.Fatal(prefix + "Expected non-nil response for completion item resolve, got nil")
747749
}
748-
resolvedItem, ok := response.AsResponse().Result.(*lsproto.CompletionItem)
749-
if !ok {
750-
t.Fatalf(prefix+"Expected response to be *lsproto.CompletionItem, got %T", response.AsResponse().Result)
750+
if !resultOk {
751+
t.Fatalf(prefix+"Unexpected response type for completion item resolve: %T", resMsg.AsResponse().Result)
751752
}
752-
actual = resolvedItem
753+
actual = result
753754
}
754755
assertDeepEqual(t, actual, expected, prefix, completionIgnoreOpts)
755756
if expected.Kind != nil {
@@ -808,28 +809,27 @@ func (f *FourslashTest) VerifyBaselineFindAllReferences(
808809
TextDocumentPositionParams: f.currentTextDocumentPositionParams(),
809810
Context: &lsproto.ReferenceContext{},
810811
}
811-
resMsg := f.sendRequest(t, lsproto.MethodTextDocumentReferences, params)
812+
resMsg, result, resultOk := sendRequest(t, f, lsproto.TextDocumentReferencesInfo, params)
812813
if resMsg == nil {
813814
if f.lastKnownMarkerName == nil {
814815
t.Fatalf("Nil response received for references request at pos %v", f.currentCaretPosition)
815816
} else {
816817
t.Fatalf("Nil response received for references request at marker '%s'", *f.lastKnownMarkerName)
817818
}
818819
}
819-
820-
result := resMsg.AsResponse().Result
821-
if resultAsLocation, ok := result.([]*lsproto.Location); ok {
822-
f.baseline.addResult("findAllReferences", f.getBaselineForLocationsWithFileContents(resultAsLocation, baselineFourslashLocationsOptions{
823-
marker: markerOrRange.GetMarker(),
824-
markerName: "/*FIND ALL REFS*/",
825-
}))
826-
} else {
820+
if !resultOk {
827821
if f.lastKnownMarkerName == nil {
828-
t.Fatalf("Unexpected references response type at pos %v: %T", f.currentCaretPosition, result)
822+
t.Fatalf("Unexpected references response type at pos %v: %T", f.currentCaretPosition, resMsg.AsResponse().Result)
829823
} else {
830-
t.Fatalf("Unexpected references response type at marker '%s': %T", *f.lastKnownMarkerName, result)
824+
t.Fatalf("Unexpected references response type at marker '%s': %T", *f.lastKnownMarkerName, resMsg.AsResponse().Result)
831825
}
832826
}
827+
828+
f.baseline.addResult("findAllReferences", f.getBaselineForLocationsWithFileContents(*result, baselineFourslashLocationsOptions{
829+
marker: markerOrRange.GetMarker(),
830+
markerName: "/*FIND ALL REFS*/",
831+
}))
832+
833833
}
834834

835835
baseline.Run(t, f.baseline.getBaselineFileName(), f.baseline.content.String(), baseline.Options{})
@@ -863,39 +863,38 @@ func (f *FourslashTest) VerifyBaselineGoToDefinition(
863863
params := &lsproto.DefinitionParams{
864864
TextDocumentPositionParams: f.currentTextDocumentPositionParams(),
865865
}
866-
resMsg := f.sendRequest(t, lsproto.MethodTextDocumentDefinition, params)
866+
867+
resMsg, result, resultOk := sendRequest(t, f, lsproto.TextDocumentDefinitionInfo, params)
867868
if resMsg == nil {
868869
if f.lastKnownMarkerName == nil {
869870
t.Fatalf("Nil response received for definition request at pos %v", f.currentCaretPosition)
870871
} else {
871872
t.Fatalf("Nil response received for definition request at marker '%s'", *f.lastKnownMarkerName)
872873
}
873874
}
874-
875-
result := resMsg.AsResponse().Result
876-
if resultAsLocOrLocations, ok := result.(*lsproto.LocationOrLocations); ok {
877-
var resultAsLocations []*lsproto.Location
878-
if resultAsLocOrLocations != nil {
879-
if resultAsLocOrLocations.Locations != nil {
880-
resultAsLocations = core.Map(*resultAsLocOrLocations.Locations, func(loc lsproto.Location) *lsproto.Location {
881-
return &loc
882-
})
883-
} else {
884-
resultAsLocations = []*lsproto.Location{resultAsLocOrLocations.Location}
885-
}
875+
if !resultOk {
876+
if f.lastKnownMarkerName == nil {
877+
t.Fatalf("Unexpected definition response type at pos %v: %T", f.currentCaretPosition, resMsg.AsResponse().Result)
878+
} else {
879+
t.Fatalf("Unexpected definition response type at marker '%s': %T", *f.lastKnownMarkerName, resMsg.AsResponse().Result)
886880
}
881+
}
887882

888-
f.baseline.addResult("goToDefinition", f.getBaselineForLocationsWithFileContents(resultAsLocations, baselineFourslashLocationsOptions{
889-
marker: markerOrRange.GetMarker(),
890-
markerName: "/*GO TO DEFINITION*/",
891-
}))
892-
} else {
893-
if f.lastKnownMarkerName == nil {
894-
t.Fatalf("Unexpected definition response type at pos %v: %T", f.currentCaretPosition, result)
883+
var resultAsLocations []lsproto.Location
884+
if result != nil {
885+
if result.Locations != nil {
886+
resultAsLocations = *result.Locations
887+
} else if result.Location != nil {
888+
resultAsLocations = []lsproto.Location{*result.Location}
895889
} else {
896-
t.Fatalf("Unexpected definition response type at marker '%s': %T", *f.lastKnownMarkerName, result)
890+
t.Fatalf("Unexpected definition response type at marker '%s': %T", *f.lastKnownMarkerName, result.DefinitionLinks)
897891
}
898892
}
893+
894+
f.baseline.addResult("goToDefinition", f.getBaselineForLocationsWithFileContents(resultAsLocations, baselineFourslashLocationsOptions{
895+
marker: markerOrRange.GetMarker(),
896+
markerName: "/*GO TO DEFINITION*/",
897+
}))
899898
}
900899

901900
baseline.Run(t, f.baseline.getBaselineFileName(), f.baseline.content.String(), baseline.Options{})
@@ -1069,14 +1068,14 @@ func (f *FourslashTest) editScript(t *testing.T, fileName string, start int, end
10691068
if err != nil {
10701069
panic(fmt.Sprintf("Failed to write file %s: %v", fileName, err))
10711070
}
1072-
f.sendNotification(t, lsproto.MethodTextDocumentDidChange, &lsproto.DidChangeTextDocumentParams{
1071+
sendNotification(t, f, lsproto.TextDocumentDidChangeInfo, &lsproto.DidChangeTextDocumentParams{
10731072
TextDocument: lsproto.VersionedTextDocumentIdentifier{
10741073
TextDocumentIdentifier: lsproto.TextDocumentIdentifier{
10751074
Uri: ls.FileNameToDocumentURI(fileName),
10761075
},
10771076
Version: script.version,
10781077
},
1079-
ContentChanges: []lsproto.TextDocumentContentChangeEvent{
1078+
ContentChanges: []lsproto.TextDocumentContentChangePartialOrTextDocumentContentChangeWholeDocument{
10801079
{
10811080
TextDocumentContentChangePartial: &lsproto.TextDocumentContentChangePartial{
10821081
Range: changeRange,

internal/ls/definition.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"github.com/microsoft/typescript-go/internal/scanner"
1212
)
1313

14-
func (l *LanguageService) ProvideDefinition(ctx context.Context, documentURI lsproto.DocumentUri, position lsproto.Position) (*lsproto.Definition, error) {
14+
func (l *LanguageService) ProvideDefinition(ctx context.Context, documentURI lsproto.DocumentUri, position lsproto.Position) (lsproto.DefinitionResponse, error) {
1515
program, file := l.getProgramAndFile(documentURI)
1616
node := astnav.GetTouchingPropertyName(file, int(l.converters.LineAndCharacterToPosition(file, position)))
1717
if node.Kind == ast.KindSourceFile {
@@ -84,7 +84,7 @@ func (l *LanguageService) ProvideDefinition(ctx context.Context, documentURI lsp
8484
return nil, nil
8585
}
8686

87-
func (l *LanguageService) ProvideTypeDefinition(ctx context.Context, documentURI lsproto.DocumentUri, position lsproto.Position) (*lsproto.Definition, error) {
87+
func (l *LanguageService) ProvideTypeDefinition(ctx context.Context, documentURI lsproto.DocumentUri, position lsproto.Position) (lsproto.DefinitionResponse, error) {
8888
program, file := l.getProgramAndFile(documentURI)
8989
node := astnav.GetTouchingPropertyName(file, int(l.converters.LineAndCharacterToPosition(file, position)))
9090
if node.Kind == ast.KindSourceFile {
@@ -126,7 +126,7 @@ func getDeclarationNameForKeyword(node *ast.Node) *ast.Node {
126126
return node
127127
}
128128

129-
func (l *LanguageService) createLocationsFromDeclarations(declarations []*ast.Node) *lsproto.Definition {
129+
func (l *LanguageService) createLocationsFromDeclarations(declarations []*ast.Node) lsproto.DefinitionResponse {
130130
someHaveBody := core.Some(declarations, func(node *ast.Node) bool { return node.Body() != nil })
131131
locations := make([]lsproto.Location, 0, len(declarations))
132132
for _, decl := range declarations {
@@ -139,11 +139,11 @@ func (l *LanguageService) createLocationsFromDeclarations(declarations []*ast.No
139139
})
140140
}
141141
}
142-
return &lsproto.Definition{Locations: &locations}
142+
return &lsproto.LocationOrLocationsOrDefinitionLinks{Locations: &locations}
143143
}
144144

145-
func (l *LanguageService) createLocationFromFileAndRange(file *ast.SourceFile, textRange core.TextRange) *lsproto.Definition {
146-
return &lsproto.Definition{
145+
func (l *LanguageService) createLocationFromFileAndRange(file *ast.SourceFile, textRange core.TextRange) lsproto.DefinitionResponse {
146+
return &lsproto.LocationOrLocationsOrDefinitionLinks{
147147
Location: &lsproto.Location{
148148
Uri: FileNameToDocumentURI(file.FileName()),
149149
Range: *l.createLspRangeFromBounds(textRange.Pos(), textRange.End(), file),

internal/ls/definition_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ func TestDefinition(t *testing.T) {
2222
testCases := []struct {
2323
title string
2424
input string
25-
expected map[string]lsproto.Definition
25+
expected map[string]lsproto.DefinitionResponse
2626
}{
2727
{
2828
title: "localFunction",
2929
input: `
3030
// @filename: index.ts
3131
function localFunction() { }
3232
/*localFunction*/localFunction();`,
33-
expected: map[string]lsproto.Definition{
33+
expected: map[string]lsproto.DefinitionResponse{
3434
"localFunction": {
3535
Locations: &[]lsproto.Location{{
3636
Uri: ls.FileNameToDocumentURI("/index.ts"),
@@ -49,7 +49,7 @@ function localFunction() { }
4949
}
5050
}
5151

52-
func runDefinitionTest(t *testing.T, input string, expected map[string]lsproto.Definition) {
52+
func runDefinitionTest(t *testing.T, input string, expected map[string]lsproto.DefinitionResponse) {
5353
testData := fourslash.ParseTestData(t, input, "/mainFile.ts")
5454
file := testData.Files[0].FileName()
5555
markerPositions := testData.MarkerPositions
@@ -69,6 +69,6 @@ func runDefinitionTest(t *testing.T, input string, expected map[string]lsproto.D
6969
ls.FileNameToDocumentURI(file),
7070
marker.LSPosition)
7171
assert.NilError(t, err)
72-
assert.DeepEqual(t, *locations, expectedResult)
72+
assert.DeepEqual(t, locations, expectedResult)
7373
}
7474
}

internal/ls/diagnostics.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import (
1010
"github.com/microsoft/typescript-go/internal/lsp/lsproto"
1111
)
1212

13-
func (l *LanguageService) GetDocumentDiagnostics(ctx context.Context, documentURI lsproto.DocumentUri) (*lsproto.DocumentDiagnosticReport, error) {
14-
program, file := l.getProgramAndFile(documentURI)
13+
func (l *LanguageService) ProvideDiagnostics(ctx context.Context, uri lsproto.DocumentUri) (lsproto.DocumentDiagnosticResponse, error) {
14+
program, file := l.getProgramAndFile(uri)
1515

1616
diagnostics := make([][]*ast.Diagnostic, 0, 3)
1717
if syntaxDiagnostics := program.GetSyntacticDiagnostics(ctx, file); len(syntaxDiagnostics) != 0 {
@@ -26,7 +26,7 @@ func (l *LanguageService) GetDocumentDiagnostics(ctx context.Context, documentUR
2626
}
2727
}
2828

29-
return &lsproto.DocumentDiagnosticReport{
29+
return lsproto.RelatedFullDocumentDiagnosticReportOrRelatedUnchangedDocumentDiagnosticReport{
3030
RelatedFullDocumentDiagnosticReport: &lsproto.RelatedFullDocumentDiagnosticReport{
3131
FullDocumentDiagnosticReport: lsproto.FullDocumentDiagnosticReport{
3232
Items: toLSPDiagnostics(l.converters, diagnostics...),

internal/ls/findallreferences.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ func getSymbolScope(symbol *ast.Symbol) *ast.Node {
396396

397397
// === functions on (*ls) ===
398398

399-
func (l *LanguageService) ProvideReferences(params *lsproto.ReferenceParams) []*lsproto.Location {
399+
func (l *LanguageService) ProvideReferences(params *lsproto.ReferenceParams) []lsproto.Location {
400400
// `findReferencedSymbols` except only computes the information needed to return reference locations
401401
program, sourceFile := l.getProgramAndFile(params.TextDocument.Uri)
402402
position := int(l.converters.LineAndCharacterToPosition(sourceFile, params.Position))
@@ -409,7 +409,7 @@ func (l *LanguageService) ProvideReferences(params *lsproto.ReferenceParams) []*
409409
return core.FlatMap(symbolsAndEntries, l.convertSymbolAndEntriesToLocations)
410410
}
411411

412-
func (l *LanguageService) ProvideImplementations(params *lsproto.ImplementationParams) []*lsproto.Location {
412+
func (l *LanguageService) ProvideImplementations(params *lsproto.ImplementationParams) []lsproto.Location {
413413
program, sourceFile := l.getProgramAndFile(params.TextDocument.Uri)
414414
position := int(l.converters.LineAndCharacterToPosition(sourceFile, params.Position))
415415
node := astnav.GetTouchingPropertyName(sourceFile, position)
@@ -437,19 +437,19 @@ func (l *LanguageService) getImplementationReferenceEntries(program *compiler.Pr
437437
}
438438

439439
// == functions for conversions ==
440-
func (l *LanguageService) convertSymbolAndEntriesToLocations(s *SymbolAndEntries) []*lsproto.Location {
440+
func (l *LanguageService) convertSymbolAndEntriesToLocations(s *SymbolAndEntries) []lsproto.Location {
441441
return l.convertEntriesToLocations(s.references)
442442
}
443443

444-
func (l *LanguageService) convertEntriesToLocations(entries []*referenceEntry) []*lsproto.Location {
445-
locations := make([]*lsproto.Location, len(entries))
444+
func (l *LanguageService) convertEntriesToLocations(entries []*referenceEntry) []lsproto.Location {
445+
locations := make([]lsproto.Location, len(entries))
446446
for i, entry := range entries {
447447
if entry.textRange == nil {
448448
sourceFile := ast.GetSourceFileOfNode(entry.node)
449449
entry.textRange = l.getRangeOfNode(entry.node, sourceFile, nil /*endNode*/)
450450
entry.fileName = sourceFile.FileName()
451451
}
452-
locations[i] = &lsproto.Location{
452+
locations[i] = lsproto.Location{
453453
Uri: FileNameToDocumentURI(entry.fileName),
454454
Range: *entry.textRange,
455455
}

internal/ls/findallreferences_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func runFindReferencesTest(t *testing.T, input string, expectedLocations map[str
3636
libReference := 0
3737

3838
for _, loc := range referencesResult {
39-
if name, ok := allExpectedLocations[*loc]; ok {
39+
if name, ok := allExpectedLocations[loc]; ok {
4040
// check if returned ref location is in this request's expected set
4141
assert.Assert(t, expectedSet.Has(name), "Reference to '%s' not expected when find all references requested at %s", name, requestMarkerName)
4242
} else if strings.Contains(string(loc.Uri), "//bundled") && strings.Contains(string(loc.Uri), "//libs") {

internal/ls/findallreferencesexport_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func (l *LanguageService) GetExpectedReferenceFromMarker(fileName string, pos in
1717
}
1818
}
1919

20-
func (l *LanguageService) TestProvideReferences(fileName string, pos int) []*lsproto.Location {
20+
func (l *LanguageService) TestProvideReferences(fileName string, pos int) []lsproto.Location {
2121
_, sourceFile := l.tryGetProgramAndFile(fileName)
2222
lsPos := l.converters.PositionToLineAndCharacter(sourceFile, core.TextPos(pos))
2323
return l.ProvideReferences(&lsproto.ReferenceParams{

0 commit comments

Comments
 (0)