mirror of
https://github.com/luau-lang/luau.git
synced 2025-08-26 11:27:08 +01:00
# General * Expose an optional `get_alias` API as an alternative to `get_config` in Luau.Require and Luau.RequireNavigator. * Improve the Luau CLI's virtual filesystem implementation to fix bugs related to `init.luau`. Fixes https://github.com/luau-lang/luau/issues/1816 # New Type Solver * Avoid double reporting errors when erroneous arguments are provided to type functions. * Fix some instances of unresovable cyclic type functions in loops by only considering the first loop cycles. This results in some type inference inaccuracies when the type of a variable in loop through multiple iterations. Fixes https://github.com/luau-lang/luau/issues/1413. * Better generalize free types that have meaningful lower and upper bounds, especially for table indexers. * Report more specific errors when assigning or returning table literal types, instead of citing the *entire* table type. * Inference for functions with generic type packs is greatly improved. * Fix some internal compiler exceptions when using type-stating functions like `table.freeze` in `if _ then _ else _` expressions and short circuiting binary operations. * More consistently simplify unions of primitive types, especially in array-like and dictionary-like tables. * Fix a crash when type checking an erroneous type alias containing `typeof` with a type assertion expression, as in: ``` type MyTable = {} -- This will error at type checking time as it's a duplicate type MyTable = typeof(setmetatable(SomeTable :: {}, SomeMetaTable)); ``` * Fix a crash when inferring the type of an index expression where the indexee is invalid (e.g. `nil`). # Runtime * Avoid throwing an exception from `luau_load` if we run out of memory. * Type functions are no longer compiled and included in bytecode. Fixes #1817. * Fix some instances of Luau C API functions reading invalid debug information (generally when the first or last instruction of a block was being inspected). Fixes #1369. * Avoid potential signed integer overflow when doing bounds checks on tables. * Support 16 byte aligned userdata objects when system allocation alignment is also 16 bytes. * Fix memory leaks in `Luau.Require` when using VM build with no exceptions. Fixes #1827. --------- Co-authored-by: Andy Friesen <afriesen@roblox.com> Co-authored-by: Ariel Weiss <aaronweiss@roblox.com> Co-authored-by: Hunter Goldstein <hgoldstein@roblox.com> Co-authored-by: James McNellis <jmcnellis@roblox.com> Co-authored-by: Sora Kanosue <skanosue@roblox.com> Co-authored-by: Talha Pathan <tpathan@roblox.com> Co-authored-by: Varun Saini <vsaini@roblox.com> Co-authored-by: Vyacheslav Egorov <vegorov@roblox.com>
95 lines
3.5 KiB
C++
95 lines
3.5 KiB
C++
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
|
#pragma once
|
|
|
|
#include "Luau/Scope.h"
|
|
#include "Luau/Type.h"
|
|
|
|
#include <optional>
|
|
|
|
namespace Luau
|
|
{
|
|
|
|
inline constexpr char kRequireTagName[] = "require";
|
|
|
|
struct Frontend;
|
|
struct GlobalTypes;
|
|
struct TypeChecker;
|
|
struct TypeArena;
|
|
struct Subtyping;
|
|
|
|
void registerBuiltinGlobals(Frontend& frontend, GlobalTypes& globals, bool typeCheckForAutocomplete = false);
|
|
TypeId makeUnion(TypeArena& arena, std::vector<TypeId>&& types);
|
|
TypeId makeIntersection(TypeArena& arena, std::vector<TypeId>&& types);
|
|
|
|
/** Build an optional 't'
|
|
*/
|
|
TypeId makeOption(NotNull<BuiltinTypes> builtinTypes, TypeArena& arena, TypeId t);
|
|
|
|
/** Small utility function for building up type definitions from C++.
|
|
*/
|
|
TypeId makeFunction( // Monomorphic
|
|
TypeArena& arena,
|
|
std::optional<TypeId> selfType,
|
|
std::initializer_list<TypeId> paramTypes,
|
|
std::initializer_list<TypeId> retTypes,
|
|
bool checked = false
|
|
);
|
|
|
|
TypeId makeFunction( // Polymorphic
|
|
TypeArena& arena,
|
|
std::optional<TypeId> selfType,
|
|
std::initializer_list<TypeId> generics,
|
|
std::initializer_list<TypePackId> genericPacks,
|
|
std::initializer_list<TypeId> paramTypes,
|
|
std::initializer_list<TypeId> retTypes,
|
|
bool checked = false
|
|
);
|
|
|
|
TypeId makeFunction( // Monomorphic
|
|
TypeArena& arena,
|
|
std::optional<TypeId> selfType,
|
|
std::initializer_list<TypeId> paramTypes,
|
|
std::initializer_list<std::string> paramNames,
|
|
std::initializer_list<TypeId> retTypes,
|
|
bool checked = false
|
|
);
|
|
|
|
TypeId makeFunction( // Polymorphic
|
|
TypeArena& arena,
|
|
std::optional<TypeId> selfType,
|
|
std::initializer_list<TypeId> generics,
|
|
std::initializer_list<TypePackId> genericPacks,
|
|
std::initializer_list<TypeId> paramTypes,
|
|
std::initializer_list<std::string> paramNames,
|
|
std::initializer_list<TypeId> retTypes,
|
|
bool checked = false
|
|
);
|
|
|
|
void attachMagicFunction(TypeId ty, std::shared_ptr<MagicFunction> fn);
|
|
Property makeProperty(TypeId ty, std::optional<std::string> documentationSymbol = std::nullopt);
|
|
void assignPropDocumentationSymbols(TableType::Props& props, const std::string& baseName);
|
|
|
|
std::string getBuiltinDefinitionSource();
|
|
std::string getTypeFunctionDefinitionSource();
|
|
|
|
void addGlobalBinding(GlobalTypes& globals, const std::string& name, TypeId ty, const std::string& packageName);
|
|
void addGlobalBinding(GlobalTypes& globals, const std::string& name, Binding binding);
|
|
void addGlobalBinding(GlobalTypes& globals, const ScopePtr& scope, const std::string& name, TypeId ty, const std::string& packageName);
|
|
void addGlobalBinding(GlobalTypes& globals, const ScopePtr& scope, const std::string& name, Binding binding);
|
|
std::optional<Binding> tryGetGlobalBinding(GlobalTypes& globals, const std::string& name);
|
|
Binding* tryGetGlobalBindingRef(GlobalTypes& globals, const std::string& name);
|
|
TypeId getGlobalBinding(GlobalTypes& globals, const std::string& name);
|
|
|
|
|
|
/** A number of built-in functions are magical enough that we need to match on them specifically by
|
|
* name when they are called. These are listed here to be used whenever necessary, instead of duplicating this logic repeatedly.
|
|
*/
|
|
|
|
bool matchSetMetatable(const AstExprCall& call);
|
|
bool matchTableFreeze(const AstExprCall& call);
|
|
bool matchAssert(const AstExprCall& call);
|
|
|
|
// Returns `true` if the function should introduce typestate for its first argument.
|
|
bool shouldTypestateForFirstArgument(const AstExprCall& call);
|
|
|
|
} // namespace Luau
|