Skip to content

Commit

Permalink
feat(vscode): rename class and struct members (#6637)
Browse files Browse the repository at this point in the history
fixes [#6546](#6546)
fixes [#6547](#6547)
fixes [#6484](#6484)
fixes [#6584](#6584)

I added some more visitors and cases to the `rename_request` to enable renaming of class members and struct properties 

## Checklist

- [x] Title matches [Winglang's style guide](https://www.winglang.io/contributing/start-here/pull_requests#how-are-pull-request-titles-formatted)
- [x] Description explains motivation and solution
- [x] Tests added (always)
- [ ] Docs updated (only required for features)
- [ ] Added `pr/e2e-full` label if this feature requires end-to-end testing

*By submitting this pull request, I confirm that my contribution is made under the terms of the [Wing Cloud Contribution License](https://github.com/winglang/wing/blob/main/CONTRIBUTION_LICENSE.md)*.
  • Loading branch information
tsuf239 authored Jun 13, 2024
1 parent 40d5a73 commit d5fadbc
Show file tree
Hide file tree
Showing 23 changed files with 359 additions and 458 deletions.
60 changes: 47 additions & 13 deletions libs/wingc/src/lsp/rename_prepare.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,19 +256,6 @@ class User {
"#
);

// TODO: not supported yet- therefore disabled
test_rename_prepare!(
cant_rename_struct_key,
r#"
struct user {
name: str;
//^
}
let a: user = {name: "a"};
"#
);

test_rename_prepare!(
cant_rename_struct_keyword,
r#"
Expand Down Expand Up @@ -335,6 +322,53 @@ class User {
"#
);

test_rename_prepare!(
cant_rename_super,
r#"
class A {}
class B extends A {
new() {
super();
//^
}
}
"#
);

test_rename_prepare!(
cant_rename_new,
r#"
class A {}
class B extends A {
new() {
//^
super();
}
}
"#
);

test_rename_prepare!(
cant_rename_inflight_new,
r#"
inflight class A {
inflight new() {
//^
}
}
"#
);

test_rename_prepare!(
cant_rename_json_key,
r#"
let a = {name: "a"};
log(a.name);
//^
"#
);

test_rename_prepare!(
cant_rename_json_val,
r#"
Expand Down
268 changes: 238 additions & 30 deletions libs/wingc/src/lsp/rename_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ pub fn on_rename_request(params: RenameParams) -> WorkspaceEdit {
mod tests {
use crate::lsp::rename_request::*;
use crate::lsp::sync::test_utils::*;
use lsp_types::{Range, Url};
use lsp_types::Range;

/// Creates a snapshot test for a given wing program's rename_request at a given position
/// In the wing program, place a comment "//^" into the text where the "^" is pointing to the desired character position
Expand Down Expand Up @@ -76,31 +76,6 @@ mod tests {
new_name: String::from($new_word)
});

insta::with_settings!(
{
prepend_module_to_snapshot => false,
omit_expression => true,
snapshot_path => "./snapshots/rename_request",
}, {

let mut changes = HashMap::new();
// There is only one file, therefore we change only the first one
let new_key = Url::parse("file:///main.w").expect("invalid url");
if let Some(c) = &$name.changes {
let text_edits = c.values().next().unwrap().clone();
changes.insert(new_key, text_edits);
}

insta::assert_yaml_snapshot!(WorkspaceEdit {
changes: Some(changes),
document_changes: None,
change_annotations: None,
});


}
);

let mut text_edit_ranges: Vec<Range> = vec![];
if let Some(changes) = &$name.changes {
for text_edits in changes.values() {
Expand Down Expand Up @@ -343,16 +318,36 @@ test "pow" {
"t1"
);

// TODO: not supported yet
test_rename_request!(
rename_struct_key,
r#"
struct user {
struct User {
name: str;
//---^
}
let a: User = {name: "a"};
//----
log(a.name);
//----
"#,
"t1"
);

test_rename_request!(
rename_struct_key_usage,
r#"
struct User {
name: str;
//^
//----
}
let a: user = {name: "a"};
let a: User = {name: "a"};
//----
log(a.name);
//---^
"#,
"t1"
);
Expand Down Expand Up @@ -419,4 +414,217 @@ test "pow" {
"#,
"t1"
);

test_rename_request!(
rename_class_property,
r#"
class Cat {
pub name: str;
//---^
new(name: str) {
this.name = name;
//----
}
inflight pub jump(height: num) {}
pub sleep(d: duration) {
log("{this.name} sleeps");
//----
}
}
let a = new Cat("A") as "a cat";
let b = new Cat("B") as "b cat";
a.sleep(18h);
b.sleep(24h);
log(b.name);
//----
test "a cat scares b cat" {
a.jump(5);
b.jump(-5);
}
"#,
"t1"
);
test_rename_request!(
rename_class_property_from_usage,
r#"
class Cat {
pub name: str;
//----
new(name: str) {
this.name = name;
//----
}
inflight pub jump(height: num) {}
pub sleep(d: duration) {
log("{this.name} sleeps");
//----
}
}
let a = new Cat("A") as "a cat";
let b = new Cat("B") as "b cat";
a.sleep(18h);
b.sleep(24h);
log(b.name);
//---^
test "a cat scares b cat" {
a.jump(5);
b.jump(-5);
}
"#,
"t1"
);

test_rename_request!(
rename_class_inflight_method,
r#"
class Cat {
pub name: str;
new(name: str) {
this.name = name;
}
inflight pub jump(height: num) {}
//---^
pub sleep(d: duration) {
log("{this.name} sleeps");
}
}
let a = new Cat("A") as "a cat";
let b = new Cat("B") as "b cat";
a.sleep(18h);
b.sleep(24h);
log(b.name);
test "a cat scares b cat" {
a.jump(5);
//----
b.jump(-5);
//----
}
"#,
"t1"
);

test_rename_request!(
rename_class_inflight_method_from_usage,
r#"
class Cat {
pub name: str;
new(name: str) {
this.name = name;
}
inflight pub jump(height: num) {}
//----
pub sleep(d: duration) {
log("{this.name} sleeps");
}
}
let a = new Cat("A") as "a cat";
let b = new Cat("B") as "b cat";
a.sleep(18h);
b.sleep(24h);
log(b.name);
test "a cat scares b cat" {
a.jump(5);
//----
b.jump(-5);
//---^
}
"#,
"t1"
);
test_rename_request!(
rename_class_preflight_method,
r#"
class Cat {
pub name: str;
new(name: str) {
this.name = name;
}
inflight pub jump(height: num) {}
pub sleep(d: duration) {
//----^
log("{this.name} sleeps");
}
}
let a = new Cat("A") as "a cat";
let b = new Cat("B") as "b cat";
a.sleep(18h);
//-----
b.sleep(24h);
//-----
log(b.name);
test "a cat scares b cat" {
a.jump(5);
b.jump(-5);
}
"#,
"t1"
);

test_rename_request!(
rename_class_preflight_method_from_usage,
r#"
class Cat {
pub name: str;
new(name: str) {
this.name = name;
}
inflight pub jump(height: num) {}
pub sleep(d: duration) {
//-----
log("{this.name} sleeps");
}
}
let a = new Cat("A") as "a cat";
let b = new Cat("B") as "b cat";
a.sleep(18h);
//----^
b.sleep(24h);
//-----
log(b.name);
test "a cat scares b cat" {
a.jump(5);
b.jump(-5);
}
"#,
"t1"
);

test_rename_request!(
new_scope_args,
r#"
class Cat {
pub name: str;
new(name: str) {
//---^
this.name = name;
//----
}
}
"#,
"t1"
);
}
Loading

0 comments on commit d5fadbc

Please sign in to comment.