//===--- ModuleLoader.h - Module Loader Interface ----------- -*- C++ -*- -===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // // This file implements an abstract interface for loading modules. // //===----------------------------------------------------------------------===// #ifndef SWIFT_AST_MODULE_LOADER_H #define SWIFT_AST_MODULE_LOADER_H #include "swift/AST/Identifier.h" #include "swift/Basic/LLVM.h" #include "swift/Basic/SourceLoc.h" namespace swift { class Module; class NominalTypeDecl; enum class KnownProtocolKind : uint8_t; class DependencyTracker { virtual void anchor(); protected: DependencyTracker() = default; public: virtual ~DependencyTracker() = default; virtual void addDependency(StringRef file) {} }; /// \brief Abstract interface that loads named modules into the AST. class ModuleLoader { DependencyTracker * const dependencyTracker; virtual void anchor(); protected: ModuleLoader(DependencyTracker *tracker) : dependencyTracker(tracker) {} void addDependency(StringRef file) { if (dependencyTracker) dependencyTracker->addDependency(file); } public: virtual ~ModuleLoader() = default; /// \brief Import a module with the given module path. /// /// \param importLoc The location of the 'import' keyword. /// /// \param path A sequence of (identifier, location) pairs that denote /// the dotted module name to load, e.g., AppKit.NSWindow. /// /// \returns the module referenced, if it could be loaded. Otherwise, /// emits a diagnostic and returns NULL. virtual Module *loadModule(SourceLoc importLoc, ArrayRef> path) = 0; /// \brief Load extensions to the given nominal type. /// /// \param nominal The nominal type whose extensions should be loaded. /// /// \param previousGeneration The previous generation number. The AST already /// contains extensions loaded from any generation up to and including this /// one. virtual void loadExtensions(NominalTypeDecl *nominal, unsigned previousGeneration) { } /// \brief Verify all modules loaded by this loader. virtual void verifyAllModules() { } }; } // namespace swift #endif