]> granicus.if.org Git - clang/commitdiff
Refactor: when exposing a definition in some module, provide listeners with the
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 15 May 2015 02:34:32 +0000 (02:34 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 15 May 2015 02:34:32 +0000 (02:34 +0000)
module rather than requiring them to work it out themselves.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237416 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTMutationListener.h
include/clang/Lex/Preprocessor.h
include/clang/Serialization/ASTWriter.h
lib/Frontend/MultiplexConsumer.cpp
lib/Sema/SemaLookup.cpp
lib/Serialization/ASTWriter.cpp

index d2b0a8b0c7eca6406befe3c6655b17bf3ce0b1de..4f3acc3a75c159ca01e69cfecf86dfb8eab3c0c0 100644 (file)
@@ -13,8 +13,6 @@
 #ifndef LLVM_CLANG_AST_ASTMUTATIONLISTENER_H
 #define LLVM_CLANG_AST_ASTMUTATIONLISTENER_H
 
-#include "clang/Basic/SourceLocation.h"
-
 namespace clang {
   class ClassTemplateDecl;
   class ClassTemplateSpecializationDecl;
@@ -24,6 +22,7 @@ namespace clang {
   class DeclContext;
   class FunctionDecl;
   class FunctionTemplateDecl;
+  class Module;
   class NamedDecl;
   class ObjCCategoryDecl;
   class ObjCContainerDecl;
@@ -117,8 +116,9 @@ public:
   /// \brief A definition has been made visible by being redefined locally.
   ///
   /// \param D The definition that was previously not visible.
-  virtual void RedefinedHiddenDefinition(const NamedDecl *D,
-                                         SourceLocation Loc) {}
+  /// \param M The containing module in which the definition was made visible,
+  ///        if any.
+  virtual void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) {}
 
   // NOTE: If new methods are added they should also be added to
   // MultiplexASTMutationListener.
index 3f668e1e277f4cc087d79564f4d1e797ae67c290..4562741658271878360b1a349531387e19f9f7f5 100644 (file)
@@ -1790,6 +1790,7 @@ private:
   void HandleImportDirective(SourceLocation HashLoc, Token &Tok);
   void HandleMicrosoftImportDirective(Token &Tok);
 
+public:
   // Module inclusion testing.
   /// \brief Find the module that owns the source or header file that
   /// \p Loc points to. If the location is in a file that was included
@@ -1800,6 +1801,7 @@ private:
   /// directly or indirectly.
   Module *getModuleContainingLocation(SourceLocation Loc);
 
+private:
   // Macro handling.
   void HandleDefineDirective(Token &Tok, bool ImmediatelyAfterTopLevelIfndef);
   void HandleUndefDirective(Token &Tok);
index 649dbd8b8577a45886bc0173b638f84c3e7697a1..297ee22dfa68e0216f115e3dbc8cebccd4d6d019 100644 (file)
@@ -300,6 +300,7 @@ private:
       void *Type;
       unsigned Loc;
       unsigned Val;
+      Module *Mod;
     };
 
   public:
@@ -311,6 +312,8 @@ private:
         : Kind(Kind), Loc(Loc.getRawEncoding()) {}
     DeclUpdate(unsigned Kind, unsigned Val)
         : Kind(Kind), Val(Val) {}
+    DeclUpdate(unsigned Kind, Module *M)
+          : Kind(Kind), Mod(M) {}
 
     unsigned getKind() const { return Kind; }
     const Decl *getDecl() const { return Dcl; }
@@ -319,6 +322,7 @@ private:
       return SourceLocation::getFromRawEncoding(Loc);
     }
     unsigned getNumber() const { return Val; }
+    Module *getModule() const { return Mod; }
   };
 
   typedef SmallVector<DeclUpdate, 1> UpdateRecord;
@@ -854,8 +858,7 @@ public:
                                     const ObjCCategoryDecl *ClassExt) override;
   void DeclarationMarkedUsed(const Decl *D) override;
   void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override;
-  void RedefinedHiddenDefinition(const NamedDecl *D,
-                                 SourceLocation Loc) override;
+  void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override;
 };
 
 /// \brief AST and semantic-analysis consumer that generates a
index 1512b5e6ba91e07d5891f4fd264e7b7e89ff2840..219e9492d28b24df275cea4246961315b8bacbfb 100644 (file)
@@ -111,8 +111,7 @@ public:
                                     const ObjCCategoryDecl *ClassExt) override;
   void DeclarationMarkedUsed(const Decl *D) override;
   void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override;
-  void RedefinedHiddenDefinition(const NamedDecl *D,
-                                 SourceLocation Loc) override;
+  void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override;
 
 private:
   std::vector<ASTMutationListener*> Listeners;
@@ -196,10 +195,10 @@ void MultiplexASTMutationListener::DeclarationMarkedOpenMPThreadPrivate(
   for (size_t i = 0, e = Listeners.size(); i != e; ++i)
     Listeners[i]->DeclarationMarkedOpenMPThreadPrivate(D);
 }
-void MultiplexASTMutationListener::RedefinedHiddenDefinition(
-    const NamedDecl *D, SourceLocation Loc) {
+void MultiplexASTMutationListener::RedefinedHiddenDefinition(const NamedDecl *D,
+                                                             Module *M) {
   for (auto *L : Listeners)
-    L->RedefinedHiddenDefinition(D, Loc);
+    L->RedefinedHiddenDefinition(D, M);
 }
 
 }  // end namespace clang
index 012c1cf392734c4ffad5dd42223509e1d9b4aaba..5e7e34a89287e3faa2a7ed94ae0b41ae76035aa2 100644 (file)
@@ -25,6 +25,7 @@
 #include "clang/Basic/Builtins.h"
 #include "clang/Basic/LangOptions.h"
 #include "clang/Lex/ModuleLoader.h"
+#include "clang/Lex/Preprocessor.h"
 #include "clang/Sema/DeclSpec.h"
 #include "clang/Sema/ExternalSemaSource.h"
 #include "clang/Sema/Overload.h"
@@ -1172,7 +1173,8 @@ static Decl *getInstantiatedFrom(Decl *D, MemberSpecializationInfo *MSInfo) {
 
 void Sema::makeMergedDefinitionVisible(NamedDecl *ND, SourceLocation Loc) {
   if (auto *Listener = getASTMutationListener())
-    Listener->RedefinedHiddenDefinition(ND, Loc);
+    Listener->RedefinedHiddenDefinition(ND,
+                                        PP.getModuleContainingLocation(Loc));
   ND->setHidden(false);
 }
 
index 29a88a13d38a5cddd8f224108760e7315136c2a1..1e7fc5cdb6a35b5fd729ffd1b24c5ec6dc0b4bef 100644 (file)
@@ -4598,7 +4598,7 @@ void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) {
         break;
 
       case UPD_DECL_EXPORTED:
-        Record.push_back(inferSubmoduleIDFromLocation(Update.getLoc()));
+        Record.push_back(getSubmoduleID(Update.getModule()));
         break;
       }
     }
@@ -5743,10 +5743,9 @@ void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(const Decl *D) {
   DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_OPENMP_THREADPRIVATE));
 }
 
-void ASTWriter::RedefinedHiddenDefinition(const NamedDecl *D,
-                                          SourceLocation Loc) {
+void ASTWriter::RedefinedHiddenDefinition(const NamedDecl *D, Module *M) {
   assert(!WritingAST && "Already writing the AST!");
   assert(D->isHidden() && "expected a hidden declaration");
   assert(D->isFromASTFile() && "hidden decl not from AST file");
-  DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_EXPORTED, Loc));
+  DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_EXPORTED, M));
 }