diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs index 811587a8dd..57e48fbc3a 100644 --- a/cli/lsp/documents.rs +++ b/cli/lsp/documents.rs @@ -153,7 +153,7 @@ impl AssetOrDocument { pub fn scope(&self) -> Option<&ModuleSpecifier> { match self { - AssetOrDocument::Asset(_) => None, + AssetOrDocument::Asset(asset_doc) => Some(asset_doc.specifier()), AssetOrDocument::Document(doc) => doc.scope(), } } diff --git a/cli/tsc/99_main_compiler.js b/cli/tsc/99_main_compiler.js index 4fba5449fc..75c6f8117e 100644 --- a/cli/tsc/99_main_compiler.js +++ b/cli/tsc/99_main_compiler.js @@ -169,6 +169,10 @@ delete Object.prototype.__proto__; const isCjsCache = new SpecifierIsCjsCache(); + // Maps asset specifiers to the first scope that the asset was loaded into. + /** @type {Map} */ + const assetScopes = new Map(); + /** @type {number | null} */ let projectVersionCache = null; @@ -837,6 +841,9 @@ delete Object.prototype.__proto__; } const sourceFile = sourceFileCache.get(specifier); if (sourceFile) { + if (!assetScopes.has(specifier)) { + assetScopes.set(specifier, lastRequestScope); + } // This case only occurs for assets. return ts.ScriptSnapshot.fromString(sourceFile.text); } @@ -1210,6 +1217,7 @@ delete Object.prototype.__proto__; const newConfigsByScope = maybeChange[2]; if (newConfigsByScope) { isNodeSourceFileCache.clear(); + assetScopes.clear(); /** @type { typeof languageServiceEntries.byScope } */ const newByScope = new Map(); for (const [scope, config] of newConfigsByScope) { @@ -1247,6 +1255,12 @@ delete Object.prototype.__proto__; } } + // For requests pertaining to an asset document, we make it so that the + // passed scope is just its own specifier. We map it to an actual scope here + // based on the first scope that the asset was loaded into. + if (scope?.startsWith(ASSETS_URL_PREFIX)) { + scope = assetScopes.get(scope) ?? null; + } lastRequestMethod = method; lastRequestScope = scope; const ls = (scope ? languageServiceEntries.byScope.get(scope)?.ls : null) ?? diff --git a/tests/integration/lsp_tests.rs b/tests/integration/lsp_tests.rs index ae859a650d..8034bb6837 100644 --- a/tests/integration/lsp_tests.rs +++ b/tests/integration/lsp_tests.rs @@ -1409,11 +1409,13 @@ fn lsp_hover() { #[test] fn lsp_hover_asset() { let context = TestContextBuilder::new().use_temp_cwd().build(); + let temp_dir = context.temp_dir(); + temp_dir.write("deno.json", json!({}).to_string()); let mut client = context.new_lsp_command().build(); client.initialize_default(); client.did_open(json!({ "textDocument": { - "uri": "file:///a/file.ts", + "uri": temp_dir.uri().join("file.ts").unwrap(), "languageId": "typescript", "version": 1, "text": "console.log(Date.now());\n" @@ -1423,7 +1425,7 @@ fn lsp_hover_asset() { "textDocument/definition", json!({ "textDocument": { - "uri": "file:///a/file.ts" + "uri": temp_dir.uri().join("file.ts").unwrap() }, "position": { "line": 0, "character": 14 } }),