mirror of
https://github.com/luau-lang/luau.git
synced 2025-04-21 04:03:47 +01:00
# General This week has been focused primarily on bugfixes, with a ton of usability improvements to the new solver, fragment autocomplete, and the concrete syntax tree project. ## Runtime - Fix an assertion caused by failing to allocate native code pages. - Expose a `lua_pushrequire` function, which performs the same initialization steps as `luaopen_require` but does not register require globally. This lets users create specialized, custom `requires`. # New Solver - Fix a bug in simplification of types caused by combinatorial explosion of intersection and union types. - Fix a memory leak in fragment autocomplete - Improve the isolation of modules in fragment autocomplete - Throw errors when users define a type function with the name `typeof` - Continue to narrow intersection types which might be `never`. - Major rework of generalization continues - we are blazing a new path with eager + non-reentrant generalization and actively working to make these more performant and less error prone. - Improve the ability of `and/or` type functions to reduce, even when their arguments are generic. - Report arity mismatches for undersaturated calls with unknown parameters # New Non-Strict - Extends the new non-strict mode to report unknown symbols in types # Old Solver - Fix a crash caused by excessive stack usage during typechecking # Misc - Improvements to Concrete Syntax Tree location tracking for string table props. --- Co-authored-by: Andy Friesen <afriesen@roblox.com> Co-authored-by: Ariel Weiss <aaronweiss@roblox.com> Co-authored-by: Aviral Goel <agoel@roblox.com> Co-authored-by: Hunter Goldstein <hgoldstein@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: Vighnesh Vijay <vvijay@roblox.com> Co-authored-by: Vyacheslav Egorov <vegorov@roblox.com>
82 lines
2.2 KiB
C++
82 lines
2.2 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/NotNull.h"
|
|
#include "Luau/TypeFwd.h"
|
|
|
|
namespace Luau
|
|
{
|
|
|
|
template<typename TID>
|
|
struct GeneralizationParams
|
|
{
|
|
bool foundOutsideFunctions = false;
|
|
size_t useCount = 0;
|
|
Polarity polarity = Polarity::None;
|
|
};
|
|
|
|
template<typename TID>
|
|
struct GeneralizationResult
|
|
{
|
|
std::optional<TID> result;
|
|
|
|
// True if the provided type was replaced with a generic.
|
|
bool wasReplacedByGeneric = false;
|
|
|
|
bool resourceLimitsExceeded = false;
|
|
|
|
explicit operator bool() const
|
|
{
|
|
return bool(result);
|
|
}
|
|
};
|
|
|
|
// Replace a single free type by its bounds according to the polarity provided.
|
|
GeneralizationResult<TypeId> generalizeType(
|
|
NotNull<TypeArena> arena,
|
|
NotNull<BuiltinTypes> builtinTypes,
|
|
NotNull<Scope> scope,
|
|
TypeId freeTy,
|
|
const GeneralizationParams<TypeId>& params
|
|
);
|
|
|
|
// Generalize one type pack
|
|
GeneralizationResult<TypePackId> generalizeTypePack(
|
|
NotNull<TypeArena> arena,
|
|
NotNull<BuiltinTypes> builtinTypes,
|
|
NotNull<Scope> scope,
|
|
TypePackId tp,
|
|
const GeneralizationParams<TypePackId>& params
|
|
);
|
|
|
|
void sealTable(NotNull<Scope> scope, TypeId ty);
|
|
|
|
/** Attempt to generalize a type.
|
|
*
|
|
* If generalizationTarget is set, then only that type will be replaced by its
|
|
* bounds. The way this is intended to be used is that ty is some function that
|
|
* is not fully generalized, and generalizationTarget is a type within its
|
|
* signature. There should be no further constraints that could affect the
|
|
* bounds of generalizationTarget.
|
|
*
|
|
* Returns nullopt if generalization failed due to resources limits.
|
|
*/
|
|
std::optional<TypeId> generalize(
|
|
NotNull<TypeArena> arena,
|
|
NotNull<BuiltinTypes> builtinTypes,
|
|
NotNull<Scope> scope,
|
|
NotNull<DenseHashSet<TypeId>> cachedTypes,
|
|
TypeId ty,
|
|
std::optional<TypeId> generalizationTarget = {}
|
|
);
|
|
|
|
void pruneUnnecessaryGenerics(
|
|
NotNull<TypeArena> arena,
|
|
NotNull<BuiltinTypes> builtinTypes,
|
|
NotNull<Scope> scope,
|
|
NotNull<DenseHashSet<TypeId>> cachedTypes,
|
|
TypeId ty
|
|
);
|
|
|
|
} // namespace Luau
|