[cfe-commits] r98935 - in /cfe/trunk: test/Index/c-index-getCursor-pp.c tools/CIndex/CIndex.cpp

Douglas Gregor dgregor at apple.com
Thu Mar 18 22:22:59 PDT 2010


Author: dgregor
Date: Fri Mar 19 00:22:59 2010
New Revision: 98935

URL: http://llvm.org/viewvc/llvm-project?rev=98935&view=rev
Log:
Visit preprocessing elements (macro instantiations and macro
definitions) as part of the translation unit, so that normal
visitation, token-annotation, and cursor-at retrieval all see
preprocessing elements.


Added:
    cfe/trunk/test/Index/c-index-getCursor-pp.c
      - copied unchanged from r98928, cfe/trunk/test/Index/c-index-getCursor-pp.c
Modified:
    cfe/trunk/tools/CIndex/CIndex.cpp

Modified: cfe/trunk/tools/CIndex/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndex.cpp?rev=98935&r1=98934&r2=98935&view=diff
==============================================================================
--- cfe/trunk/tools/CIndex/CIndex.cpp (original)
+++ cfe/trunk/tools/CIndex/CIndex.cpp Fri Mar 19 00:22:59 2010
@@ -425,11 +425,31 @@
         if (Visit(MakeCXCursor(*it, CXXUnit), true))
           return true;
       }
-    } else {
-      return VisitDeclContext(
-                            CXXUnit->getASTContext().getTranslationUnitDecl());
-    }
+    } else if (VisitDeclContext(
+                            CXXUnit->getASTContext().getTranslationUnitDecl()))
+      return true;
 
+    // Walk the preprocessing record.
+    if (CXXUnit->hasPreprocessingRecord()) {
+      // FIXME: Once we have the ability to deserialize a preprocessing record,
+      // do so.
+      PreprocessingRecord &PPRec = CXXUnit->getPreprocessingRecord();
+      for (PreprocessingRecord::iterator E = PPRec.begin(), EEnd = PPRec.end();
+           E != EEnd; ++E) {
+        if (MacroInstantiation *MI = dyn_cast<MacroInstantiation>(*E)) {
+          if (Visit(MakeMacroInstantiationCursor(MI, CXXUnit)))
+            return true;
+          continue;
+        }
+        
+        if (MacroDefinition *MD = dyn_cast<MacroDefinition>(*E)) {
+          if (Visit(MakeMacroDefinitionCursor(MD, CXXUnit)))
+            return true;
+          
+          continue;
+        }
+      }
+    }
     return false;
   }
 
@@ -2059,51 +2079,6 @@
 // Token-based Operations.
 //===----------------------------------------------------------------------===//
 
