12 #include "clang/Config/config.h" 25 #include "llvm/ADT/DenseSet.h" 26 #include "llvm/Support/CrashRecoveryContext.h" 27 #include "llvm/Support/FileSystem.h" 28 #include "llvm/Support/Path.h" 29 #include "llvm/Support/raw_ostream.h" 33 using namespace clang;
39 std::unique_ptr<ASTConsumer>
41 if (std::unique_ptr<raw_ostream> OS =
50 std::unique_ptr<ASTConsumer>
52 return llvm::make_unique<ASTConsumer>();
58 FixItRewriteInPlace() { InPlace =
true; }
60 std::string RewriteFilename(
const std::string &
Filename,
int &fd)
override {
61 llvm_unreachable(
"don't call RewriteFilename for inplace rewrites");
66 std::string NewSuffix;
69 FixItActionSuffixInserter(std::string NewSuffix,
bool FixWhatYouCan)
70 : NewSuffix(std::move(NewSuffix)) {
71 this->FixWhatYouCan = FixWhatYouCan;
74 std::string RewriteFilename(
const std::string &
Filename,
int &fd)
override {
77 llvm::sys::path::replace_extension(Path,
78 NewSuffix + llvm::sys::path::extension(Path));
85 std::string RewriteFilename(
const std::string &
Filename,
int &fd)
override {
87 llvm::sys::fs::createTemporaryFile(llvm::sys::path::filename(Filename),
88 llvm::sys::path::extension(Filename).drop_front(), fd,
98 FixItOpts.reset(
new FixItActionSuffixInserter(FEOpts.
FixItSuffix,
101 FixItOpts.reset(
new FixItRewriteInPlace);
116 std::vector<std::pair<std::string, std::string> > RewrittenFiles;
121 if (FixAction->BeginSourceFile(CI, FEOpts.
Inputs[0])) {
122 std::unique_ptr<FixItOptions> FixItOpts;
124 FixItOpts.reset(
new FixItRewriteToTemp());
126 FixItOpts.reset(
new FixItRewriteInPlace());
127 FixItOpts->Silent =
true;
134 consumeError(std::move(Err));
138 err =
Rewriter.WriteFixedFiles(&RewrittenFiles);
140 FixAction->EndSourceFile();
154 RewrittenFiles.begin(), RewrittenFiles.end());
160 #if CLANG_ENABLE_OBJC_REWRITER 162 std::unique_ptr<ASTConsumer>
164 if (std::unique_ptr<raw_ostream> OS =
186 std::unique_ptr<raw_ostream> OS =
195 std::unique_ptr<raw_ostream> OS =
204 std::weak_ptr<raw_ostream> Out;
210 : CI(CI), Out(Out) {}
215 assert(File &&
"missing file for loaded module?");
218 if (!Rewritten.insert(File).second)
223 assert(File &&
"missing module file for loaded module?");
229 auto OS = Out.lock();
230 assert(OS &&
"loaded module file after finishing rewrite action?");
232 (*OS) <<
"#pragma clang module build ";
247 Instance.createDiagnostics(
250 Instance.getFrontendOpts().DisableFree =
false;
251 Instance.getFrontendOpts().Inputs.clear();
252 Instance.getFrontendOpts().Inputs.emplace_back(
254 Instance.getFrontendOpts().ModuleFiles.clear();
255 Instance.getFrontendOpts().ModuleMapFiles.clear();
257 Instance.getPreprocessorOutputOpts().RewriteImports =
false;
259 llvm::CrashRecoveryContext().RunSafelyOnThread([&]() {
261 Action.OutputStream = OS;
262 Instance.ExecuteAction(Action);
265 (*OS) <<
"#pragma clang module endbuild /*" << MF->
ModuleName <<
"*/\n";
277 auto &OS = *OutputStream;
283 if (Input.isFile()) {
285 OS.write_escaped(Input.getFile());
289 OS <<
"#pragma clang module contents\n";
297 llvm::make_unique<RewriteImportsListener>(CI, OutputStream));
310 llvm::raw_string_ostream OS(Buffer);
315 (*OutputStream) << OS.str();
321 OutputStream.reset();
LangOptions & getLangOpts()
CompilerInvocation & getInvocation()
PreprocessorOptions & getPreprocessorOpts()
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
bool RemappedFilesKeepOriginalName
True if the SourceManager should report the original file name for contents of files that were remapp...
std::shared_ptr< PCHContainerOperations > getPCHContainerOperations() const
DiagnosticOptions & getDiagnosticOpts()
std::string ModuleName
The name of the module.
bool BeginSourceFileAction(CompilerInstance &CI) override
Callback at the start of processing a single input.
InMemoryModuleCache & getModuleCache() const
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
void setSourceManager(SourceManager *Value)
setSourceManager - Replace the current source manager.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
std::string FixItSuffix
If given, the new suffix for fix-it rewritten files.
std::unique_ptr< ASTConsumer > CreateHTMLPrinter(std::unique_ptr< raw_ostream > OS, Preprocessor &PP, bool SyntaxHighlight=true, bool HighlightMacros=true)
CreateHTMLPrinter - Create an AST consumer which rewrites source code to HTML with syntax highlightin...
void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind) override
This is called for each AST file loaded.
RewriteImportsListener(CompilerInstance &CI, std::shared_ptr< raw_ostream > Out)
std::unique_ptr< ASTConsumer > CreateModernObjCRewriter(const std::string &InFile, std::unique_ptr< raw_ostream > OS, DiagnosticsEngine &Diags, const LangOptions &LOpts, bool SilenceRewriteMacroWarning, bool LineInfo)
Module * getCurrentModule() const
CodeGenOptions & getCodeGenOpts()
CompilerInstance & getCompilerInstance() const
bool BeginSourceFileAction(CompilerInstance &CI) override
Callback at the start of processing a single input.
bool isNonFragile() const
Does this runtime follow the set of implied behaviors for a "non-fragile" ABI?
FrontendOptions & getFrontendOpts()
StringRef getCurrentFileOrBufferName() const
PreprocessorOutputOptions & getPreprocessorOutputOpts()
std::unique_ptr< ASTConsumer > CreateObjCRewriter(const std::string &InFile, std::unique_ptr< raw_ostream > OS, DiagnosticsEngine &Diags, const LangOptions &LOpts, bool SilenceRewriteMacroWarning)
unsigned FixWhatYouCan
Apply fixes even if there are unfixable errors.
void RewriteMacrosInInput(Preprocessor &PP, raw_ostream *OS)
RewriteMacrosInInput - Implement -rewrite-macros mode.
void setFileManager(FileManager *Value)
Replace the current file manager and virtual file system.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
void Reset()
Reset the state of the diagnostic object to its initial configuration.
const FileEntry * getFile(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Lookup, cache, and verify the specified file (real or virtual).
ModuleKind
Specifies the kind of module that has been loaded.
IntrusiveRefCntPtr< ASTReader > getModuleManager() const
void print(raw_ostream &OS, unsigned Indent=0) const
Print the module map for this module to the given stream.
Defines the clang::Preprocessor interface.
Information about a module that has been loaded by the ASTReader.
clang::ObjCRuntime ObjCRuntime
unsigned FixOnlyWarnings
Apply fixes only for warnings.
void EndSourceFileAction() override
Callback at the end of processing a single input.
LLVM_READONLY bool isValidIdentifier(StringRef S, bool AllowDollar=false)
Return true if this is a valid ASCII identifier.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
bool BeginInvocation(CompilerInstance &CI) override
Callback before starting processing a single input, giving the opportunity to modify the CompilerInvo...
std::vector< FrontendInputFile > Inputs
The input files and their types.
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
Diagnostic consumer that forwards diagnostics along to an existing, already-initialized diagnostic co...
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
unsigned RewriteImports
Include contents of transitively-imported modules.
unsigned FixToTemporaries
Apply fixes to temporary files.
void RewriteIncludesInInput(Preprocessor &PP, raw_ostream *OS, const PreprocessorOutputOptions &Opts)
RewriteIncludesInInput - Implement -frewrite-includes mode.
Dataflow Directional Tag Classes.
FileManager & getFileManager() const
Return the current file manager to the caller.
const FrontendInputFile & getCurrentInput() const
SourceManager & getSourceManager() const
Return the current source manager.
FrontendOptions - Options for controlling the behavior of the frontend.
Abstract interface for callback invocations by the ASTReader.
void DoRewriteTest(Preprocessor &PP, raw_ostream *OS)
DoRewriteTest - A simple test for the TokenRewriter class.
std::unique_ptr< raw_pwrite_stream > createDefaultOutputFile(bool Binary=true, StringRef BaseInput="", StringRef Extension="")
Create the default output file (from the invocation's options) and add it to the list of tracked outp...
void setInvocation(std::shared_ptr< CompilerInvocation > Value)
setInvocation - Replace the current invocation.
Preprocessor & getPreprocessor() const
Return the current preprocessor.
Rewriter - This is the main interface to the rewrite buffers.
DiagnosticConsumer & getDiagnosticClient() const
std::vector< std::pair< std::string, std::string > > RemappedFiles
The set of file remappings, which take existing files on the system (the first part of each pair) and...
DiagnosticsEngine & getDiagnostics() const
Get the current diagnostics engine.
void createModuleManager()