Skip to content

Latest commit

 

History

History
320 lines (234 loc) · 8.45 KB

CHANGELOG.md

File metadata and controls

320 lines (234 loc) · 8.45 KB

Changelog

Unreleased

Build tool

  • 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)

Compiler

  • 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)
    }

    (Giacomo Cavalieri)

  • 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
      }
    
    }

    (Giacomo Cavalieri)

  • 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,
      )
    }
    

    (Rahul D. Ghosal)

  • 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 }

    (Giacomo Cavalieri)

  • 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)

Formatter

  • 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
    }

    (Giacomo Cavalieri)

Language Server

  • 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

    (Gears)

  • 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
    }

    (Gears)

  • 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
    }

    (Giacomo Cavalieri)

  • 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)
    }

    (Giacomo Cavalieri)

Bug Fixes

  • 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)

v1.3.2 - 2024-07-11

Language Server

  • The language server no longer shows completions when inside a literal string. (Giacomo Cavalieri)

Bug Fixes

  • 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)

v1.3.1 - 2024-07-10

Bug Fixes

  • Fixes a bug with import cycle detection when there is more than 2 imports in the cycle. (Ameen Radwan)