mirror of
https://github.com/nushell/nushell.git
synced 2025-05-29 06:17:54 +02:00
fix(lsp): renaming of flag variables (#14890)
<!-- if this PR closes one or more issues, you can automatically link the PR with them by using one of the [*linking keywords*](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword), e.g. - this PR should close #xxxx - fixes #xxxx you can also mention related issues, PRs or discussions! --> # Description <!-- Thank you for improving Nushell. Please, check our [contributing guide](../CONTRIBUTING.md) and talk to the core team before making major changes. Description of your pull request goes here. **Provide examples and/or screenshots** if your changes affect the user experience. --> This PR fixes a bug: renaming on a flag variable removes the leading `--` in the signature. <img width="257" alt="image" src="https://github.com/user-attachments/assets/767c62de-f3a0-4a07-9786-61b21e8cfcb6" /> Gets the following before this PR: ```nushell export def foooo [ p: int ] { $p } ``` # User-Facing Changes <!-- List of all changes that impact the user experience here. This helps us keep track of breaking changes. --> # Tests + Formatting <!-- Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass (on Windows make sure to [enable developer mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging)) - `cargo run -- -c "use toolkit.nu; toolkit test stdlib"` to run the tests for the standard library > **Note** > from `nushell` you can also use the `toolkit` as follows > ```bash > use toolkit.nu # or use an `env_change` hook to activate it automatically > toolkit check pr > ``` --> # After Submitting <!-- If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date. -->
This commit is contained in:
parent
cdb082e92d
commit
84c720daf5
5
Cargo.lock
generated
5
Cargo.lock
generated
@ -3202,13 +3202,14 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lsp-server"
|
name = "lsp-server"
|
||||||
version = "0.7.7"
|
version = "0.7.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "550446e84739dcaf6d48a4a093973850669e13e8a34d8f8d64851041be267cd9"
|
checksum = "9462c4dc73e17f971ec1f171d44bfffb72e65a130117233388a0ebc7ec5656f9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
"log",
|
"log",
|
||||||
"serde",
|
"serde",
|
||||||
|
"serde_derive",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ libproc = "0.14"
|
|||||||
log = "0.4"
|
log = "0.4"
|
||||||
lru = "0.12"
|
lru = "0.12"
|
||||||
lscolors = { version = "0.17", default-features = false }
|
lscolors = { version = "0.17", default-features = false }
|
||||||
lsp-server = "0.7.5"
|
lsp-server = "0.7.8"
|
||||||
lsp-types = { version = "0.97.0", features = ["proposed"] }
|
lsp-types = { version = "0.97.0", features = ["proposed"] }
|
||||||
lsp-textdocument = "0.4.0"
|
lsp-textdocument = "0.4.0"
|
||||||
mach2 = "0.4"
|
mach2 = "0.4"
|
||||||
|
@ -198,7 +198,7 @@ fn try_find_id_in_def(
|
|||||||
id_ref: Option<&Id>,
|
id_ref: Option<&Id>,
|
||||||
) -> Option<(Id, Span)> {
|
) -> Option<(Id, Span)> {
|
||||||
let call_name = working_set.get_span_contents(call.head);
|
let call_name = working_set.get_span_contents(call.head);
|
||||||
if call_name != "def".as_bytes() && call_name != "export def".as_bytes() {
|
if call_name != b"def" && call_name != b"export def" {
|
||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
let mut span = None;
|
let mut span = None;
|
||||||
|
@ -54,37 +54,18 @@ fn find_reference_in_file(
|
|||||||
file: &FullTextDocument,
|
file: &FullTextDocument,
|
||||||
fp: &Path,
|
fp: &Path,
|
||||||
id: &Id,
|
id: &Id,
|
||||||
) -> Option<Vec<Range>> {
|
) -> Option<Vec<Span>> {
|
||||||
let fp_str = fp.to_str()?;
|
|
||||||
let block = parse(
|
let block = parse(
|
||||||
working_set,
|
working_set,
|
||||||
Some(fp_str),
|
fp.to_str(),
|
||||||
file.get_content(None).as_bytes(),
|
file.get_content(None).as_bytes(),
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
let file_span = working_set.get_span_for_filename(fp_str)?;
|
let references: Vec<Span> = find_reference_by_id(&block, working_set, id);
|
||||||
let offset = file_span.start;
|
|
||||||
let mut references: Vec<Span> = find_reference_by_id(&block, working_set, id);
|
|
||||||
|
|
||||||
// NOTE: for arguments whose declaration is in a signature
|
|
||||||
// which is not covered in the AST
|
|
||||||
if let Id::Variable(vid) = id {
|
|
||||||
let decl_span = working_set.get_variable(*vid).declaration_span;
|
|
||||||
if file_span.contains_span(decl_span)
|
|
||||||
&& decl_span.end > decl_span.start
|
|
||||||
&& !references.contains(&decl_span)
|
|
||||||
{
|
|
||||||
references.push(decl_span);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let occurs: Vec<Range> = references
|
|
||||||
.iter()
|
|
||||||
.map(|span| span_to_range(span, file, offset))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
// add_block to avoid repeated parsing
|
// add_block to avoid repeated parsing
|
||||||
working_set.add_block(block);
|
working_set.add_block(block);
|
||||||
(!occurs.is_empty()).then_some(occurs)
|
(!references.is_empty()).then_some(references)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LanguageServer {
|
impl LanguageServer {
|
||||||
@ -284,6 +265,7 @@ impl LanguageServer {
|
|||||||
.filter_map(|p| p.ok())
|
.filter_map(|p| p.ok())
|
||||||
.collect();
|
.collect();
|
||||||
let len = scripts.len();
|
let len = scripts.len();
|
||||||
|
let definition_span = Self::find_definition_span_by_id(&working_set, &id);
|
||||||
|
|
||||||
for (i, fp) in scripts.iter().enumerate() {
|
for (i, fp) in scripts.iter().enumerate() {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -324,7 +306,34 @@ impl LanguageServer {
|
|||||||
}
|
}
|
||||||
&FullTextDocument::new("nu".to_string(), 0, content_string.into())
|
&FullTextDocument::new("nu".to_string(), 0, content_string.into())
|
||||||
};
|
};
|
||||||
let _ = find_reference_in_file(&mut working_set, file, fp, &id).map(|ranges| {
|
let _ = find_reference_in_file(&mut working_set, file, fp, &id).map(|mut refs| {
|
||||||
|
let file_span = working_set
|
||||||
|
.get_span_for_filename(fp.to_string_lossy().as_ref())
|
||||||
|
.unwrap_or(Span::unknown());
|
||||||
|
// NOTE: for arguments whose declaration is in a signature
|
||||||
|
// which is not covered in the AST
|
||||||
|
if let (Id::Variable(_), Some(decl_span)) = (&id, definition_span) {
|
||||||
|
if file_span.contains_span(decl_span)
|
||||||
|
&& decl_span.end > decl_span.start
|
||||||
|
&& !refs.contains(&decl_span)
|
||||||
|
{
|
||||||
|
let leading_dashes = working_set
|
||||||
|
.get_span_contents(decl_span)
|
||||||
|
.iter()
|
||||||
|
// remove leading dashes for flags
|
||||||
|
.take_while(|c| *c == &b'-')
|
||||||
|
.count();
|
||||||
|
let start = decl_span.start + leading_dashes;
|
||||||
|
refs.push(Span {
|
||||||
|
start,
|
||||||
|
end: start + span.end - span.start,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let ranges = refs
|
||||||
|
.iter()
|
||||||
|
.map(|span| span_to_range(span, file, file_span.start))
|
||||||
|
.collect();
|
||||||
data_sender
|
data_sender
|
||||||
.send(InternalMessage::RangeMessage(RangePerDoc { uri, ranges }))
|
.send(InternalMessage::RangeMessage(RangePerDoc { uri, ranges }))
|
||||||
.ok();
|
.ok();
|
||||||
@ -693,7 +702,7 @@ mod tests {
|
|||||||
"newText": "new"
|
"newText": "new"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"range": { "start": { "line": 1, "character": 2 }, "end": { "line": 1, "character": 7 } },
|
"range": { "start": { "line": 1, "character": 4 }, "end": { "line": 1, "character": 9 } },
|
||||||
"newText": "new"
|
"newText": "new"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
2
tests/fixtures/lsp/workspace/foo.nu
vendored
2
tests/fixtures/lsp/workspace/foo.nu
vendored
@ -1,5 +1,5 @@
|
|||||||
export def foooo [
|
export def foooo [
|
||||||
param: int
|
--param(-p): int
|
||||||
] {
|
] {
|
||||||
$param
|
$param
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user