// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details #pragma once #include "Luau/Location.h" #include "Luau/LValue.h" #include "Luau/Variant.h" #include namespace Luau { struct Type; using TypeId = const Type*; struct TruthyPredicate; struct IsAPredicate; struct TypeGuardPredicate; struct EqPredicate; struct AndPredicate; struct OrPredicate; struct NotPredicate; using Predicate = Variant; using PredicateVec = std::vector; struct TruthyPredicate { LValue lvalue; Location location; }; struct IsAPredicate { LValue lvalue; Location location; TypeId ty; }; struct TypeGuardPredicate { LValue lvalue; Location location; std::string kind; // TODO: When singleton types arrive, replace this with `TypeId ty;` bool isTypeof; }; struct EqPredicate { LValue lvalue; TypeId type; Location location; }; struct AndPredicate { PredicateVec lhs; PredicateVec rhs; AndPredicate(PredicateVec&& lhs, PredicateVec&& rhs); }; struct OrPredicate { PredicateVec lhs; PredicateVec rhs; OrPredicate(PredicateVec&& lhs, PredicateVec&& rhs); }; struct NotPredicate { PredicateVec predicates; }; // Outside definition works around clang 15 issue where vector instantiation is triggered while Predicate is still incomplete inline AndPredicate::AndPredicate(PredicateVec&& lhs, PredicateVec&& rhs) : lhs(std::move(lhs)) , rhs(std::move(rhs)) { } inline OrPredicate::OrPredicate(PredicateVec&& lhs, PredicateVec&& rhs) : lhs(std::move(lhs)) , rhs(std::move(rhs)) { } template const T* get(const Predicate& predicate) { return get_if(&predicate); } } // namespace Luau