mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
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
93 lines
2.1 KiB
C++
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);
|
|
}
|
|
}
|