blob: be54c6034fcba5de72f51423e07f9c868851c804 [file] [log] [blame]
//===--- MigrationState.h - Migration State ---------------------*- 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
//
//===----------------------------------------------------------------------===//
//
// This class is an explicit container for a state during migration, its input
// and output text, as well as what created this state.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_MIGRATOR_MIGRATIONSTATE_H
#define SWIFT_MIGRATOR_MIGRATIONSTATE_H
#include "swift/Syntax/References.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/ADT/StringRef.h"
namespace swift {
class SourceManager;
namespace migrator {
enum class MigrationKind {
/// The start state of the migrator.
Start,
/// A syntactic pass. This is generic for now because there isn't a good
/// way to separate out and compose syntactic passes until lib/Syntax is
/// integrated.
Syntactic,
/// The compiler has made several passes over the input file and we
/// applied the suggested fix-its we deemed appropriate.
CompilerFixits,
};
struct MigrationState : public llvm::ThreadSafeRefCountedBase<MigrationState> {
MigrationKind Kind;
SourceManager &SrcMgr;
unsigned InputBufferID;
unsigned OutputBufferID;
MigrationState(const MigrationKind Kind, SourceManager &SrcMgr,
const unsigned InputBufferID, const unsigned OutputBufferID)
: Kind(Kind), SrcMgr(SrcMgr),
InputBufferID(InputBufferID),
OutputBufferID(OutputBufferID) {}
MigrationKind getKind() const {
return Kind;
}
std::string getInputText() const;
unsigned getInputBufferID() const {
return InputBufferID;
}
std::string getOutputText() const;
unsigned getOutputBufferID() const {
return OutputBufferID;
}
/// Write all relevant information about the state to OutDir, such as the
/// input file, output file, replacements, syntax trees, etc.
bool print(size_t StateNumber, StringRef OutDir) const;
bool noChangesOccurred() const {
return InputBufferID == OutputBufferID;
}
static RC<MigrationState>
start(SourceManager &SrcMgr, const unsigned InputBufferID) {
return RC<MigrationState> {
new MigrationState {
MigrationKind::Start, SrcMgr, InputBufferID, InputBufferID
}
};
}
static RC<MigrationState>
make(MigrationKind Kind, SourceManager &SrcMgr, const unsigned InputBufferID,
const unsigned OutputBufferID) {
return RC<MigrationState> {
new MigrationState {
Kind,
SrcMgr,
InputBufferID,
// The input is the output here, because nothing happened yet.
OutputBufferID
}
};
}
};
}
}
#endif // SWIFT_MIGRATOR_MIGRATIONSTATE_H