Files
swift-mirror/lib/Frontend/FrontendOptions.cpp
Doug Gregor 4e214687ca [WIP Name binding] Introduce a basic 'scope map' to model scopes in the AST.
The scope map models all of the name lookup scopes within a source
file. It can be queried by source location to find the innermost scope
that contains that source location. Then, one can follow the parent
pointers in the scope to enumerate the enclosing scopes.

The scope map itself is lazily constructed, only creating scope map
nodes when required implicitly (e.g, when searching for a particular
innermost scope) or forced for debugging purposes.

using a lazily-constructed tree that can be searched by source
location. A search within a particular source location will
2016-09-02 17:13:05 -07:00

93 lines
2.1 KiB
C++

//===--- FrontendOptions.cpp ----------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://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 DumpParse:
case DumpAST:
case DumpInterfaceHash:
case PrintAST:
case DumpScopeMaps:
case DumpTypeRefinementContexts:
return false;
case EmitSILGen:
case EmitSIL:
case EmitSIBGen:
case EmitSIB:
case EmitModuleOnly:
return true;
case Immediate:
case REPL:
return false;
case EmitAssembly:
case EmitIR:
case EmitBC:
case EmitObject:
return true;
}
llvm_unreachable("Unknown ActionType");
}
bool FrontendOptions::actionIsImmediate() const {
switch (RequestedAction) {
case NoneAction:
case Parse:
case DumpParse:
case DumpAST:
case DumpInterfaceHash:
case PrintAST:
case DumpScopeMaps:
case DumpTypeRefinementContexts:
case EmitSILGen:
case EmitSIL:
case EmitSIBGen:
case EmitSIB:
case EmitModuleOnly:
return false;
case Immediate:
case REPL:
return true;
case EmitAssembly:
case EmitIR:
case EmitBC:
case EmitObject:
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);
}
}