-namespace {
-  class ComparePreprocessedEntityLocation {
-    SourceManager &SM;
-
-  public:
-    explicit ComparePreprocessedEntityLocation(SourceManager &SM) : SM(SM) { }
-
-    bool operator()(const PreprocessedEntity *Entity, SourceLocation Loc) const{
-      return SM.isBeforeInTranslationUnit(Entity->getSourceRange().getEnd(), 
-                                          Loc);
-    }
-
-    bool operator()(SourceLocation Loc, const PreprocessedEntity *Entity) const{
-      return SM.isBeforeInTranslationUnit(Loc, 
-                                          Entity->getSourceRange().getBegin());
-    }
-
-    bool operator()(const PreprocessedEntity *Entity, SourceRange R) const {
-      return SM.isBeforeInTranslationUnit(Entity->getSourceRange().getEnd(), 
-                                          R.getBegin());
-    }
-
-    bool operator()(SourceRange R, const PreprocessedEntity *Entity) const {
-      return SM.isBeforeInTranslationUnit(R.getEnd(), 
-                                          Entity->getSourceRange().getBegin());
-    }
-    
-    bool operator()(const PreprocessedEntity *Entity1,
-                    const PreprocessedEntity *Entity2) const {
-      return SM.isBeforeInTranslationUnit(Entity1->getSourceRange().getEnd(),
-                                          Entity2->getSourceRange().getBegin());
-    }
-    
-    bool operator()(SourceRange R1, SourceRange R2) const {
-      return SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin());
-    }
-    
-    bool operator()(SourceLocation Loc1, SourceLocation Loc2) const {
-      return SM.isBeforeInTranslationUnit(Loc1, Loc2);
-    }
-  };
-}
-
-
-
 /* CXToken layout:
  *   int_data[0]: a CXTokenKind
  *   int_data[1]: starting token location
@@ -2293,6 +2268,8 @@
       return CXChildVisit_Recurse;
 
     // Okay: we can annotate the location of this expression
+  } else if (clang_isPreprocessing(cursor.kind)) {
+    // We can always annotate a preprocessing directive/macro instantiation.
   } else {
     // Nothing to annotate
     return CXChildVisit_Recurse;
@@ -2319,47 +2296,32 @@
 
   ASTUnit::ConcurrencyCheck Check(*CXXUnit);
 
-  // Annotate all of the source locations in the region of interest that map to
-  // a specific cursor.
+  // Determine the region of interest, which contains all of the tokens.
   SourceRange RegionOfInterest;
   RegionOfInterest.setBegin(
         cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0])));
   SourceLocation End
-    = cxloc::translateSourceLocation(clang_getTokenLocation(TU,
-                                                     Tokens[NumTokens - 1]));
+  = cxloc::translateSourceLocation(clang_getTokenLocation(TU,
+                                                        Tokens[NumTokens - 1]));
   RegionOfInterest.setEnd(CXXUnit->getPreprocessor().getLocForEndOfToken(End));
-  
+
+  // A mapping from the source locations found when re-lexing or traversing the
+  // region of interest to the corresponding cursors.
   AnnotateTokensData Annotated;
-  CXCursor Parent = clang_getTranslationUnitCursor(CXXUnit);
-  CursorVisitor AnnotateVis(CXXUnit, AnnotateTokensVisitor, &Annotated,
-                            Decl::MaxPCHLevel, RegionOfInterest);
-  AnnotateVis.VisitChildren(Parent);
 
-  // Look for macro instantiations and preprocessing directives in the 
-  // source range containing the annotated tokens. We do this by re-lexing the
-  // tokens in the source range.
+  // Relex the tokens within the source range to look for preprocessing 
+  // directives.
   SourceManager &SourceMgr = CXXUnit->getSourceManager();
   std::pair<FileID, unsigned> BeginLocInfo
     = SourceMgr.getDecomposedLoc(RegionOfInterest.getBegin());
   std::pair<FileID, unsigned> EndLocInfo
     = SourceMgr.getDecomposedLoc(RegionOfInterest.getEnd());
   
-  bool RelexOkay = true;
-  
-  // Cannot re-tokenize across files.
-  if (BeginLocInfo.first != EndLocInfo.first)
-    RelexOkay = false;
-  
   llvm::StringRef Buffer;
-  if (RelexOkay) {
-    // Create a lexer
-    bool Invalid = false;
-    Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
-    if (Invalid)
-      RelexOkay = false;
-  }
-    
-  if (RelexOkay) {
+  bool Invalid = false;
+  if (BeginLocInfo.first == EndLocInfo.first &&
+      ((Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid)),true) &&
+      !Invalid) {
     Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
               CXXUnit->getASTContext().getLangOptions(),
               Buffer.begin(), Buffer.data() + BeginLocInfo.second, 
@@ -2368,7 +2330,6 @@
     
     // Lex tokens in raw mode until we hit the end of the range, to avoid 
     // entering #includes or expanding macros.
-    std::vector<Token> TokenStream;
     while (true) {
       Token Tok;
       Lex.LexFromRawLexer(Tok);
@@ -2407,35 +2368,13 @@
         break;
     }
   }
-   
-  if (CXXUnit->hasPreprocessingRecord()) {
-    PreprocessingRecord &PPRec = CXXUnit->getPreprocessingRecord();
-    std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
-      Entities = std::equal_range(PPRec.begin(), PPRec.end(), RegionOfInterest,
-                                  ComparePreprocessedEntityLocation(SourceMgr));
-    for (; Entities.first != Entities.second; ++Entities.first) {
-      PreprocessedEntity *Entity = *Entities.first;
-      if (MacroInstantiation *MI = dyn_cast<MacroInstantiation>(Entity)) {
-        SourceLocation Loc = MI->getSourceRange().getBegin();
-        if (Loc.isFileID()) {
-          Annotated[Loc.getRawEncoding()]
-            = MakeMacroInstantiationCursor(MI, CXXUnit);
-        }
-
-        continue;
-      }
-
-      if (MacroDefinition *MD = dyn_cast<MacroDefinition>(Entity)) {
-        SourceLocation Loc = MD->getLocation();
-        if (Loc.isFileID()) {
-          Annotated[Loc.getRawEncoding()] 
-            = MakeMacroDefinitionCursor(MD, CXXUnit);
-        }
-
-        continue;
-      }
-    }
-  }
+  
+  // Annotate all of the source locations in the region of interest that map to
+  // a specific cursor.  
+  CXCursor Parent = clang_getTranslationUnitCursor(CXXUnit);
+  CursorVisitor AnnotateVis(CXXUnit, AnnotateTokensVisitor, &Annotated,
+                            Decl::MaxPCHLevel, RegionOfInterest);
+  AnnotateVis.VisitChildren(Parent);
   
   for (unsigned I = 0; I != NumTokens; ++I) {
     // Determine whether we saw a cursor at this token's location.
@@ -2460,6 +2399,9 @@
 
 extern "C" {
 CXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
+  if (!clang_isDeclaration(cursor.kind))
+    return CXLinkage_Invalid;
+
   Decl *D = cxcursor::getCursorDecl(cursor);
   if (NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
     switch (ND->getLinkage()) {





More information about the cfe-commits mailing list