Skip to content

Commit d61a7d2

Browse files
authored
[api] Skip disk-layout import diagnostics for customized module resolutions (#64638)
1 parent 09d4966 commit d61a7d2

4 files changed

Lines changed: 64 additions & 3 deletions

File tree

‎tsc/internal/api/module_resolution.go‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ func staticModuleResolutionToResolvedModule(staticResolution *StaticModuleResolu
188188
return nil
189189
}
190190
result := &module.ResolvedModule{
191-
ResolvedFileName: staticResolution.ResolvedFileName.ToFileName(currentDirectory),
191+
ResolvedFileName: staticResolution.ResolvedFileName.ToFileName(currentDirectory),
192+
IsCustomResolution: true,
192193
}
193194
if staticResolution.OriginalPath != nil {
194195
result.OriginalPath = staticResolution.OriginalPath.ToFileName(currentDirectory)

‎tsc/internal/api/session_module_resolution_test.go‎

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,65 @@ func TestCreateProgramUsesStaticModuleResolutions(t *testing.T) {
181181
assert.DeepEqual(t, fileNames, []tspath.RootedFilePath{provided, root})
182182
}
183183

184+
func TestCustomModuleResolutionsSkipUnsafeRewriteDiagnostic(t *testing.T) {
185+
t.Parallel()
186+
187+
const root = "/home/projects/p/src/a.ts"
188+
const staticTarget = "/home/projects/p/src/b.ts"
189+
const callbackTarget = "/home/projects/p/src/c.ts"
190+
projectSession, _ := projecttestutil.Setup(map[string]any{
191+
root: `import { b } from "./b.ts"; import { c } from "./c.ts"; export const a = b + c;`,
192+
staticTarget: `export const b = 1;`,
193+
callbackTarget: `export const c = 2;`,
194+
})
195+
defer projectSession.Close()
196+
session := NewLSPSession(projectSession, nil)
197+
defer session.Close()
198+
session.conn = &callbackTestConn{responses: map[string]json.Value{
199+
"resolveModuleName/1": json.Value(`{"resolvedFileName":"` + callbackTarget + `"}`),
200+
}}
201+
compilerOptions := func() core.CompilerOptions {
202+
return core.CompilerOptions{
203+
NoLib: core.TSTrue,
204+
Module: core.ModuleKindNodeNext,
205+
ModuleResolution: core.ModuleResolutionKindNodeNext,
206+
RewriteRelativeImportExtensions: core.TSTrue,
207+
OutDir: "/home/projects/p/out",
208+
}
209+
}
210+
resolver, err := session.handleCreateModuleResolver(&CreateModuleResolverParams{
211+
CompilerOptions: compilerOptions(),
212+
ModuleResolutions: &ModuleResolutionSpec{
213+
Fallback: ModuleResolutionFallbackResolve,
214+
Entries: []*ModuleResolutionEntry{
215+
staticResolutionEntry("./b.ts", "", nil, staticTarget),
216+
},
217+
},
218+
ResolveModuleNameCallback: "resolveModuleName/1",
219+
})
220+
assert.NilError(t, err)
221+
222+
response, err := session.handleCreateSnapshot(t.Context(), &CreateSnapshotParams{
223+
SnapshotRequestChangesParams: SnapshotRequestChangesParams{ //nolint:modernize
224+
CreatePrograms: []*CreateSnapshotProgramParams{{
225+
RootFiles: []DocumentIdentifier{{FileName: root}, {FileName: staticTarget}, {FileName: callbackTarget}},
226+
CompilerOptions: compilerOptions(),
227+
Options: &CreateProgramOptions{ModuleResolver: resolver},
228+
}},
229+
},
230+
})
231+
assert.NilError(t, err)
232+
diagnostics, err := session.handleGetSemanticDiagnostics(t.Context(), &GetDiagnosticsParams{
233+
Snapshot: response.Snapshot,
234+
Project: (*response.Operation.CreatedPrograms)[0].AsID(),
235+
Files: []DocumentIdentifier{{FileName: root}},
236+
})
237+
assert.NilError(t, err)
238+
for _, diagnostic := range diagnostics {
239+
t.Errorf("handleGetSemanticDiagnostics(%s) reported TS%d at %d: %s", root, diagnostic.Code, diagnostic.Pos, diagnostic.Text)
240+
}
241+
}
242+
184243
func TestStaticModuleResolutionPreservesStaticIdentity(t *testing.T) {
185244
t.Parallel()
186245

‎tsc/internal/checker/checker.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15529,7 +15529,7 @@ func (c *Checker) resolveExternalModule(
1552915529
c.error(errorNode, resolutionDiagnostic, moduleReference, resolvedModule.ResolvedFileName)
1553015530
}
1553115531

15532-
if errorNode != nil {
15532+
if errorNode != nil && !resolvedModule.IsCustomResolution {
1553315533
if resolvedModule.ResolvedUsingTsExtension && tspath.IsDeclarationFileName(moduleReference) {
1553415534
if ast.FindAncestor(location, ast.IsEmittableImport) != nil {
1553515535
tsExtension := tspath.TryExtractTSExtension(moduleReference)

‎tsc/internal/module/types.go‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@ type ResolvedModule struct {
9292
Extension string
9393
ResolvedUsingTsExtension bool
9494
ResolvedUsingExtraExtensions bool
95-
PackageId PackageId
9695
IsExternalLibraryImport bool
96+
IsCustomResolution bool
97+
PackageId PackageId
9798
AlternateResult tspath.RootedFilePath
9899
}
99100

0 commit comments

Comments
 (0)