Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(lsp): include all diagnosable documents on initialize #17979

Merged
merged 37 commits into from
Mar 30, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
6125671
fix(lsp): add all documents to the lsp on initialize
dsherret Feb 28, 2023
f08a5bf
Fix
dsherret Feb 28, 2023
ef6475c
Take into account enabled_paths
dsherret Mar 1, 2023
17b1f0b
Another one.
dsherret Mar 1, 2023
67439dd
More work.
dsherret Mar 4, 2023
abedfff
Merge branch 'main' into fix_lsp_open_docs_root
dsherret Mar 15, 2023
459ce44
Fix inverted logic.
dsherret Mar 15, 2023
72bfa94
Compile
dsherret Mar 15, 2023
cdc4af0
Ignore minified files
dsherret Mar 15, 2023
0129cf9
Merge branch 'main' into fix_lsp_open_docs_root
dsherret Mar 29, 2023
8688718
Handle files in enabled paths
dsherret Mar 29, 2023
8b0ab70
Consolidate code
dsherret Mar 29, 2023
4c9e102
refactor(lsp): remove boolean parameters on `documents.documents(...)`
dsherret Mar 29, 2023
d9c5e91
Remove word "And"
dsherret Mar 29, 2023
fc4d027
Merge branch 'refactor_lsp_documents_bool_param' into fix_lsp_open_do…
dsherret Mar 29, 2023
08ef6af
Working.
dsherret Mar 29, 2023
2dc17b0
Failing test because our textDocument/references implementation is br…
dsherret Mar 29, 2023
bab99d7
fix(lsp): `textDocument/references` should respect `includeDeclaration`
dsherret Mar 29, 2023
b7dee99
Small refactor.
dsherret Mar 29, 2023
a8cb329
Fix codelens test
dsherret Mar 29, 2023
5894f85
Merge branch 'main' into fix_lsp_find_references_respect_include_decl…
dsherret Mar 29, 2023
c5cfb24
Merge branch 'main' into fix_lsp_find_references_respect_include_decl…
dsherret Mar 30, 2023
b7d7541
Add test and improve code
dsherret Mar 30, 2023
41b3004
Merge branch 'main' into fix_lsp_find_references_respect_include_decl…
dsherret Mar 30, 2023
8dec2d3
Oops... Fix test
dsherret Mar 30, 2023
5a55a7e
Reduce flakiness of package_json_uncached_no_error
dsherret Mar 30, 2023
74fb03f
Merge branch 'main' into fix_lsp_open_docs_root
dsherret Mar 30, 2023
818811e
Merge branch 'fix_lsp_find_references_respect_include_declaration' in…
dsherret Mar 30, 2023
7b96f00
Add enabled_root_urls tests
dsherret Mar 30, 2023
bc3c42e
Merge branch 'main' into fix_lsp_open_docs_root
dsherret Mar 30, 2023
697ace6
Refactor document finder to be more easily unit testable
dsherret Mar 30, 2023
2216402
Another test.
dsherret Mar 30, 2023
8fe2597
Merge branch 'main' into fix_lsp_open_docs_root
dsherret Mar 30, 2023
4d8a9b0
Fix tests
dsherret Mar 30, 2023
b416267
Merge branch 'main' into fix_lsp_open_docs_root
dsherret Mar 30, 2023
055f94d
Fix two failing tests.
dsherret Mar 30, 2023
6cc5a97
Update lsp tests to use a temp cwd
dsherret Mar 30, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Prev Previous commit
Next Next commit
Add test and improve code
  • Loading branch information
