// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details #pragma once #include "Luau/Ast.h" // Used for some of the enumerations #include "Luau/NotNull.h" #include "Luau/Variant.h" #include #include #include namespace Luau { struct Scope2; struct TypeVar; using TypeId = const TypeVar*; struct TypePackVar; using TypePackId = const TypePackVar*; // subType <: superType struct SubtypeConstraint { TypeId subType; TypeId superType; }; // subPack <: superPack struct PackSubtypeConstraint { TypePackId subPack; TypePackId superPack; }; // subType ~ gen superType struct GeneralizationConstraint { TypeId generalizedType; TypeId sourceType; Scope2* scope; }; // subType ~ inst superType struct InstantiationConstraint { TypeId subType; TypeId superType; }; struct UnaryConstraint { AstExprUnary::Op op; TypeId operandType; TypeId resultType; }; struct BinaryConstraint { AstExprBinary::Op op; TypeId leftType; TypeId rightType; TypeId resultType; }; // name(namedType) = name struct NameConstraint { TypeId namedType; std::string name; }; using ConstraintV = Variant; using ConstraintPtr = std::unique_ptr; struct Constraint { explicit Constraint(ConstraintV&& c); Constraint(const Constraint&) = delete; Constraint& operator=(const Constraint&) = delete; ConstraintV c; std::vector> dependencies; }; inline Constraint& asMutable(const Constraint& c) { return const_cast(c); } template T* getMutable(Constraint& c) { return ::Luau::get_if(&c.c); } template const T* get(const Constraint& c) { return getMutable(asMutable(c)); } } // namespace Luau