text: //===---------------- 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<SourceRangeBasedInfo>
    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<SourceRangeBasedInfo>
    loadInfoForOnePrimary(StringRef primaryPath, StringRef compiledSourcePath,
                          StringRef swiftRangesPath,
                          bool showIncrementalBuildDecisions,
                          DiagnosticEngine &diags);
  
    /// Return None for error
    static Optional<SwiftRangesFileContents>
    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<SourceComparator::LRRanges>
    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<void(bool, StringRef)> noteBuilding) const;
    bool didInputChangeNonlocally(
        DiagnosticEngine &,
        function_ref<void(bool, StringRef)> noteInitiallyCascading) const;
  
  private:
    static Optional<bool> 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 */
  