//===---------------- DriverIncrementalRanges.h ------------------*- C++-*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 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 // //===----------------------------------------------------------------------===// // These are the declarations for managing serializable source locations so that // the driver can implement incremental compilation based on // source ranges. #ifndef SWIFT_DRIVER_DRIVERINCREMENTALRANGES_H #define SWIFT_DRIVER_DRIVERINCREMENTALRANGES_H #include "swift/AST/IncrementalRanges.h" #include "swift/Basic/FileTypes.h" #include "swift/Driver/SourceComparator.h" #include "llvm/Support/MemoryBuffer.h" namespace swift { namespace driver { class Job; class Compilation; } namespace incremental_ranges { //============================================================================== // MARK: SourceRangeBasedInfo //============================================================================== /// A per-primary collection of information about its source ranges. class SourceRangeBasedInfo { const std::string primaryInputPath; const SwiftRangesFileContents swiftRangesFileContents; /// All changed ranges in the primary as computed by the diff in the driver /// Both relative to the previously-compiled and the current source. const SourceComparator::LRRanges changedRanges; /// All of the non-local changes in the previously-compiled code: those /// residing outside function bodies. /// (We only have and only need function-body ranges for the /// previously-compiled source.) const Ranges nonlocalChangedRanges; //============================================================================== // MARK: construction //============================================================================== public: static Optional loadInfoForOneJob(const driver::Job *cmd, const bool showIncrementalBuildDecisions, DiagnosticEngine &diags); SourceRangeBasedInfo(SourceRangeBasedInfo &&); private: SourceRangeBasedInfo(StringRef primaryInputPath, SwiftRangesFileContents &&, SourceComparator::LRRanges &&changedRanges, Ranges &&nonlocalChangedRanges); /// Using supplied paths, interrogate the supplementary outputs and update the /// two references. Return None if a file was missing or corrupted. static Optional loadInfoForOnePrimary(StringRef primaryPath, StringRef compiledSourcePath, StringRef swiftRangesPath, bool showIncrementalBuildDecisions, DiagnosticEngine &diags); /// Return None for error static Optional loadSwiftRangesFileContents(StringRef swiftRangesPath, StringRef primaryPath, const bool showIncrementalBuildDecisions, DiagnosticEngine &); /// Return None for error /// If no error returns ranges of changes from both lhs and rhs. /// Lhs used for scheduling jobs, rhs just for dumping and testing. static Optional loadChangedRanges(StringRef compiledSourcePath, StringRef primaryPath, const bool showIncrementalBuildDecisions, DiagnosticEngine &); static Ranges computeNonlocalChangedRanges(const SwiftRangesFileContents &, const SourceComparator::LRRanges &); //============================================================================== // MARK: scheduling jobs //============================================================================== public: bool didInputChangeAtAll(DiagnosticEngine &, function_ref noteBuilding) const; bool didInputChangeNonlocally( DiagnosticEngine &, function_ref noteInitiallyCascading) const; private: static Optional isFileNewerThan(StringRef lhs, StringRef rhs, DiagnosticEngine&); //============================================================================== // MARK: printing //============================================================================== public: void dump(bool dumpCompiledSourceDiffs = true, bool dumpSwiftRanges = true) const; private: void dumpChangedRanges() const; }; } // namespace incremental_ranges } // namespace swift #endif /* SWIFT_DRIVER_DRIVERINCREMENTALRANGES_H */