mirror of
https://github.com/luau-lang/luau.git
synced 2024-12-13 05:20:38 +00:00
c5089def6e
* Fix a bug where reading a property from an unsealed table caused inference to improperly infer the existence of that property. * Fix #827 We have also made a lot of progress on the new solver and the JIT. Both projects are still in the process of being built out. Neither are ready for general use yet. We are mostly working to tighten up how the new solver handles refinements and updates to unsealed tables to bring it up to the same level as the old solver. --------- Co-authored-by: Arseny Kapoulkine <arseny.kapoulkine@gmail.com> Co-authored-by: Vyacheslav Egorov <vegorov@roblox.com>
76 lines
1.5 KiB
C++
76 lines
1.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/Def.h"
|
|
#include "Luau/TypedAllocator.h"
|
|
#include "Luau/Variant.h"
|
|
|
|
namespace Luau
|
|
{
|
|
|
|
struct Type;
|
|
using TypeId = const Type*;
|
|
|
|
struct Variadic;
|
|
struct Negation;
|
|
struct Conjunction;
|
|
struct Disjunction;
|
|
struct Equivalence;
|
|
struct Proposition;
|
|
using Refinement = Variant<Variadic, Negation, Conjunction, Disjunction, Equivalence, Proposition>;
|
|
using RefinementId = Refinement*; // Can and most likely is nullptr.
|
|
|
|
struct Variadic
|
|
{
|
|
std::vector<RefinementId> refinements;
|
|
};
|
|
|
|
struct Negation
|
|
{
|
|
RefinementId refinement;
|
|
};
|
|
|
|
struct Conjunction
|
|
{
|
|
RefinementId lhs;
|
|
RefinementId rhs;
|
|
};
|
|
|
|
struct Disjunction
|
|
{
|
|
RefinementId lhs;
|
|
RefinementId rhs;
|
|
};
|
|
|
|
struct Equivalence
|
|
{
|
|
RefinementId lhs;
|
|
RefinementId rhs;
|
|
};
|
|
|
|
struct Proposition
|
|
{
|
|
DefId def;
|
|
TypeId discriminantTy;
|
|
};
|
|
|
|
template<typename T>
|
|
const T* get(RefinementId refinement)
|
|
{
|
|
return get_if<T>(refinement);
|
|
}
|
|
|
|
struct RefinementArena
|
|
{
|
|
RefinementId variadic(const std::vector<RefinementId>& refis);
|
|
RefinementId negation(RefinementId refinement);
|
|
RefinementId conjunction(RefinementId lhs, RefinementId rhs);
|
|
RefinementId disjunction(RefinementId lhs, RefinementId rhs);
|
|
RefinementId equivalence(RefinementId lhs, RefinementId rhs);
|
|
RefinementId proposition(DefId def, TypeId discriminantTy);
|
|
|
|
private:
|
|
TypedAllocator<Refinement> allocator;
|
|
};
|
|
|
|
} // namespace Luau
|