зеркало из https://github.com/microsoft/clang-1.git
FrontendAction: Track active file kind.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105581 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
eb58d831b2
Коммит
685ac6665a
|
@ -15,10 +15,10 @@
|
|||
#include <string>
|
||||
|
||||
namespace clang {
|
||||
class ASTUnit;
|
||||
class ASTConsumer;
|
||||
class CompilerInstance;
|
||||
class ASTMergeAction;
|
||||
class ASTUnit;
|
||||
class CompilerInstance;
|
||||
|
||||
enum InputKind {
|
||||
IK_None,
|
||||
|
@ -40,6 +40,7 @@ enum InputKind {
|
|||
/// the frontend.
|
||||
class FrontendAction {
|
||||
std::string CurrentFile;
|
||||
InputKind CurrentFileKind;
|
||||
llvm::OwningPtr<ASTUnit> CurrentASTUnit;
|
||||
CompilerInstance *Instance;
|
||||
friend class ASTMergeAction;
|
||||
|
@ -117,6 +118,11 @@ public:
|
|||
return CurrentFile;
|
||||
}
|
||||
|
||||
InputKind getCurrentFileKind() const {
|
||||
assert(!CurrentFile.empty() && "No current file!");
|
||||
return CurrentFileKind;
|
||||
}
|
||||
|
||||
ASTUnit &getCurrentASTUnit() const {
|
||||
assert(!CurrentASTUnit && "No current AST unit!");
|
||||
return *CurrentASTUnit;
|
||||
|
@ -126,7 +132,7 @@ public:
|
|||
return CurrentASTUnit.take();
|
||||
}
|
||||
|
||||
void setCurrentFile(llvm::StringRef Value, ASTUnit *AST = 0);
|
||||
void setCurrentFile(llvm::StringRef Value, InputKind Kind, ASTUnit *AST = 0);
|
||||
|
||||
/// @}
|
||||
/// @name Supported Modes
|
||||
|
|
|
@ -26,7 +26,8 @@ bool ASTMergeAction::BeginSourceFileAction(CompilerInstance &CI,
|
|||
// FIXME: This is a hack. We need a better way to communicate the
|
||||
// AST file, compiler instance, and file name than member variables
|
||||
// of FrontendAction.
|
||||
AdaptedAction->setCurrentFile(getCurrentFile(), takeCurrentASTUnit());
|
||||
AdaptedAction->setCurrentFile(getCurrentFile(), getCurrentFileKind(),
|
||||
takeCurrentASTUnit());
|
||||
AdaptedAction->setCompilerInstance(&CI);
|
||||
return AdaptedAction->BeginSourceFileAction(CI, Filename);
|
||||
}
|
||||
|
|
|
@ -25,8 +25,10 @@ FrontendAction::FrontendAction() : Instance(0) {}
|
|||
|
||||
FrontendAction::~FrontendAction() {}
|
||||
|
||||
void FrontendAction::setCurrentFile(llvm::StringRef Value, ASTUnit *AST) {
|
||||
void FrontendAction::setCurrentFile(llvm::StringRef Value, InputKind Kind,
|
||||
ASTUnit *AST) {
|
||||
CurrentFile = Value;
|
||||
CurrentFileKind = Kind;
|
||||
CurrentASTUnit.reset(AST);
|
||||
}
|
||||
|
||||
|
@ -35,7 +37,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
|||
InputKind InputKind) {
|
||||
assert(!Instance && "Already processing a source file!");
|
||||
assert(!Filename.empty() && "Unexpected empty filename!");
|
||||
setCurrentFile(Filename);
|
||||
setCurrentFile(Filename, InputKind);
|
||||
setCompilerInstance(&CI);
|
||||
|
||||
// AST files follow a very different path, since they share objects via the
|
||||
|
@ -52,7 +54,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
|||
if (!AST)
|
||||
goto failure;
|
||||
|
||||
setCurrentFile(Filename, AST);
|
||||
setCurrentFile(Filename, InputKind, AST);
|
||||
|
||||
// Set the shared objects, these are reset when we finish processing the
|
||||
// file, otherwise the CompilerInstance will happily destroy them.
|
||||
|
@ -127,7 +129,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
|||
}
|
||||
|
||||
CI.getDiagnosticClient().EndSourceFile();
|
||||
setCurrentFile("");
|
||||
setCurrentFile("", IK_None);
|
||||
setCompilerInstance(0);
|
||||
return false;
|
||||
}
|
||||
|
@ -206,7 +208,7 @@ void FrontendAction::EndSourceFile() {
|
|||
}
|
||||
|
||||
setCompilerInstance(0);
|
||||
setCurrentFile("");
|
||||
setCurrentFile("", IK_None);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
Загрузка…
Ссылка в новой задаче