+41
-16
compiler-core/src/language_server/code_action.rs
+41
-16
compiler-core/src/language_server/code_action.rs
···
8679
8679
constructor: &'ast ValueConstructor,
8680
8680
name: &'ast EcoString,
8681
8681
) {
8682
-
match &constructor.variant {
8683
-
type_::ValueConstructorVariant::LocalVariable {
8684
-
location: definition_location,
8685
-
..
8686
-
} => {
8687
-
self.register_referenced_variable(
8688
-
name,
8689
-
&constructor.type_,
8690
-
*location,
8691
-
*definition_location,
8692
-
);
8693
-
}
8694
-
type_::ValueConstructorVariant::ModuleConstant { .. }
8695
-
| type_::ValueConstructorVariant::LocalConstant { .. }
8696
-
| type_::ValueConstructorVariant::ModuleFn { .. }
8697
-
| type_::ValueConstructorVariant::Record { .. } => {}
8682
+
if let type_::ValueConstructorVariant::LocalVariable {
8683
+
location: definition_location,
8684
+
..
8685
+
} = &constructor.variant
8686
+
{
8687
+
self.register_referenced_variable(
8688
+
name,
8689
+
&constructor.type_,
8690
+
*location,
8691
+
*definition_location,
8692
+
);
8693
+
}
8694
+
}
8695
+
8696
+
fn visit_typed_clause_guard_var(
8697
+
&mut self,
8698
+
location: &'ast SrcSpan,
8699
+
name: &'ast EcoString,
8700
+
type_: &'ast Arc<Type>,
8701
+
definition_location: &'ast SrcSpan,
8702
+
) {
8703
+
self.register_referenced_variable(name, type_, *location, *definition_location);
8704
+
}
8705
+
8706
+
fn visit_typed_bit_array_size_variable(
8707
+
&mut self,
8708
+
location: &'ast SrcSpan,
8709
+
name: &'ast EcoString,
8710
+
constructor: &'ast Option<Box<ValueConstructor>>,
8711
+
type_: &'ast Arc<Type>,
8712
+
) {
8713
+
let variant = match constructor {
8714
+
Some(constructor) => &constructor.variant,
8715
+
None => return,
8716
+
};
8717
+
if let type_::ValueConstructorVariant::LocalVariable {
8718
+
location: definition_location,
8719
+
..
8720
+
} = variant
8721
+
{
8722
+
self.register_referenced_variable(name, type_, *location, *definition_location);
8698
8723
}
8699
8724
}
8700
8725
}
+43
compiler-core/src/language_server/tests/action.rs
+43
compiler-core/src/language_server/tests/action.rs
···
10329
10329
find_position_of("let").select_until(find_position_of("echo x\n").under_char('\n'))
10330
10330
);
10331
10331
}
10332
+
10333
+
#[test]
10334
+
fn extract_function_which_uses_variable_in_guard() {
10335
+
assert_code_action!(
10336
+
EXTRACT_FUNCTION,
10337
+
"
10338
+
pub fn do_things(a, b) {
10339
+
let result = case Nil {
10340
+
_ if a > b -> 17
10341
+
_ if a < b -> 12
10342
+
_ -> panic
10343
+
}
10344
+
10345
+
result % 4
10346
+
}
10347
+
",
10348
+
find_position_of("case").select_until(find_position_of("}\n").under_char('\n'))
10349
+
);
10350
+
}
10351
+
10352
+
#[test]
10353
+
fn extract_function_which_uses_variable_in_bit_array_pattern() {
10354
+
assert_code_action!(
10355
+
EXTRACT_FUNCTION,
10356
+
"
10357
+
pub fn main() {
10358
+
let bits = todo
10359
+
let size = todo
10360
+
10361
+
let segment = case bits {
10362
+
<<x:size(size), _:bits>> -> Ok(x)
10363
+
_ -> Error(Nil)
10364
+
}
10365
+
10366
+
case segment {
10367
+
Ok(value) -> echo value
10368
+
Error(_) -> panic
10369
+
}
10370
+
}
10371
+
",
10372
+
find_position_of("case").select_until(find_position_of("}\n").under_char('\n'))
10373
+
);
10374
+
}
+46
compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__action__extract_function_which_uses_variable_in_bit_array_pattern.snap
+46
compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__action__extract_function_which_uses_variable_in_bit_array_pattern.snap
···
1
+
---
2
+
source: compiler-core/src/language_server/tests/action.rs
3
+
expression: "\npub fn main() {\n let bits = todo\n let size = todo\n\n let segment = case bits {\n <<x:size(size), _:bits>> -> Ok(x)\n _ -> Error(Nil)\n }\n\n case segment {\n Ok(value) -> echo value\n Error(_) -> panic\n }\n}\n"
4
+
---
5
+
----- BEFORE ACTION
6
+
7
+
pub fn main() {
8
+
let bits = todo
9
+
let size = todo
10
+
11
+
let segment = case bits {
12
+
▔▔▔▔▔▔▔▔▔▔▔
13
+
<<x:size(size), _:bits>> -> Ok(x)
14
+
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
15
+
_ -> Error(Nil)
16
+
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
17
+
}
18
+
▔▔▔
19
+
20
+
case segment {
21
+
Ok(value) -> echo value
22
+
Error(_) -> panic
23
+
}
24
+
}
25
+
26
+
27
+
----- AFTER ACTION
28
+
29
+
pub fn main() {
30
+
let bits = todo
31
+
let size = todo
32
+
33
+
let segment = function(bits, size)
34
+
35
+
case segment {
36
+
Ok(value) -> echo value
37
+
Error(_) -> panic
38
+
}
39
+
}
40
+
41
+
fn function(bits: BitArray, size: Int) -> Result(Int, Nil) {
42
+
case bits {
43
+
<<x:size(size), _:bits>> -> Ok(x)
44
+
_ -> Error(Nil)
45
+
}
46
+
}
+37
compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__action__extract_function_which_uses_variable_in_guard.snap
+37
compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__action__extract_function_which_uses_variable_in_guard.snap
···
1
+
---
2
+
source: compiler-core/src/language_server/tests/action.rs
3
+
expression: "\npub fn do_things(a, b) {\n let result = case Nil {\n _ if a > b -> 17\n _ if a < b -> 12\n _ -> panic\n }\n\n result % 4\n}\n"
4
+
---
5
+
----- BEFORE ACTION
6
+
7
+
pub fn do_things(a, b) {
8
+
let result = case Nil {
9
+
▔▔▔▔▔▔▔▔▔▔
10
+
_ if a > b -> 17
11
+
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
12
+
_ if a < b -> 12
13
+
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
14
+
_ -> panic
15
+
▔▔▔▔▔▔▔▔▔▔▔▔▔▔
16
+
}
17
+
▔▔▔
18
+
19
+
result % 4
20
+
}
21
+
22
+
23
+
----- AFTER ACTION
24
+
25
+
pub fn do_things(a, b) {
26
+
let result = function(a, b)
27
+
28
+
result % 4
29
+
}
30
+
31
+
fn function(a: Int, b: Int) -> Int {
32
+
case Nil {
33
+
_ if a > b -> 17
34
+
_ if a < b -> 12
35
+
_ -> panic
36
+
}
37
+
}