mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The Swift 4 Migrator is invoked through either the driver and frontend
with the -update-code flag.
The basic pipeline in the frontend is:
- Perform some list of syntactic fixes (there are currently none).
- Perform N rounds of sema fix-its on the primary input file, currently
set to 7 based on prior migrator seasons. Right now, this is just set
to take any fix-it suggested by the compiler.
- Emit a replacement map file, a JSON file describing replacements to a
file that Xcode knows how to understand.
Currently, the Migrator maintains a history of migration states along
the way for debugging purposes.
- Add -emit-remap frontend option
This will indicate the EmitRemap frontend action.
- Don't fork to a separte swift-update binary.
This is going to be a mode of the compiler, invoked by the same flags.
- Add -disable-migrator-fixits option
Useful for debugging, this skips the phase in the Migrator that
automatically applies fix-its suggested by the compiler.
- Add -emit-migrated-file-path option
This is used for testing/debugging scenarios. This takes the final
migration state's output text and writes it to the file specified
by this option.
- Add -dump-migration-states-dir
This dumps all of the migration states encountered during a migration
run for a file to the given directory. For example, the compiler
fix-it migration pass dumps the input file, the output file, and the
remap file between the two.
State output has the following naming convention:
${Index}-${MigrationPassName}-${What}.${extension}, such as:
1-FixitMigrationState-Input.swift
rdar://problem/30926261
103 lines
2.3 KiB
C++
103 lines
2.3 KiB
C++
//===--- FrontendOptions.cpp ----------------------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "swift/Frontend/FrontendOptions.h"
|
|
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
|
|
using namespace swift;
|
|
|
|
bool FrontendOptions::actionHasOutput() const {
|
|
switch (RequestedAction) {
|
|
case NoneAction:
|
|
case Parse:
|
|
case Typecheck:
|
|
case DumpParse:
|
|
case DumpAST:
|
|
case DumpInterfaceHash:
|
|
case PrintAST:
|
|
case DumpScopeMaps:
|
|
case DumpTypeRefinementContexts:
|
|
return false;
|
|
case EmitPCH:
|
|
case EmitSILGen:
|
|
case EmitSIL:
|
|
case EmitSIBGen:
|
|
case EmitSIB:
|
|
case EmitModuleOnly:
|
|
case UpdateCode:
|
|
return true;
|
|
case Immediate:
|
|
case REPL:
|
|
return false;
|
|
case EmitAssembly:
|
|
case EmitIR:
|
|
case EmitBC:
|
|
case EmitObject:
|
|
case EmitImportedModules:
|
|
case EmitTBD:
|
|
return true;
|
|
}
|
|
llvm_unreachable("Unknown ActionType");
|
|
}
|
|
|
|
bool FrontendOptions::actionIsImmediate() const {
|
|
switch (RequestedAction) {
|
|
case NoneAction:
|
|
case Parse:
|
|
case Typecheck:
|
|
case DumpParse:
|
|
case DumpAST:
|
|
case DumpInterfaceHash:
|
|
case PrintAST:
|
|
case DumpScopeMaps:
|
|
case DumpTypeRefinementContexts:
|
|
case EmitPCH:
|
|
case EmitSILGen:
|
|
case EmitSIL:
|
|
case EmitSIBGen:
|
|
case EmitSIB:
|
|
case EmitModuleOnly:
|
|
case UpdateCode:
|
|
return false;
|
|
case Immediate:
|
|
case REPL:
|
|
return true;
|
|
case EmitAssembly:
|
|
case EmitIR:
|
|
case EmitBC:
|
|
case EmitObject:
|
|
case EmitImportedModules:
|
|
case EmitTBD:
|
|
return false;
|
|
}
|
|
llvm_unreachable("Unknown ActionType");
|
|
}
|
|
|
|
void FrontendOptions::forAllOutputPaths(
|
|
std::function<void(const std::string &)> fn) const {
|
|
if (RequestedAction != FrontendOptions::EmitModuleOnly) {
|
|
for (const std::string &OutputFileName : OutputFilenames) {
|
|
fn(OutputFileName);
|
|
}
|
|
}
|
|
const std::string *outputs[] = {
|
|
&ModuleOutputPath,
|
|
&ModuleDocOutputPath,
|
|
&ObjCHeaderOutputPath
|
|
};
|
|
for (const std::string *next : outputs) {
|
|
if (!next->empty())
|
|
fn(*next);
|
|
}
|
|
}
|