changelog/v1.4.md
Fixed a bug where pipe function arity errors could have an incorrect error message. (sobolevn)
Fixed a bug where the case of type parameters would not be checked. (Surya Rose)
Fixed a bug where the language server would still show completions when inside a comment. (Giacomo Cavalieri)
gleam docs build now takes an optional --target flag to specify the target
platform for the generated documentation.
(Jiangda Wang)
Warnings are now emitted each time the project is built, even if the module the warnings originated from were loaded from the cache rather than recompiling. (Louis Pilfold)
Labelled arguments can now use the label shorthand syntax. This means that when you're passing a variable as a labelled argument and it happens to have the same name as the label, you can omit the variable name:
pub fn date(day day: Int, month month: Month, year year: Year) -> Date {
todo
}
pub fn main() {
let day = 11
let month = October
let year = 1998
date(year:, month:, day:)
// This is the same as writing
// date(year: year, month: month, day: day)
}
Labelled pattern variables can now use the label shorthand syntax. This means that when you're pattern matching on a record constructor and binding its labelled fields to variables that happen to have the same name, you can omit the variable name:
pub type Date
Date(day: Int, month: Month, year: Year)
}
pub fn main() {
case Date(11, October, 1998) {
Date(year:, month:, day:) -> todo
// This is the same as writing
// Date(year: year, month: month, day: day) -> todo
}
}
The warning for the deprecated [..] pattern has been improved.
(Giacomo Cavalieri)
Record accessors are now fault tolerant. This means an invalid label can be properly detected and won't invalidate the rest of the expression. (Ameen Radwan)
Erlang type spec generation has been improved to avoid new warnings emitted in OTP27. (Damir Vandic)
Error messages for invalid record constructors now contain a restructured example of what the user likely intended. This is especially helpful for users coming from other languages, like Rust or Go.
For example, provided a User type:
pub type User {
name: String
}
The compiler errors with the following message:
error: Syntax error
┌─ /src/parse/error.gleam:3:5
│
3 │ name: String,
│ ^^^^ I was not expecting this
Each custom type variant must have a constructor:
pub type User {
User(
name: String,
)
}
The <> string concatenation operator can now be used in constant
expressions.
(Thomas)
Function calls are now fault tolerant. This means that errors in the function call arguments won't stop the rest of the call from being analysed. (Ameen Radwan)
The error message presented when a function is called in a guard has been improved. (Thomas)
Case expressions are now fault tolerant. This means an subject, pattern, guard, or then body can be properly detected and won't invalidate the rest of the expression. (Ameen Radwan)
Documentation comments that come before a regular comment are no longer clumped together with the documentation of the following definition. Now commenting out a definition won't result in its documentation merging with the following one's.
/// This doc comment will be ignored!
// a commented definition
// fn wibble() {}
/// Wibble's documentation.
fn wibble() { todo }
The little and big endianness options, the signed and unsigned integer
options, and sized floats (32-bit and 64-bit), can now be used in bit array
expressions and patterns on the JavaScript target.
(Richard Viney)
The utf8 option can now be used with constant strings in bit array patterns
on the JavaScript target.
(Richard Viney)
The formatter will no longer move a documentation comment below a regular comment following it. This snippet of code is left as it is by the formatter:
/// This doc comment will be ignored!
// a commented definition
// fn wibble() {}
/// Wibble's documentation.
fn wibble() {
todo
}
While previously all documentation comments would be merged together into one, ignoring the regular comment separating them:
// a commented definition
// fn wibble() {}
/// This doc comment will be ignored!
/// Wibble's documentation.
fn wibble() {
todo
}
The language server can now show completions for fields if a record access is being attempted. (Ameen Radwan)
The language server will now insert a blank line before the first statement when inserting a new import and there are no other imports at the top of the module. (Zhomart Mukhamejanov)
The language server now suggests a code a action to rename variables, types and functions when they don't match the Gleam naming requirements:
let myNumber = 10
Becomes:
let my_number = 10
The language server can now suggest a code action to convert let assert into
a case expression:
let assert Ok(value) = get_result()
Becomes:
let value = case get_result() {
Ok(value) -> value
_ -> panic
}
The language server can now show signature help when writing functions. (Giacomo Cavalieri)
The language server now supports listing document symbols, such as functions and constants, for the current Gleam file. (PgBiel)
The language server can now suggest a code action to automatically use shorthand labels where possible:
case date {
Day(day: day, month: month, year: year) -> todo
}
Becomes:
case date {
Day(day:, month:, year:) -> todo
}
The language server can now show completions for labels when writing a function call or record construction. (Ameen Radwan)
The language server can now suggest a code action to fill in the labels of a function call:
pub type Date {
Date(year: Int, month: Int, day: Int)
}
pub fn main() {
Date()
}
Becomes:
pub type Date {
Date(year: Int, month: Int, day: Int)
}
pub fn main() {
Date(year: todo, month: todo, day: todo)
}
Completions are now sorted by priority based on why the completion is in the list. This means that more specific completions like labels and local definitions will be shown before more broad completions like functions from a not yet imported module. (Ameen Radwan)
Functions, types and constructors named module_info are now escaped
in generated Erlang code to avoid conflicts with the builtin
module_info/0 and module_info/1 functions.
(Juraj Petráš)
Fixed formatting of comments at the start of a case branch. (Giacomo Cavalieri)
Fixed a bug where a private type could be leaked from an internal module. (Ameen Radwan)
Fixed a bug where certain binops would not wrap their arguments properly thus generating invalid JavaScript. (Ameen Radwan)
Fixed formatting of function definitions marked as @internal
(Giacomo Cavalieri)
Fixed a bug where importing a record constructor in an unqualified fashion and aliasing it and then using it in a case guard expression would generate invalid JavaScript. (PgBiel)
Fixed a bug where the compiler would report errors for duplicate @external
attributes with inconsistent spans between Erlang and JavaScript.
(Connor Szczepaniak)
Fixed a bug where gleam add would fail to parse version specifiers
correctly.
(Louis Pilfold)
Fixed a bug where single clause case expressions could generate JavaScript code with incorrectly rewritten JavaScript variable names. (Louis Pilfold)