11package api
22
33import (
4- "context"
54 "testing"
65
76 "github.com/microsoft/TypeScript/tsc/internal/bundled"
7+ "github.com/microsoft/TypeScript/tsc/internal/core"
8+ "github.com/microsoft/TypeScript/tsc/internal/ls/lsutil"
89 "github.com/microsoft/TypeScript/tsc/internal/testutil/projecttestutil"
910 "gotest.tools/v3/assert"
1011)
@@ -37,25 +38,23 @@ func TestCompletionSymbolTypeIsResolvable(t *testing.T) {
3738 }
3839 projectSession , _ := projecttestutil .Setup (files )
3940 defer projectSession .Close ()
40- session := NewSession (projectSession , nil )
41+ session := NewLSPSession (projectSession , nil )
4142 defer session .Close ()
4243
43- ctx := context .Background ()
44-
45- snapshotResp , err := session .handleUpdateSnapshot (ctx , & UpdateSnapshotParams {
44+ snapshotResp , err := session .handleUpdateSnapshot (t .Context (), & UpdateSnapshotParams {
4645 OpenFiles : []DocumentIdentifier {{FileName : fileName }},
4746 })
4847 assert .NilError (t , err )
4948
50- proj , err := session .handleGetDefaultProjectForFile (ctx , & GetDefaultProjectForFileParams {
49+ proj , err := session .handleGetDefaultProjectForFile (t . Context () , & GetDefaultProjectForFileParams {
5150 Snapshot : snapshotResp .Snapshot ,
5251 File : DocumentIdentifier {FileName : fileName },
5352 })
5453 assert .NilError (t , err )
5554 assert .Assert (t , proj != nil , "file should resolve to a default project" )
5655
5756 // content is pure ASCII, so the UTF-16 caret offset equals the byte length.
58- completions , err := session .handleGetCompletionsAtPosition (ctx , & GetCompletionsAtPositionParams {
57+ completions , err := session .handleGetCompletionsAtPosition (t . Context () , & GetCompletionsAtPositionParams {
5958 Snapshot : snapshotResp .Snapshot ,
6059 Project : proj .Id ,
6160 File : DocumentIdentifier {FileName : fileName },
@@ -73,7 +72,7 @@ func TestCompletionSymbolTypeIsResolvable(t *testing.T) {
7372 continue
7473 }
7574 sawSymbol = true
76- typeResp , err := session .handleGetTypeOfSymbol (ctx , & GetTypeOfSymbolParams {
75+ typeResp , err := session .handleGetTypeOfSymbol (t . Context () , & GetTypeOfSymbolParams {
7776 Snapshot : snapshotResp .Snapshot ,
7877 Project : proj .Id ,
7978 Symbol : entry .Symbol .Id ,
@@ -111,17 +110,15 @@ func TestCompletionOnInferredProject(t *testing.T) {
111110 }
112111 projectSession , _ := projecttestutil .Setup (files )
113112 defer projectSession .Close ()
114- session := NewSession (projectSession , nil )
113+ session := NewLSPSession (projectSession , nil )
115114 defer session .Close ()
116115
117- ctx := context .Background ()
118-
119- snapshotResp , err := session .handleUpdateSnapshot (ctx , & UpdateSnapshotParams {
116+ snapshotResp , err := session .handleUpdateSnapshot (t .Context (), & UpdateSnapshotParams {
120117 OpenFiles : []DocumentIdentifier {{FileName : fileName }},
121118 })
122119 assert .NilError (t , err )
123120
124- proj , err := session .handleGetDefaultProjectForFile (ctx , & GetDefaultProjectForFileParams {
121+ proj , err := session .handleGetDefaultProjectForFile (t . Context () , & GetDefaultProjectForFileParams {
125122 Snapshot : snapshotResp .Snapshot ,
126123 File : DocumentIdentifier {FileName : fileName },
127124 })
@@ -130,7 +127,7 @@ func TestCompletionOnInferredProject(t *testing.T) {
130127
131128 // This request previously panicked in setupLanguageService.
132129 // content is pure ASCII, so the UTF-16 caret offset equals the byte length.
133- completions , err := session .handleGetCompletionsAtPosition (ctx , & GetCompletionsAtPositionParams {
130+ completions , err := session .handleGetCompletionsAtPosition (t . Context () , & GetCompletionsAtPositionParams {
134131 Snapshot : snapshotResp .Snapshot ,
135132 Project : proj .Id ,
136133 File : DocumentIdentifier {FileName : fileName },
@@ -139,3 +136,52 @@ func TestCompletionOnInferredProject(t *testing.T) {
139136 assert .NilError (t , err )
140137 assert .Assert (t , completions != nil , "expected a completion list for array members" )
141138}
139+
140+ func TestCompletionRetriesWithAutoImports (t * testing.T ) {
141+ t .Parallel ()
142+ if ! bundled .Embedded {
143+ t .Skip ("bundled files are not embedded" )
144+ }
145+
146+ const fileName = "/home/projects/p/src/index.ts"
147+ const content = "someV"
148+ projectSession , _ := projecttestutil .Setup (map [string ]any {
149+ "/home/projects/p/tsconfig.json" : `{ "compilerOptions": { "module": "esnext", "target": "esnext" } }` ,
150+ "/home/projects/p/src/export.ts" : "export const someValue = 1;" ,
151+ fileName : content ,
152+ })
153+ defer projectSession .Close ()
154+ projectSession .Configure (lsutil.UserPreferences {
155+ IncludeCompletionsForModuleExports : core .TSTrue ,
156+ IncludeCompletionsForImportStatements : core .TSTrue ,
157+ })
158+
159+ session := NewLSPSession (projectSession , nil )
160+ defer session .Close ()
161+
162+ snapshotResp , err := session .handleUpdateSnapshot (t .Context (), & UpdateSnapshotParams {
163+ OpenFiles : []DocumentIdentifier {{FileName : fileName }},
164+ })
165+ assert .NilError (t , err )
166+ proj , err := session .handleGetDefaultProjectForFile (t .Context (), & GetDefaultProjectForFileParams {
167+ Snapshot : snapshotResp .Snapshot ,
168+ File : DocumentIdentifier {FileName : fileName },
169+ })
170+ assert .NilError (t , err )
171+ assert .Assert (t , proj != nil , "file should resolve to a default project" )
172+
173+ completions , err := session .handleGetCompletionsAtPosition (t .Context (), & GetCompletionsAtPositionParams {
174+ Snapshot : snapshotResp .Snapshot ,
175+ Project : proj .Id ,
176+ File : DocumentIdentifier {FileName : fileName },
177+ Position : uint32 (len (content )),
178+ })
179+ assert .NilError (t , err )
180+ assert .Assert (t , completions != nil , "expected a completion list" )
181+ for _ , entry := range completions .Entries {
182+ if entry .Name == "someValue" {
183+ return
184+ }
185+ }
186+ t .Fatal ("expected auto-import completion for someValue" )
187+ }
0 commit comments