Skip to content

Commit

Permalink
Add completions for prelude values
Browse files Browse the repository at this point in the history
  • Loading branch information
GearsDatapacks authored and lpil committed Sep 10, 2024
1 parent a40f501 commit 44691b3
Show file tree
Hide file tree
Showing 38 changed files with 768 additions and 36 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,9 @@
unused.
([Giacomo Cavalieri](https://github.com/giacomocavalieri))

- The Language Server now correctly shows completions for values in the Gleam prelude.
([Surya Rose](https://github.com/GearsDatapacks))

## v1.4.1 - 2024-08-04

### Bug Fixes
Expand Down
39 changes: 37 additions & 2 deletions compiler-core/src/language_server/completer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use crate::{
line_numbers::LineNumbers,
type_::{
collapse_links, pretty::Printer, AccessorsMap, FieldMap, ModuleInterface, PreludeType,
Type, TypeConstructor, ValueConstructorVariant,
Type, TypeConstructor, ValueConstructorVariant, PRELUDE_MODULE_NAME,
},
Result,
};
Expand All @@ -42,7 +42,7 @@ enum CompletionKind {
LocallyDefined,
// Values or types defined in an already imported module
ImportedModule,
// Types defined in the prelude
// Types or values defined in the prelude
Prelude,
// Types defined in a module that has not been imported
ImportableModule,
Expand Down Expand Up @@ -531,6 +531,41 @@ where

let (insert_range, module_select) = surrounding_completion;

let mut push_prelude_completion = |label: &str, kind| {
let label = label.to_string();
let sort_text = Some(sort_text(CompletionKind::Prelude, &label));
completions.push(CompletionItem {
label,
detail: Some(PRELUDE_MODULE_NAME.into()),
kind: Some(kind),
sort_text,
..Default::default()
});
};

// Prelude values
for type_ in PreludeType::iter() {
match type_ {
PreludeType::Bool => {
push_prelude_completion("True", CompletionItemKind::ENUM_MEMBER);
push_prelude_completion("False", CompletionItemKind::ENUM_MEMBER);
}
PreludeType::Nil => {
push_prelude_completion("Nil", CompletionItemKind::ENUM_MEMBER);
}
PreludeType::Result => {
push_prelude_completion("Ok", CompletionItemKind::CONSTRUCTOR);
push_prelude_completion("Error", CompletionItemKind::CONSTRUCTOR);
}
PreludeType::BitArray
| PreludeType::Float
| PreludeType::Int
| PreludeType::List
| PreludeType::String
| PreludeType::UtfCodepoint => {}
}
}

// Module values
// Do not complete direct module values if the user has already started typing a module select.
// e.x. when the user has typed mymodule.| we know local module values are no longer relevant
Expand Down
11 changes: 11 additions & 0 deletions compiler-core/src/language_server/tests/completion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1479,3 +1479,14 @@ fn fun() {
);
assert_eq!(completions, vec![],);
}

#[test]
fn completions_for_prelude_values() {
let code = "
pub fn main() {
let my_bool = T
}
";

assert_completion!(TestProject::for_source(code), Position::new(2, 17));
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
---
source: compiler-core/src/language_server/tests/completion.rs
assertion_line: 1439
expression: "\nfn wibble(wibble arg1: String, wobble arg2: String) {\n arg1 <> arg2\n}\n\nfn fun() { // completion inside parens below includes labels\n let wibble = wibble()\n}\n"
---
fn wibble(wibble arg1: String, wobble arg2: String) {
Expand All @@ -13,6 +12,26 @@ fn fun() { // completion inside parens below includes labels


----- Completion content -----
Error
kind: Constructor
detail: gleam
sort: 4_Error
False
kind: EnumMember
detail: gleam
sort: 4_False
Nil
kind: EnumMember
detail: gleam
sort: 4_Nil
Ok
kind: Constructor
detail: gleam
sort: 4_Ok
True
kind: EnumMember
detail: gleam
sort: 4_True
fun
kind: Function
detail: fn() -> String
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
---
source: compiler-core/src/language_server/tests/completion.rs
assertion_line: 1457
expression: "\nimport dep\n\nfn fun() { // completion inside parens below includes labels\n let wibble = dep.wibble()\n}\n"
---
import dep
Expand All @@ -11,6 +10,26 @@ fn fun() { // completion inside parens below includes labels


----- Completion content -----
Error
kind: Constructor
detail: gleam
sort: 4_Error
False
kind: EnumMember
detail: gleam
sort: 4_False
Nil
kind: EnumMember
detail: gleam
sort: 4_Nil
Ok
kind: Constructor
detail: gleam
sort: 4_Ok
True
kind: EnumMember
detail: gleam
sort: 4_True
dep.wibble
kind: Function
detail: fn(String, String) -> String
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
---
source: compiler-core/src/language_server/tests/completion.rs
assertion_line: 1421
expression: "\nimport dep\n\nfn fun() { // completion inside parens below includes labels\n let wibble = dep.Wibble()\n}\n"
---
import dep
Expand All @@ -11,6 +10,26 @@ fn fun() { // completion inside parens below includes labels


----- Completion content -----
Error
kind: Constructor
detail: gleam
sort: 4_Error
False
kind: EnumMember
detail: gleam
sort: 4_False
Nil
kind: EnumMember
detail: gleam
sort: 4_Nil
Ok
kind: Constructor
detail: gleam
sort: 4_Ok
True
kind: EnumMember
detail: gleam
sort: 4_True
dep.Wibble
kind: Constructor
detail: fn(String, Int) -> Wibble
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
source: compiler-core/src/language_server/tests/completion.rs
expression: "\npub fn main() {\n let my_bool = T\n}\n"
---
pub fn main() {
let my_bool = T|
}


----- Completion content -----
Error
kind: Constructor
detail: gleam
sort: 4_Error
False
kind: EnumMember
detail: gleam
sort: 4_False
Nil
kind: EnumMember
detail: gleam
sort: 4_Nil
Ok
kind: Constructor
detail: gleam
sort: 4_Ok
True
kind: EnumMember
detail: gleam
sort: 4_True
main
kind: Function
detail: fn() -> a
sort: 2_main
desc: app
edits:
[2:16-2:16]: "main"
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
---
source: compiler-core/src/language_server/tests/completion.rs
assertion_line: 1362
expression: "\ntype Wibble {\n Wibble(wibble: Int, wobble: Int)\n Wobble(wabble: Int, wobble: Int)\n}\n\nfn fun() {\n let wibble = Wibble(1, 2)\n wibble.wobble\n}\n"
---
type Wibble {
Expand All @@ -15,6 +14,26 @@ fn fun() {


----- Completion content -----
Error
kind: Constructor
detail: gleam
sort: 4_Error
False
kind: EnumMember
detail: gleam
sort: 4_False
Nil
kind: EnumMember
detail: gleam
sort: 4_Nil
Ok
kind: Constructor
detail: gleam
sort: 4_Ok
True
kind: EnumMember
detail: gleam
sort: 4_True
wobble
kind: Field
detail: Int
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
---
source: compiler-core/src/language_server/tests/completion.rs
assertion_line: 1345
expression: "\npub type Wibble {\n Wibble(wibble: Int, wobble: Int)\n Wobble(wabble: Int, wobble: Int)\n}\n\nfn fun() {\n let wibble = Wibble(1, 2)\n wibble.wobble\n}\n"
---
pub type Wibble {
Expand All @@ -15,6 +14,26 @@ fn fun() {


----- Completion content -----
Error
kind: Constructor
detail: gleam
sort: 4_Error
False
kind: EnumMember
detail: gleam
sort: 4_False
Nil
kind: EnumMember
detail: gleam
sort: 4_Nil
Ok
kind: Constructor
detail: gleam
sort: 4_Ok
True
kind: EnumMember
detail: gleam
sort: 4_True
wobble
kind: Field
detail: Int
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
---
source: compiler-core/src/language_server/tests/completion.rs
assertion_line: 1403
expression: "\npub type Wibble {\n Wibble(wibble: String, wobble: Int)\n}\n\nfn fun() { // completion inside parens below includes labels\n let wibble = Wibble()\n}\n"
---
pub type Wibble {
Expand All @@ -13,6 +12,26 @@ fn fun() { // completion inside parens below includes labels


----- Completion content -----
Error
kind: Constructor
detail: gleam
sort: 4_Error
False
kind: EnumMember
detail: gleam
sort: 4_False
Nil
kind: EnumMember
detail: gleam
sort: 4_Nil
Ok
kind: Constructor
detail: gleam
sort: 4_Ok
True
kind: EnumMember
detail: gleam
sort: 4_True
Wibble
kind: Constructor
detail: fn(String, Int) -> Wibble
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,32 @@
---
source: compiler-core/src/language_server/tests/completion.rs
assertion_line: 339
expression: "\nimport dep2\n"
---
|
import dep2


----- Completion content -----
Error
kind: Constructor
detail: gleam
sort: 4_Error
False
kind: EnumMember
detail: gleam
sort: 4_False
Nil
kind: EnumMember
detail: gleam
sort: 4_Nil
Ok
kind: Constructor
detail: gleam
sort: 4_Ok
True
kind: EnumMember
detail: gleam
sort: 4_True
dep.wobble
kind: Function
detail: fn() -> Nil
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,28 @@
---
source: compiler-core/src/language_server/tests/completion.rs
assertion_line: 331
expression: ""
---
----- Completion content -----
Error
kind: Constructor
detail: gleam
sort: 4_Error
False
kind: EnumMember
detail: gleam
sort: 4_False
Nil
kind: EnumMember
detail: gleam
sort: 4_Nil
Ok
kind: Constructor
detail: gleam
sort: 4_Ok
True
kind: EnumMember
detail: gleam
sort: 4_True
dep.wobble
kind: Function
detail: fn() -> Nil
Expand Down
Loading

0 comments on commit 44691b3

Please sign in to comment.