diff options
Diffstat (limited to 'clang/lib/Frontend/FrontendAction.cpp')
| -rw-r--r-- | clang/lib/Frontend/FrontendAction.cpp | 52 | 
1 files changed, 42 insertions, 10 deletions
| diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index ba2d63b026d..b5284d8022f 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -30,37 +30,70 @@ using namespace clang;  namespace { -/// \brief Dumps deserialized declarations. -class DeserializedDeclsDumper : public ASTDeserializationListener { +class DelegatingDeserializationListener : public ASTDeserializationListener {    ASTDeserializationListener *Previous;  public: -  DeserializedDeclsDumper(ASTDeserializationListener *Previous) +  explicit DelegatingDeserializationListener( +                                           ASTDeserializationListener *Previous)      : Previous(Previous) { } +  virtual void ReaderInitialized(ASTReader *Reader) { +    if (Previous) +      Previous->ReaderInitialized(Reader); +  } +  virtual void IdentifierRead(serialization::IdentID ID, +                              IdentifierInfo *II) { +    if (Previous) +      Previous->IdentifierRead(ID, II); +  } +  virtual void TypeRead(serialization::TypeIdx Idx, QualType T) { +    if (Previous) +      Previous->TypeRead(Idx, T); +  } +  virtual void DeclRead(serialization::DeclID ID, const Decl *D) { +    if (Previous) +      Previous->DeclRead(ID, D); +  } +  virtual void SelectorRead(serialization::SelectorID ID, Selector Sel) { +    if (Previous) +      Previous->SelectorRead(ID, Sel); +  } +  virtual void MacroDefinitionRead(serialization::PreprocessedEntityID PPID,  +                                   MacroDefinition *MD) { +    if (Previous) +      Previous->MacroDefinitionRead(PPID, MD); +  } +}; + +/// \brief Dumps deserialized declarations. +class DeserializedDeclsDumper : public DelegatingDeserializationListener { +public: +  explicit DeserializedDeclsDumper(ASTDeserializationListener *Previous) +    : DelegatingDeserializationListener(Previous) { } +    virtual void DeclRead(serialization::DeclID ID, const Decl *D) {      llvm::outs() << "PCH DECL: " << D->getDeclKindName();      if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))        llvm::outs() << " - " << ND->getNameAsString();      llvm::outs() << "\n"; -    if (Previous) -      Previous->DeclRead(ID, D); +    DelegatingDeserializationListener::DeclRead(ID, D);    }  };    /// \brief Checks deserialized declarations and emits error if a name    /// matches one given in command-line using -error-on-deserialized-decl. -  class DeserializedDeclsChecker : public ASTDeserializationListener { +  class DeserializedDeclsChecker : public DelegatingDeserializationListener {      ASTContext &Ctx;      std::set<std::string> NamesToCheck; -    ASTDeserializationListener *Previous;    public:      DeserializedDeclsChecker(ASTContext &Ctx,                               const std::set<std::string> &NamesToCheck,                                ASTDeserializationListener *Previous) -      : Ctx(Ctx), NamesToCheck(NamesToCheck), Previous(Previous) { } +      : DelegatingDeserializationListener(Previous), +        Ctx(Ctx), NamesToCheck(NamesToCheck) { }      virtual void DeclRead(serialization::DeclID ID, const Decl *D) {        if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) @@ -72,8 +105,7 @@ public:                << ND->getNameAsString();          } -      if (Previous) -        Previous->DeclRead(ID, D); +      DelegatingDeserializationListener::DeclRead(ID, D);      }  }; | 

