Releases: luau-lang/luau
0.655
What's Changed
- Convert Luau heap dumps to Chrome heap snapshots by @jkelaty-rbx in #1554
New Solver
- Type functions should be able to signal whether or not irreducibility is due to an error
- Do not generate extra expansion constraint for uninvoked user-defined type functions
- Print in a user-defined type function reports as an error instead of logging to stdout
- Many e-graphs bugfixes and performance improvements
- Many general bugfixes and improvements to the new solver as a whole
- Fixed issue with used-defined type functions not being able to call each other
- Infer types of globals under new type solver
Fragment Autocomplete
- Miscellaneous fixes to make interop with the old solver better
Runtime
- Support disabling specific built-in functions from being fast-called or constant-evaluated (Closes #1538)
- New compiler option
disabledBuiltins
accepts a list of library function names like "tonumber" or "math.cos"
- New compiler option
- Added constant folding for vector arithmetic
- Added constant propagation and type inference for vector globals (Fixes #1511)
- New compiler option
librariesWithKnownMembers
accepts a list of libraries for members of which a request for constant value and/or type will be made libraryMemberTypeCb
callback is called to get the type of a global, return one of theLuauBytecodeType
values. 'boolean', 'number', 'string' and 'vector' type are supported.libraryMemberConstantCb
callback is called to setup the constant value of a global. To set a value, C APIluau_set_compile_constant_*
or C++ APIsetCompileConstant*
functions should be used.
- New compiler option
New Contributors
- @jkelaty-rbx made their first contribution in #1554
Full Changelog: 0.654...0.655
What's changed
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Aviral Goel agoel@roblox.com
Co-authored-by: Daniel Angel danielangel@roblox.com
Co-authored-by: Jonathan Kelaty jkelaty@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Varun Saini vsaini@roblox.com
Co-authored-by: Vighnesh Vijay vvijay@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
0.654
What's Changed?
- Support dead store elimination for
STORE_VECTOR
instruction - Fix parser hang when a separator is used between Luau class
declaration properties - Provide properties and metatable for built-in vector type definition
to fix type errors - Fix Fragment Autocomplete to ensure correct parentheses insertion
behavior. - Add support for 'thread' and 'buffer' primitive types in user-defined
type functions
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Vighnesh Vijay vvijay@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
New Contributors
Full Changelog: 0.653...0.654
0.653
What's Changed?
- Optimized the vector dot product by up to 24%
- Allow for x/y/z/X/Y/Z vector field access by registering a
vector
metatable
with an__index
method (Fixes #1521) - Fixed a bug preventing consistent recovery from parse errors in table types
- Optimized
k*n
andk+n
when types are known - Allow fragment autocomplete to handle cases like the automatic insertion of
parens, keywords, strings, etc., while maintaining a correct relative positioning
New Solver
- Allow for
nil
assignment to tables and classes with indexers
Internal Contributors:
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Aviral Goel agoel@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Varun Saini vsaini@roblox.com
Co-authored-by: Vighnesh Vijay vvijay@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
Full Changelog: 0.652...0.653
0.652
What's Changed
- Add support for mixed-mode type checking, which allows modules checked
in the old type solver to be checked and autocompleted by the new one. - Generalize
RequireResolver
to support require-by-string semantics in
luau-analyze
. - Fix a bug in incremental autocomplete where
DefId
s associated with
index expressions were not correctly picked up. - Fix a bug that prevented "complex" types in generic parameters (for
example,local x: X<(() -> ())?>
). - CodeGen: Rewrite dot product lowering using a dedicated IR instruction by @zeux in #1512
- Fix mesh-normal-vector benchmark array access by @zeux in #1514
- Remove noexcepts from Config by @vrn-sn in #1523
Issues fixed
New Contributors
Full Changelog: 0.651...0.652
Internal Contributors:
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Varun Saini vsaini@roblox.com
Co-authored-by: Vighnesh Vijay vvijay@roblox.com
0.651
What's Changed
- Fragment Autocomplete: a new API allows for type checking a small fragment of code against an existing file, significantly speeding up autocomplete performance in large files.
- Requiring a path with a ".lua" or ".luau" extension will now have a bespoke error suggesting to remove said extension.
- Fixes a bug in which whether two
Luau::Symbol
s are equal depends on whether the new solver is enabled. - Fix definition module name & location by @checkraisefold in #1495
- Pre-populate/duplicate check class definitions (new solver) by @checkraisefold in #1493
- Set the defining module even when the new solver cloned the type. by @aatxe in #1506
- Replace old site urls by @Barocena in #1505
New Solver
- E-Graphs have landed: this is an ongoing approach to make the new type solver simplify types in a more consistent and principled manner, based on similar work (see: https://egraphs-good.github.io/).
- Adds support for exporting / local user type functions (previously they were always exported).
- Fixes a set of bugs in which the new solver will fail to complete inference for simple expressions with just literals and operators.
General Updates
New Contributors
- @checkraisefold made their first contribution in #1495
- @Barocena made their first contribution in #1505
Full Changelog: 0.650...651
Internal Contributors:
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: David Cope dcope@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Varun Saini vsaini@roblox.com
Co-authored-by: Vighnesh Vijay vvijay@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
0.650
What's Changed
- New
vector
library! See https://rfcs.luau.org/vector-library.html for details - Replace the use of non-portable
strnlen
withmemchr
.strnlen
is not part of any C or C++ standard. - Introduce
lua_newuserdatataggedwithmetatable
for faster tagged userdata creation of userdata with metatables registered withlua_setuserdatametatable
Old Solver
- It used to be the case that a module's result type would unconditionally be inferred to be
any
if it imported any module that participates in any import cycle. This is now fixed.
New Solver
- Improve inference of
table.freeze
: We now infer read-only properties on tables after they have been frozen. - We now correctly flag cases where
string.format
is called with 0 arguments. - Fix a bug in user-defined type functions where table properties could be lost if the table had a metatable
- Reset the random number seed for each evaluation of a type function
- We now retry subtyping arguments if it failed due to hidden variadics.
Internal Contributors
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Aviral Goel agoel@roblox.com
Co-authored-by: David Cope dcope@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
Full Changelog: 0.649...0.650
0.649
What's new?
- More progress on the upcoming analysis API for fragment type inference.
- Fix a bug in type normalization where intersection did not appropriately respect resource limits (affects new and old type solvers).
- Allow type normalization to track cyclic pairs of types in inhabitance checks.
- Fix a bug in the old type solver where
Unifier
did not necessarily live long enough. - Check the coroutine stack size before resuming in the Luau VM.
New Type Solver
- Add support for typestating
table.freeze
and updated its behavior to transform the given table types into being marked read-only for all of its properties. More to come here for indexers when we add support for read-only indexers. - Fix #1453 by adding a missing arity check to
string.format
. - Fix a crash when editing caused by invalid AST states not being visited properly by the type solver.
- Fix a crash in type simplification caused by missing follow calls.
Internal Contributors:
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Vighnesh Vijay vvijay@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
0.648
What's new
- Added
math.map
function to the standard library, based on RFC for math.map FileResolver
can provide an implementation ofgetRequireSuggestions
to provide auto-complete suggestions for require-by-string
New Solver
- In user-defined type functions,
readproperty
andwriteproperty
will returnnil
instead of erroring if property is not found - Fixed incorrect scope of variadic arguments in the data-flow graph
- Fixed multiple assertion failures
Internal Contributors:
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Varun Saini vsaini@roblox.com
Co-authored-by: Vighnesh Vijay vvijay@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
Full Changelog: 0.647...0.648
0.647
What's Changed
- Rename
type
field of AstStatTypeAlias in JSON Encoder by @Dekkonot in #1461 - Support function attributes in luau-ast by @Dekkonot in #1466
- Fix an old solver crash that occurs in the presence of cyclic
requires()
New Solver
- Improvements to Luau user-defined type function library
- Avoid asserting on unexpected metatable types
- Properties in user defined type functions should have a consistent iteration order - in this case it is insertion ordering
Runtime
- Track VM allocations for telemetry
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: James McNellis jmcnellis@roblox.com
Co-authored-by: Varun Saini vsaini@roblox.com
Co-authored-by: Vighnesh Vijay vvijay@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
Full Changelog: 0.646...0.647
0.646
What's Changed?
- Fix some cases where documentation symbols would not be available when mouseovering at certain positions in the code
- Scaffolding to help embedders have more control over how
typeof(x)
refines types - Refinements to require-by-string semantics. See luau-lang/rfcs#56 for details.
New Solver
- Fix many crashes in the new solver (thanks you for your bug reports!)
- Type functions all evaluate in a single VM. This should improve typechecking performance and reduce memory use.
export type function
is now forbidden and fails with a clear error message- Type functions that access locals in the surrounding environment are now properly a parse error
- You can now use
:setindexer(types.never, types.never)
to delete an indexer from a table type.
Internal Contributors
Co-authored-by: Aaron Weiss aaronweiss@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Varun Saini vsaini@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com
Full Changelog: 0.645...0.646