dsherret committed Mar 30, 2023
commit b7d75411bb7aa5dcc6805c36e36c768411036b3f
99 changes: 49 additions & 50 deletions cli/lsp/code_lens.rs
Original file line number Diff line number Diff line change
Expand Up @@ -297,19 +297,14 @@ async fn resolve_references_code_lens(
data: CodeLensData,
language_server: &language_server::Inner,
) -> Result<lsp::CodeLens, AnyError> {
let asset_or_document =
language_server.get_asset_or_document(&data.specifier)?;
let line_index = asset_or_document.line_index();
let snapshot = language_server.snapshot();
let maybe_referenced_symbols = language_server
.ts_server
.find_references(
snapshot,
&data.specifier,
line_index.offset_tsc(code_lens.range.start)?,
)
.await?;
if let Some(symbols) = maybe_referenced_symbols {
fn get_locations(
maybe_referenced_symbols: Option<Vec<tsc::ReferencedSymbol>>,
language_server: &language_server::Inner,
) -> Result<Vec<lsp::Location>, AnyError> {
let symbols = match maybe_referenced_symbols {
Some(symbols) => symbols,
None => return Ok(Vec::new()),
};
let mut locations = Vec::new();
for reference in symbols.iter().flat_map(|s| &s.references) {
if reference.is_definition {
Expand All @@ -325,45 +320,49 @@ async fn resolve_references_code_lens(
.to_location(asset_or_doc.line_index(), &language_server.url_map),
);
}
let command = if !locations.is_empty() {
let title = if locations.len() > 1 {
format!("{} references", locations.len())
} else {
"1 reference".to_string()
};
lsp::Command {
title,
command: "deno.showReferences".to_string(),
arguments: Some(vec![
json!(data.specifier),
json!(code_lens.range.start),
json!(locations),
]),
}
} else {
lsp::Command {
title: "0 references".to_string(),
command: "".to_string(),
arguments: None,
}
};
Ok(lsp::CodeLens {
range: code_lens.range,
command: Some(command),
data: None,
})
Ok(locations)
}

let asset_or_document =
language_server.get_asset_or_document(&data.specifier)?;
let line_index = asset_or_document.line_index();
let snapshot = language_server.snapshot();
let maybe_referenced_symbols = language_server
.ts_server
.find_references(
snapshot,
&data.specifier,
line_index.offset_tsc(code_lens.range.start)?,
)
.await?;
let locations = get_locations(maybe_referenced_symbols, language_server)?;
let title = if locations.len() == 1 {
"1 reference".to_string()
} else {
let command = lsp::Command {
title: "0 references".to_string(),
command: "".to_string(),
format!("{} references", locations.len())
};
let command = if locations.is_empty() {
lsp::Command {
title,
command: String::new(),
arguments: None,
};
Ok(lsp::CodeLens {
range: code_lens.range,
command: Some(command),
data: None,
})
}
}
} else {
lsp::Command {
title,
command: "deno.showReferences".to_string(),
arguments: Some(vec![
json!(data.specifier),
json!(code_lens.range.start),
json!(locations),
]),
}
};
Ok(lsp::CodeLens {
range: code_lens.range,
command: Some(command),
data: None,
})
}

pub async fn resolve_code_lens(
Expand Down
128 changes: 117 additions & 11 deletions cli/tests/integration/lsp_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2367,16 +2367,32 @@ fn lsp_semantic_tokens() {
fn lsp_code_lens() {
let mut client = LspClientBuilder::new().build();
client.initialize_default();
client.did_open(
json!({
"textDocument": {
"uri": "file:https:///a/file.ts",
"languageId": "typescript",
"version": 1,
"text": "class A {\n a = \"a\";\n\n b() {\n console.log(this.a);\n }\n\n c() {\n this.a = \"c\";\n }\n}\n\nconst a = new A();\na.b();\n"
}
}),
);
client.did_open(json!({
"textDocument": {
"uri": "file:https:///a/file.ts",
"languageId": "typescript",
"version": 1,
"text": concat!(
"class A {\n",
" a = \"a\";\n",
"\n",
" b() {\n",
" console.log(this.a);\n",
" }\n",
"\n",
" c() {\n",
" this.a = \"c\";\n",
" }\n",
"}\n",
"\n",
"const a = new A();\n",
"a.b();\n",
"const b = 2;\n",
"const c = 3;\n",
"c; c;",
),
}
}));
let res = client.write_request(
"textDocument/codeLens",
json!({
Expand Down Expand Up @@ -2444,6 +2460,80 @@ fn lsp_code_lens() {
}
})
);

// 0 references
let res = client.write_request(
"codeLens/resolve",
json!({
"range": {
"start": { "line": 14, "character": 6 },
"end": { "line": 14, "character": 7 }
},
"data": {
"specifier": "file:https:///a/file.ts",
"source": "references"
}
}),
);
assert_eq!(
res,
json!({
"range": {
"start": { "line": 14, "character": 6 },
"end": { "line": 14, "character": 7 }
},
"command": {
"title": "0 references",
"command": "",
}
})
);

// 2 references
let res = client.write_request(
"codeLens/resolve",
json!({
"range": {
"start": { "line": 15, "character": 6 },
"end": { "line": 15, "character": 7 }
},
"data": {
"specifier": "file:https:///a/file.ts",
"source": "references"
}
}),
);
assert_eq!(
res,
json!({
"range": {
"start": { "line": 15, "character": 6 },
"end": { "line": 15, "character": 7 }
},
"command": {
"title": "2 references",
"command": "deno.showReferences",
"arguments": [
"file:https:///a/file.ts",
{ "line": 15, "character": 6 },
[{
"uri": "file:https:///a/file.ts",
"range": {
"start": { "line": 16, "character": 0 },
"end": { "line": 16, "character": 1 }
}
},{
"uri": "file:https:///a/file.ts",
"range": {
"start": { "line": 16, "character": 3 },
"end": { "line": 16, "character": 4 }
}
}]
]
}
})
);

client.shutdown();
}

Expand Down Expand Up @@ -3094,7 +3184,7 @@ fn lsp_find_references() {
"uri": "file:https:///a/mod.ts",
"languageId": "typescript",
"version": 1,
"text": r#"export const a = 5;"#
"text": r#"export const a = 1;\nexport const b = 2;"#
}
}));
client.did_open(json!({
Expand Down Expand Up @@ -3174,6 +3264,22 @@ fn lsp_find_references() {
}])
);

// test 0 references
let res = client.write_request(
"textDocument/references",
json!({
"textDocument": {
"uri": "file:https:///a/mod.ts",
},
"position": { "line": 1, "character": 13 },
"context": {
"includeDeclaration": false
}
}),
);

assert_eq!(res, json!([]));

client.shutdown();
}

Expand Down