// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details #pragma once #include "Luau/Error.h" #include "Luau/FileResolver.h" #include "Luau/ParseOptions.h" #include "Luau/ParseResult.h" #include "Luau/Scope.h" #include "Luau/TypeArena.h" #include #include #include #include namespace Luau { struct Module; using ScopePtr = std::shared_ptr; using ModulePtr = std::shared_ptr; class AstType; class AstTypePack; /// Root of the AST of a parsed source file struct SourceModule { ModuleName name; // DataModel path if possible. Filename if not. SourceCode::Type type = SourceCode::None; std::optional environmentName; bool cyclic = false; std::shared_ptr allocator; std::shared_ptr names; std::vector parseErrors; AstStatBlock* root = nullptr; std::optional mode; std::vector hotcomments; std::vector commentLocations; SourceModule() : allocator(new Allocator) , names(new AstNameTable(*allocator)) { } }; bool isWithinComment(const SourceModule& sourceModule, Position pos); struct RequireCycle { Location location; std::vector path; // one of the paths for a require() to go all the way back to the originating module }; struct Module { ~Module(); TypeArena interfaceTypes; TypeArena internalTypes; // Scopes and AST types refer to parse data, so we need to keep that alive std::shared_ptr allocator; std::shared_ptr names; std::vector> scopes; // never empty std::vector>> scope2s; // never empty DenseHashMap astTypes{nullptr}; DenseHashMap astTypePacks{nullptr}; DenseHashMap astExpectedTypes{nullptr}; DenseHashMap astOriginalCallTypes{nullptr}; DenseHashMap astOverloadResolvedTypes{nullptr}; DenseHashMap astResolvedTypes{nullptr}; DenseHashMap astResolvedTypePacks{nullptr}; std::unordered_map declaredGlobals; ErrorVec errors; Mode mode; SourceCode::Type type; bool timeout = false; ScopePtr getModuleScope() const; Scope2* getModuleScope2() const; // Once a module has been typechecked, we clone its public interface into a separate arena. // This helps us to force TypeVar ownership into a DAG rather than a DCG. void clonePublicInterface(InternalErrorReporter& ice); }; } // namespace Luau