// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details

#pragma once

#include "Luau/NotNull.h"
#include "Luau/Substitution.h"
#include "Luau/TypeFwd.h"

#include <memory>

namespace Luau
{

struct TypeArena;
struct Scope;
struct InternalErrorReporter;
using ScopePtr = std::shared_ptr<Scope>;

// A substitution which replaces free types by any
struct Anyification : Substitution
{
    Anyification(TypeArena* arena, NotNull<Scope> scope, NotNull<BuiltinTypes> builtinTypes, InternalErrorReporter* iceHandler, TypeId anyType,
        TypePackId anyTypePack);
    Anyification(TypeArena* arena, const ScopePtr& scope, NotNull<BuiltinTypes> builtinTypes, InternalErrorReporter* iceHandler, TypeId anyType,
        TypePackId anyTypePack);
    NotNull<Scope> scope;
    NotNull<BuiltinTypes> builtinTypes;
    InternalErrorReporter* iceHandler;

    TypeId anyType;
    TypePackId anyTypePack;
    bool normalizationTooComplex = false;
    bool isDirty(TypeId ty) override;
    bool isDirty(TypePackId tp) override;
    TypeId clean(TypeId ty) override;
    TypePackId clean(TypePackId tp) override;

    bool ignoreChildren(TypeId ty) override;
    bool ignoreChildren(TypePackId ty) override;
};

} // namespace Luau