mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
THIS IS NOT READY FOR USE YET. The new plan for mixed-source non-framework targets is that the Swift compiler will import an Objective-C header directly, and treat the decls and imports in that header as explicitly visible to the entire target. This means users don't have to modularize their headers before bringing them into Swift. This commit adds the option and introduces the "imported headers" module as an implicit import for the source files being compiled. It also directs the Clang importer to process the given header (using #import, so that it won't somehow get included twice) and watches for any module imports that occur as a result of reading that header. Still to come: import of decls within the header (not within any module), and proper serialization of cross-references to the header and its imports. Part of <rdar://problem/16702101> Swift SVN r17218
187 lines
5.8 KiB
C++
187 lines
5.8 KiB
C++
//===--- FrontendOptions.h --------------------------------------*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2015 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SWIFT_FRONTEND_FRONTENDOPTIONS_H
|
|
#define SWIFT_FRONTEND_FRONTENDOPTIONS_H
|
|
|
|
#include "swift/AST/Module.h"
|
|
#include "swift/Basic/Optional.h"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
class MemoryBuffer;
|
|
}
|
|
|
|
namespace swift {
|
|
|
|
class SelectedInput {
|
|
public:
|
|
/// The index of the input, in either FrontendOptions::InputFilenames or
|
|
/// FrontendOptions::InputBuffers, depending on this SelectedInput's
|
|
/// InputKind.
|
|
unsigned Index;
|
|
|
|
enum class InputKind {
|
|
/// Denotes a file input, in FrontendOptions::InputFilenames
|
|
Filename,
|
|
|
|
/// Denotes a buffer input, in FrontendOptions::InputBuffers
|
|
Buffer,
|
|
};
|
|
|
|
/// The kind of input which this SelectedInput represents.
|
|
InputKind Kind;
|
|
|
|
SelectedInput(unsigned Index, InputKind Kind = InputKind::Filename)
|
|
: Index(Index), Kind(Kind) {}
|
|
|
|
/// \returns true if the SelectedInput's Kind is a filename
|
|
bool isFilename() const { return Kind == InputKind::Filename; }
|
|
|
|
/// \returns true if the SelectedInput's Kind is a buffer
|
|
bool isBuffer() const { return Kind == InputKind::Buffer; }
|
|
};
|
|
|
|
/// Options for controlling the behavior of the frontend.
|
|
class FrontendOptions {
|
|
public:
|
|
/// The names of input files to the frontend.
|
|
std::vector<std::string> InputFilenames;
|
|
|
|
/// Input buffers which may override the file contents of input files.
|
|
std::vector<llvm::MemoryBuffer *> InputBuffers;
|
|
|
|
/// The input for which output should be generated. If not set, output will
|
|
/// be generated for the whole module.
|
|
Optional<SelectedInput> PrimaryInput;
|
|
|
|
/// The kind of input on which the frontend should operate.
|
|
SourceFileKind InputKind = SourceFileKind::Main;
|
|
|
|
/// The name of the primary output file which should be created
|
|
/// by the frontend.
|
|
std::string OutputFilename;
|
|
|
|
/// An Objective-C header to import and make implicitly visible.
|
|
std::string ImplicitObjCHeaderPath;
|
|
|
|
/// The name of the module which the frontend is building.
|
|
std::string ModuleName;
|
|
|
|
/// The path to which we should emit a serialized module.
|
|
std::string ModuleOutputPath;
|
|
|
|
/// The path to which we should emit a module documentation file.
|
|
std::string ModuleDocOutputPath;
|
|
|
|
/// The name of the library to link against when using this module.
|
|
std::string ModuleLinkName;
|
|
|
|
/// The path to which we should emit an Objective-C header for the module.
|
|
std::string ObjCHeaderOutputPath;
|
|
|
|
/// Path to a file which should contain serialized diagnostics for this
|
|
/// frontend invocation.
|
|
std::string SerializedDiagnosticsPath;
|
|
|
|
/// Arguments which should be passed in immediate mode.
|
|
std::vector<std::string> ImmediateArgv;
|
|
|
|
/// \brief A list of arguments to forward to LLVM's option processing; this
|
|
/// should only be used for debugging and experimental features.
|
|
std::vector<std::string> LLVMArgs;
|
|
|
|
enum ActionType {
|
|
Parse, ///< Parse and type-check only
|
|
DumpParse, ///< Parse only and dump AST
|
|
DumpAST, ///< Parse, type-check, and dump AST
|
|
PrintAST, ///< Parse, type-check, and pretty-print AST
|
|
|
|
EmitSILGen, ///< Emit raw SIL
|
|
EmitSIL, ///< Emit canonical SIL
|
|
|
|
EmitModuleOnly, ///< Emit module only
|
|
|
|
Immediate, ///< Immediate mode
|
|
REPL, ///< REPL mode
|
|
|
|
EmitAssembly, ///< Emit assembly
|
|
EmitIR, ///< Emit LLVM IR
|
|
EmitBC, ///< Emit LLVM BC
|
|
EmitObject, ///< Emit object file
|
|
};
|
|
|
|
/// Indicates the action the user requested that the frontend perform.
|
|
ActionType RequestedAction = Parse;
|
|
|
|
/// Indicates that type-checking should be disabled.
|
|
bool ParseOnly = false;
|
|
|
|
/// Indicates that the input(s) should be parsed as the Swift stdlib.
|
|
bool ParseStdlib = false;
|
|
|
|
/// Indicates whether function body parsing should be delayed
|
|
/// until the end of all files.
|
|
bool DelayedFunctionBodyParsing = false;
|
|
|
|
/// Indicates whether or not an import statement can pick up a Swift source
|
|
/// file (as opposed to a module file).
|
|
bool EnableSourceImport = false;
|
|
|
|
/// Indicates that the frontend should emit "verbose" SIL
|
|
/// (if asked to emit SIL).
|
|
bool EmitVerboseSIL = false;
|
|
|
|
/// If set, this module is part of a mixed Objective-C/Swift framework, and
|
|
/// the Objective-C half should implicitly be visible to the Swift sources.
|
|
bool ImportUnderlyingModule = false;
|
|
|
|
/// Indicates that all generated SIL should be serialized into a module,
|
|
/// not just code considered fragile.
|
|
bool SILSerializeAll = false;
|
|
|
|
/// Indicates whether or not the frontend should print statistics upon
|
|
/// termination.
|
|
bool PrintStats = false;
|
|
|
|
/// Indicates whether the playground transformation should be applied.
|
|
bool Playground = false;
|
|
|
|
/// Indicates whether standard help should be shown.
|
|
bool PrintHelp = false;
|
|
|
|
/// Indicates whether full help (including "hidden" options) should be shown.
|
|
bool PrintHelpHidden = false;
|
|
|
|
/// An enum with different modes for automatically crashing at defined times.
|
|
enum class DebugCrashMode {
|
|
None, ///< Don't automatically crash.
|
|
AssertAfterParse, ///< Automatically assert after parsing.
|
|
CrashAfterParse, ///< Automatically crash after parsing.
|
|
};
|
|
|
|
/// Indicates a debug crash mode for the frontend.
|
|
DebugCrashMode CrashMode = DebugCrashMode::None;
|
|
|
|
/// Indicates whether the RequestedAction has output.
|
|
bool actionHasOutput();
|
|
|
|
/// Indicates whether the RequestedAction will immediately run code.
|
|
bool actionIsImmediate();
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|