Skip to content

Commit 0cf077e

Browse files
Sort completions by type
1 parent afcd7e9 commit 0cf077e

17 files changed

+309
-148
lines changed

compiler-core/src/language_server/completer.rs

Lines changed: 199 additions & 117 deletions
Large diffs are not rendered by default.

compiler-core/src/language_server/engine.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -272,15 +272,15 @@ where
272272
None => return Ok(None),
273273
};
274274

275-
let completer = Completer::new(&src, &params, &this.compiler, module);
275+
let mut completer = Completer::new(&src, &params, &this.compiler, module);
276276
let byte_index = completer.module_line_numbers.byte_index(params.position);
277277

278278
// If in comment context, do not provide completions
279279
if module.extra.is_within_comment(byte_index) {
280280
return Ok(None);
281281
}
282282

283-
// Check current filercontents if the user is writing an import
283+
// Check current file contents if the user is writing an import
284284
// and handle separately from the rest of the completion flow
285285
// Check if an import is being written
286286
if let Some(value) = completer.import_completions() {
@@ -310,9 +310,10 @@ where
310310
Some(completions)
311311
}
312312
Located::Expression {
313-
expression: TypedExpr::RecordAccess { record, .. },
313+
expression: TypedExpr::RecordAccess { record, type_, .. },
314314
..
315315
} => {
316+
completer.expected_type = Some(type_.clone());
316317
let mut completions = vec![];
317318
completions.append(&mut completer.completion_values());
318319
completions.append(&mut completer.completion_field_accessors(record.type_()));
@@ -333,9 +334,11 @@ where
333334
);
334335
Some(completions)
335336
}
336-
Located::Statement(_) | Located::Expression { .. } => {
337+
Located::Expression { expression, .. } => {
338+
completer.expected_type = Some(expression.type_());
337339
Some(completer.completion_values())
338340
}
341+
Located::Statement(_) => Some(completer.completion_values()),
339342
Located::ModuleStatement(Definition::Function(_)) => {
340343
Some(completer.completion_types())
341344
}
@@ -354,7 +357,12 @@ where
354357
completer.unqualified_completions_from_module(importing_module, true)
355358
}),
356359

357-
Located::ModuleStatement(Definition::ModuleConstant(_)) | Located::Constant(_) => {
360+
Located::ModuleStatement(Definition::ModuleConstant(constant)) => {
361+
completer.expected_type = Some(constant.type_.clone());
362+
Some(completer.completion_values())
363+
}
364+
Located::Constant(constant) => {
365+
completer.expected_type = Some(constant.type_());
358366
Some(completer.completion_values())
359367
}
360368

compiler-core/src/language_server/tests/completion.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2252,3 +2252,17 @@ const x = "io."
22522252
);
22532253
assert_eq!(completions, vec![],);
22542254
}
2255+
2256+
#[test]
2257+
fn prefer_values_matching_expected_type() {
2258+
let code = "
2259+
pub fn main() -> Bool {
2260+
let wibble = 123
2261+
let wubble = True
2262+
let Wobble = 1.5
2263+
w
2264+
}
2265+
";
2266+
2267+
assert_completion!(TestProject::for_source(code), Position::new(5, 3));
2268+
}

compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__completion__completions_for_private_record_access.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ fn fun() {
1717
wibble
1818
kind: Field
1919
detail: Int
20-
sort: 1_wibble
20+
sort: 01_wibble
2121
wobble
2222
kind: Field
2323
detail: Int
24-
sort: 1_wobble
24+
sort: 01_wobble

compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__completion__completions_for_record_access.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ fn fun() {
1717
wibble
1818
kind: Field
1919
detail: Int
20-
sort: 1_wibble
20+
sort: 01_wibble
2121
wobble
2222
kind: Field
2323
detail: Int
24-
sort: 1_wobble
24+
sort: 01_wobble

compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__completion__completions_for_record_access_known_variant.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ fn fun(some_wibble: Wibble) {
1919
a
2020
kind: Field
2121
detail: Int
22-
sort: 1_a
22+
sort: 01_a
2323
b
2424
kind: Field
2525
detail: Int
26-
sort: 1_b
26+
sort: 01_b
2727
c
2828
kind: Field
2929
detail: Int
30-
sort: 1_c
30+
sort: 01_c
3131
d
3232
kind: Field
3333
detail: Int
34-
sort: 1_d
34+
sort: 01_d

compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__completion__completions_for_record_access_unknown_variant.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ fn fun(some_wibble: Wibble) {
1616
a
1717
kind: Field
1818
detail: Int
19-
sort: 1_a
19+
sort: 01_a

compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__completion__local_variable_anonymous_function.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ main
3939
wibble
4040
kind: Variable
4141
detail: Int
42-
sort: 2_wibble
42+
sort: 02_wibble
4343
desc: app
4444
docs: "A locally defined variable."
4545
edits:

compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__completion__local_variable_ignore_anonymous_function_args_nested.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ main
5151
wabble
5252
kind: Variable
5353
detail: Int
54-
sort: 2_wabble
54+
sort: 02_wabble
5555
desc: app
5656
docs: "A locally defined variable."
5757
edits:
5858
[5:4-5:4]: "wabble"
5959
wibble
6060
kind: Variable
6161
detail: Int
62-
sort: 2_wibble
62+
sort: 02_wibble
6363
desc: app
6464
docs: "A locally defined variable."
6565
edits:

compiler-core/src/language_server/tests/snapshots/gleam_core__language_server__tests__completion__local_variable_ignore_anonymous_function_returned.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,15 @@ main
5050
wabble
5151
kind: Variable
5252
detail: Int
53-
sort: 2_wabble
53+
sort: 02_wabble
5454
desc: app
5555
docs: "A locally defined variable."
5656
edits:
5757
[5:4-5:4]: "wabble"
5858
wibble
5959
kind: Variable
6060
detail: Int
61-
sort: 2_wibble
61+
sort: 02_wibble
6262
desc: app
6363
docs: "A locally defined variable."
6464
edits:

0 commit comments

Comments
 (0)