blob: 062fdc46ee18a972f8c054f49ab0e415b8eb5310 [file] [log] [blame]
//===---------------- 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 */