| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef TOOLS_GN_IMPORT_MANAGER_H_ |
| #define TOOLS_GN_IMPORT_MANAGER_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <mutex> |
| #include <string> |
| #include <unordered_set> |
| #include <vector> |
| |
| class Err; |
| class ParseNode; |
| class Scope; |
| class SourceFile; |
| |
| // Provides a cache of the results of importing scopes so the results can |
| // be re-used rather than running the imported files multiple times. |
| class ImportManager { |
| public: |
| ImportManager(); |
| ~ImportManager(); |
| |
| // Does an import of the given file into the given scope. On error, sets the |
| // error and returns false. |
| bool DoImport(const SourceFile& file, |
| const ParseNode* node_for_err, |
| Scope* scope, |
| Err* err); |
| |
| std::vector<SourceFile> GetImportedFiles() const; |
| |
| private: |
| struct ImportInfo; |
| |
| // Protects access to imports_ and imports_in_progress_. Do not hold when |
| // actually executing imports. |
| std::mutex imports_lock_; |
| |
| // Owning pointers to the scopes. |
| using ImportMap = std::map<SourceFile, std::unique_ptr<ImportInfo>>; |
| ImportMap imports_; |
| |
| std::unordered_set<std::string> imports_in_progress_; |
| |
| ImportManager(const ImportManager&) = delete; |
| ImportManager& operator=(const ImportManager&) = delete; |
| }; |
| |
| #endif // TOOLS_GN_IMPORT_MANAGER_H_ |