Files
swift-mirror/include/swift/Migrator/Migrator.h
David Farler e55191f7d5 [Migrator] Don't take redundant replacements during AST Passes
We already had this functionality in the FixitApplyDiagnosticConsumer,
but we also need it in the AST passes because different entries in the
API diff data may drive identical fix-its, namely a general type rename,
which can occur anywhere a DeclRef appears, but also for function overrides'
parameter type changes, which are context specific.

rdar://problem/32431533
2017-06-14 14:21:51 -07:00

100 lines
3.6 KiB
C++

//===--- Migrator.h - Migrator ----------------------------------*- 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
//
//===----------------------------------------------------------------------===//
//
// The top-level Swift Migrator driver.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_MIGRATOR_MIGRATOR_H
#define SWIFT_MIGRATOR_MIGRATOR_H
#include "swift/Migrator/MigrationState.h"
#include "swift/Syntax/References.h"
namespace swift {
class CompilerInstance;
namespace migrator {
/// Run the migrator on the compiler invocation's input file and emit a
/// "replacement map" describing the requested changes to the source file.
bool updateCodeAndEmitRemap(CompilerInstance *Instance,
const CompilerInvocation &Invocation);
struct Migrator {
CompilerInstance *StartInstance;
const CompilerInvocation &StartInvocation;
SourceManager SrcMgr;
std::vector<RC<MigrationState>> States;
Migrator(CompilerInstance *StartInstance,
const CompilerInvocation &StartInvocation);
/// The maximum number of times to run the compiler over the input to get
/// fix-its. Nullability changes may expose other fix-its in subsequent
/// compilations.
static constexpr unsigned MaxCompilerFixitPassIterations = 7;
/// Repeatedly perform a number of compiler-fix-it migrations in a row, until
/// there are no new suggestions from the compiler or some other error
/// occurred.
///
/// Returns the last CompilerInstance used in the iterations, provided
/// that the CompilerInvocation used to set it up was successful. Otherwise,
/// returns nullptr.
std::unique_ptr<swift::CompilerInstance>
repeatFixitMigrations(const unsigned Iterations,
swift::version::Version SwiftLanguageVersion);
/// Perform a single compiler fix-it migration on the last state, and push
/// the result onto the state history.
///
/// Returns the CompilerInstance used for the fix-it run, provided its
/// setup from a CompilerInvocation was successful.
std::unique_ptr<swift::CompilerInstance>
performAFixItMigration(swift::version::Version SwiftLanguageVersion);
/// Starting with the last state, perform the following migration passes.
///
/// Returns true if failed:
/// - Setting up the Swift CompilerInstance failed.
/// - performSema emitted fatal errors along the way.
bool performSyntacticPasses();
/// Emit a replacement map from the very start state's output text to the
/// final state's output text to the StartInvocation's output file.
bool emitRemap() const;
/// Emit the output text of the final state in States to the path specified
/// by -emit-migrated-file-path in StartInvocation.MigratorOptions.
///
/// Returns true if an attempt was made and failed.
bool emitMigratedFile() const;
/// Dump all of the migration states encountered so far to
/// StartInvocation.MigratorOptions.DumpMigrationStatesDir.
///
/// Returns true if an attempt was made and failed.
bool dumpStates() const;
/// Get the options for the Migrator.
const MigratorOptions &getMigratorOptions() const;
/// Get the filename of the input given by this->StartInvocation.
const StringRef getInputFilename() const;
};
} // end namespace migrator
} // end namespace swift
#endif // SWIFT_MIGRATOR_MIGRATOR_H