summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/lsp/documents.rs2
-rw-r--r--cli/tsc/99_main_compiler.js14
-rw-r--r--tests/integration/lsp_tests.rs6
3 files changed, 19 insertions, 3 deletions
diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs
index 811587a8d..57e48fbc3 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 4fba5449f..75c6f8117 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<string, string | null>} */
+ 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 ae859a650..8034bb683 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 }
}),