//===----------- MockingFineGrainedDependencyGraphs.h -----------*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #ifndef MOCKING_FINE_GRAINED_DEPENDENCY_GRAPHS_H #define MOCKING_FINE_GRAINED_DEPENDENCY_GRAPHS_H #include "UnitTestSourceFileDepGraphFactory.h" #include "swift/AST/AbstractSourceFileDepGraphFactory.h" #include "swift/AST/FineGrainedDependencies.h" #include "swift/Driver/FineGrainedDependencyDriverGraph.h" namespace swift { namespace fine_grained_dependencies { /// Affordances for testing the \c SourceFileDepGraph and \c ModuleFileDepGraph /// /// Because fine-grained swiftdeps files are somewhat verbose, this file /// provides affordances to mock them up in a concise fashion. namespace mocking_fine_grained_dependency_graphs { /// Simulate loading for unit testing, as if the driver is reading the swiftdeps /// file for the first time. /// /// \param g The graph to load into. /// \param cmd The \c Job whose dependency info will be loaded. /// \param dependencyDescriptions Dependency info, see below /// \param interfaceHashIfNonEmpty If non-empty, overrides the default simulated /// interface hash \param includePrivateDeps Include file-private declarations /// in the dependency information. \param hadCompilationError Simulate a /// compilation error. /// /// Fails an assertion if the information is not valid (for instance a /// fingerprint where it should not be). /// /// *Dependency info format:* /// A list of entries, each of which is keyed by a \c NodeKind and contains a /// list of dependency nodes. /// /// *Dependency node format:* /// Each node here is either a "provides" (i.e. a declaration provided by the /// file) or a "depends" (i.e. a declaration that is depended upon). /// /// For "provides" (i.e. declarations provided by the source file): /// = [#][@], /// where the '#' prefix indicates that the declaration is file-private. /// /// = | , /// where is a mangled type name, and is a base-name. /// /// For "depends" (i.e. uses of declarations in the source file): /// [#][~]->[] /// where the '#' prefix indicates that the use does not cascade, /// the '~' prefix indicates that the holder is private, /// is the depended-upon declaration and the optional /// is the dependent declaration if known. If not known, the /// use will be the entire file. void simulateLoad(ModuleDepGraph &g, const driver::Job *cmd, const DependencyDescriptions &dependencyDescriptions, StringRef interfaceHashIfNonEmpty = StringRef(), const bool includePrivateDeps = true, const bool hadCompilationError = false); /// Same as \ref simulateLoad, but returns the specifically changed nodes or /// None if the load failed. ModuleDepGraph::Changes getChangesForSimulatedLoad(ModuleDepGraph &g, const driver::Job *cmd, const DependencyDescriptions &dependencyDescriptions, StringRef interfaceHashIfNonEmpty = StringRef(), const bool includePrivateDeps = true, const bool hadCompilationError = false); /// Simulates the driver reloading a swiftdeps file after a job has run. /// Returns the jobs that must now be run, possibly redundantly including \p /// cmd. /// /// See \ref simulateLoad for a parameter description. std::vector simulateReload(ModuleDepGraph &g, const driver::Job *cmd, const DependencyDescriptions &dependencyDescriptions, StringRef interfaceHashIfNonEmpty = StringRef(), const bool includePrivateDeps = true, const bool hadCompilationError = false); std::vector printJobsForDebugging(const std::vector &jobs); } // end namespace mocking_fine_grained_dependency_graphs } // namespace fine_grained_dependencies } // end namespace swift #endif /* MOCKING_FINE_GRAINED_DEPENDENCY_GRAPHS_H */