mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
125 lines
4.7 KiB
C++
125 lines
4.7 KiB
C++
//===---------------- 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 */
|