mirror of
https://github.com/denoland/deno.git
synced 2025-09-26 20:29:11 +00:00
fix(lsp): fix import specifiers in file rename changes (#30458)
Some checks are pending
ci / test release macos-x86_64 (push) Blocked by required conditions
ci / test debug windows-x86_64 (push) Blocked by required conditions
ci / test release windows-x86_64 (push) Blocked by required conditions
ci / build libs (push) Blocked by required conditions
ci / pre-build (push) Waiting to run
ci / test debug linux-aarch64 (push) Blocked by required conditions
ci / test release linux-aarch64 (push) Blocked by required conditions
ci / test debug macos-aarch64 (push) Blocked by required conditions
ci / test release macos-aarch64 (push) Blocked by required conditions
ci / bench release linux-x86_64 (push) Blocked by required conditions
ci / lint debug linux-x86_64 (push) Blocked by required conditions
ci / lint debug macos-x86_64 (push) Blocked by required conditions
ci / lint debug windows-x86_64 (push) Blocked by required conditions
ci / test debug linux-x86_64 (push) Blocked by required conditions
ci / test release linux-x86_64 (push) Blocked by required conditions
ci / test debug macos-x86_64 (push) Blocked by required conditions
ci / publish canary (push) Blocked by required conditions
Some checks are pending
ci / test release macos-x86_64 (push) Blocked by required conditions
ci / test debug windows-x86_64 (push) Blocked by required conditions
ci / test release windows-x86_64 (push) Blocked by required conditions
ci / build libs (push) Blocked by required conditions
ci / pre-build (push) Waiting to run
ci / test debug linux-aarch64 (push) Blocked by required conditions
ci / test release linux-aarch64 (push) Blocked by required conditions
ci / test debug macos-aarch64 (push) Blocked by required conditions
ci / test release macos-aarch64 (push) Blocked by required conditions
ci / bench release linux-x86_64 (push) Blocked by required conditions
ci / lint debug linux-x86_64 (push) Blocked by required conditions
ci / lint debug macos-x86_64 (push) Blocked by required conditions
ci / lint debug windows-x86_64 (push) Blocked by required conditions
ci / test debug linux-x86_64 (push) Blocked by required conditions
ci / test release linux-x86_64 (push) Blocked by required conditions
ci / test debug macos-x86_64 (push) Blocked by required conditions
ci / publish canary (push) Blocked by required conditions
This commit is contained in:
parent
dabf9c79b3
commit
efdcdf82c9
3 changed files with 104 additions and 2 deletions
|
@ -5,6 +5,7 @@ use std::cmp::Ordering;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use std::str::FromStr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use deno_ast::SourceRange;
|
use deno_ast::SourceRange;
|
||||||
|
@ -55,6 +56,7 @@ use super::language_server;
|
||||||
use super::resolver::LspResolver;
|
use super::resolver::LspResolver;
|
||||||
use super::tsc;
|
use super::tsc;
|
||||||
use crate::args::jsr_url;
|
use crate::args::jsr_url;
|
||||||
|
use crate::lsp::urls::uri_to_url;
|
||||||
use crate::tools::lint::CliLinter;
|
use crate::tools::lint::CliLinter;
|
||||||
use crate::util::path::relative_specifier;
|
use crate::util::path::relative_specifier;
|
||||||
|
|
||||||
|
@ -757,6 +759,43 @@ pub fn fix_ts_import_changes(
|
||||||
Ok(r)
|
Ok(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn fix_ts_import_changes_for_file_rename(
|
||||||
|
changes: Vec<tsc::FileTextChanges>,
|
||||||
|
new_uri: &str,
|
||||||
|
module: &DocumentModule,
|
||||||
|
language_server: &language_server::Inner,
|
||||||
|
token: &CancellationToken,
|
||||||
|
) -> Result<Vec<tsc::FileTextChanges>, AnyError> {
|
||||||
|
let Ok(new_uri) = Uri::from_str(new_uri) else {
|
||||||
|
return Ok(Vec::new());
|
||||||
|
};
|
||||||
|
if !new_uri.scheme().is_some_and(|s| s.eq_lowercase("file")) {
|
||||||
|
return Ok(Vec::new());
|
||||||
|
}
|
||||||
|
let new_url = uri_to_url(&new_uri);
|
||||||
|
let mut r = Vec::with_capacity(changes.len());
|
||||||
|
for mut change in changes {
|
||||||
|
if token.is_cancelled() {
|
||||||
|
return Err(anyhow!("request cancelled"));
|
||||||
|
}
|
||||||
|
let Ok(target_specifier) = resolve_url(&change.file_name) else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
let import_mapper = language_server.get_ts_response_import_mapper(module);
|
||||||
|
for text_change in &mut change.text_changes {
|
||||||
|
if let Some(new_specifier) = import_mapper
|
||||||
|
.check_specifier(&new_url, &target_specifier)
|
||||||
|
.or_else(|| relative_specifier(&target_specifier, &new_url))
|
||||||
|
.filter(|s| !s.contains("/node_modules/"))
|
||||||
|
{
|
||||||
|
text_change.new_text = new_specifier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
r.push(change);
|
||||||
|
}
|
||||||
|
Ok(r)
|
||||||
|
}
|
||||||
|
|
||||||
/// Fix tsc import code actions so that the module specifier is correct for
|
/// Fix tsc import code actions so that the module specifier is correct for
|
||||||
/// resolution by Deno (includes the extension).
|
/// resolution by Deno (includes the extension).
|
||||||
fn fix_ts_import_action<'a>(
|
fn fix_ts_import_action<'a>(
|
||||||
|
|
|
@ -108,6 +108,7 @@ use crate::file_fetcher::CreateCliFileFetcherOptions;
|
||||||
use crate::file_fetcher::create_cli_file_fetcher;
|
use crate::file_fetcher::create_cli_file_fetcher;
|
||||||
use crate::graph_util;
|
use crate::graph_util;
|
||||||
use crate::http_util::HttpClientProvider;
|
use crate::http_util::HttpClientProvider;
|
||||||
|
use crate::lsp::analysis::fix_ts_import_changes_for_file_rename;
|
||||||
use crate::lsp::compiler_options::LspCompilerOptionsResolver;
|
use crate::lsp::compiler_options::LspCompilerOptionsResolver;
|
||||||
use crate::lsp::config::ConfigWatchedFileType;
|
use crate::lsp::config::ConfigWatchedFileType;
|
||||||
use crate::lsp::diagnostics::generate_module_diagnostics;
|
use crate::lsp::diagnostics::generate_module_diagnostics;
|
||||||
|
@ -3889,8 +3890,25 @@ impl Inner {
|
||||||
LspError::internal_error()
|
LspError::internal_error()
|
||||||
}
|
}
|
||||||
})?;
|
})?;
|
||||||
changes_with_modules
|
let changes = fix_ts_import_changes_for_file_rename(
|
||||||
.extend(changes.into_iter().map(|c| (c, module.clone())));
|
changes,
|
||||||
|
&rename.new_uri,
|
||||||
|
&module,
|
||||||
|
self,
|
||||||
|
token,
|
||||||
|
)
|
||||||
|
.map_err(|err| {
|
||||||
|
if token.is_cancelled() {
|
||||||
|
LspError::request_cancelled()
|
||||||
|
} else {
|
||||||
|
error!("Unable to fix import changes: {:#}", err);
|
||||||
|
LspError::internal_error()
|
||||||
|
}
|
||||||
|
})?;
|
||||||
|
if !changes.is_empty() {
|
||||||
|
changes_with_modules
|
||||||
|
.extend(changes.into_iter().map(|c| (c, module.clone())));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_text_changes_to_workspace_edit(&changes_with_modules, self, token)
|
file_text_changes_to_workspace_edit(&changes_with_modules, self, token)
|
||||||
|
|
|
@ -18893,6 +18893,51 @@ console.log(invalid, validBytes, validText);
|
||||||
client.shutdown();
|
client.shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Regression test for https://github.com/denoland/deno/issues/30380.
|
||||||
|
#[test]
|
||||||
|
#[timeout(300_000)]
|
||||||
|
fn lsp_will_rename_files_js_to_ts() {
|
||||||
|
let context = TestContextBuilder::new().use_temp_cwd().build();
|
||||||
|
let temp_dir = context.temp_dir();
|
||||||
|
temp_dir.write("deno.json", json!({}).to_string());
|
||||||
|
let file = temp_dir.source_file("main.ts", "import \"./other.js\";\n");
|
||||||
|
let other_file = temp_dir.source_file("other.js", "");
|
||||||
|
let mut client = context.new_lsp_command().build();
|
||||||
|
client.initialize_default();
|
||||||
|
client.did_open_file(&file);
|
||||||
|
let res = client.write_request(
|
||||||
|
"workspace/willRenameFiles",
|
||||||
|
json!({
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"oldUri": other_file.uri(),
|
||||||
|
"newUri": temp_dir.path().join("other.ts").uri_file(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
res,
|
||||||
|
json!({
|
||||||
|
"documentChanges": [
|
||||||
|
{
|
||||||
|
"textDocument": { "uri": file.uri(), "version": 1 },
|
||||||
|
"edits": [
|
||||||
|
{
|
||||||
|
"range": {
|
||||||
|
"start": { "line": 0, "character": 8 },
|
||||||
|
"end": { "line": 0, "character": 18 },
|
||||||
|
},
|
||||||
|
"newText": "./other.ts",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
client.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[timeout(300_000)]
|
#[timeout(300_000)]
|
||||||
fn lsp_push_diagnostics() {
|
fn lsp_push_diagnostics() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue