Files
swift-mirror/lib/Sema/Semantics.cpp
David Farler 303a3e5824 Start the Migrator library
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
2017-04-17 16:25:02 -07:00

67 lines
2.0 KiB
C++

//===--- Semantics.cpp - Semantics manager --------------------------------===//
//
// 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/Sema/Semantics.h"
#include "swift/AST/Expr.h"
#include "swift/AST/Decl.h"
#include "swift/AST/Stmt.h"
using namespace swift;
using namespace swift::sema;
using namespace swift::syntax;
void
Semantics::recordSyntaxMapping(RC<syntax::SyntaxData> FromNode,
ASTNode ToNode) {
if (FromNode->getKind() == SyntaxKind::Unknown) {
return;
}
SyntaxMap[FromNode] = ToNode;
}
llvm::Optional<ASTNode>
Semantics::getNodeForSyntax(syntax::Syntax SyntaxNode) const {
auto Found = SyntaxMap.find(SyntaxNode.Root);
if (Found == SyntaxMap.end()) {
return None;
}
return Found->getSecond();
}
void Semantics::clearSyntaxMap() {
SyntaxMap.shrink_and_clear();
}
void Semantics::dumpSyntaxMap() const {
for (const auto &SyntaxAndSemaNode : SyntaxMap) {
auto SyntaxNode = SyntaxAndSemaNode.getFirst();
auto SemanticNode = SyntaxAndSemaNode.getSecond();
llvm::errs() << "\n=====================================================\n";
SyntaxNode->dump(llvm::errs());
llvm::errs() << "\n\n---- Maps to semantic node: ----\n\n";
if (SemanticNode.is<Expr *>()) {
SemanticNode.get<Expr *>()->dump(llvm::errs());
} else if (SemanticNode.is<Decl *>()) {
SemanticNode.get<Decl *>()->dump(llvm::errs());
} else if (SemanticNode.is<Expr *>()) {
SemanticNode.get<Expr *>()->dump(llvm::errs());
} else {
llvm_unreachable("ASTNode has pointer to unknown thing!");
}
llvm::errs() << "\n=====================================================\n";
}
}