]> granicus.if.org Git - clang/commitdiff
[libclang] Indexing API: provide both the semantic and the lexical container.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 7 Dec 2011 20:44:19 +0000 (20:44 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 7 Dec 2011 20:44:19 +0000 (20:44 +0000)
They are generally the same except in C++ cases like out-of-line member functions.

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

include/clang-c/Index.h
tools/c-index-test/c-index-test.c
tools/libclang/IndexingContext.cpp
tools/libclang/IndexingContext.h

index 5d1e19ead05f5da77cc467c046338d9b1a07cc17..dac8b54094f1b755c1c2b04d568f893acb005193 100644 (file)
@@ -4199,7 +4199,12 @@ typedef struct {
   const CXIdxEntityInfo *entityInfo;
   CXCursor cursor;
   CXIdxLoc loc;
-  const CXIdxContainerInfo *container;
+  const CXIdxContainerInfo *semanticContainer;
+  /**
+   * \brief Generally same as \see semanticContainer but can be different in
+   * cases like out-of-line C++ member functions.
+   */
+  const CXIdxContainerInfo *lexicalContainer;
   int isRedeclaration;
   int isDefinition;
   int isContainer;
@@ -4279,6 +4284,7 @@ typedef enum {
  * \brief Data for \see indexEntityReference callback.
  */
 typedef struct {
+  CXIdxEntityRefKind kind;
   /**
    * \brief Reference cursor.
    */
@@ -4303,7 +4309,6 @@ typedef struct {
    * \brief Container context of the reference.
    */
   const CXIdxContainerInfo *container;
-  CXIdxEntityRefKind kind;
 } CXIdxEntityRefInfo;
 
 typedef struct {
index 18a0a6b28ddbc4204c96e2e006ff4d3a0e4d0f7b..1370e21c81b803f8686bac09d033c102ad358614 100644 (file)
@@ -1801,8 +1801,10 @@ static void index_indexDeclaration(CXClientData client_data,
   PrintCursor(info->cursor);
   printf(" | loc: ");
   printCXIndexLoc(info->loc);
-  printf(" | container: ");
-  printCXIndexContainer(info->container);
+  printf(" | semantic-container: ");
+  printCXIndexContainer(info->semanticContainer);
+  printf(" | lexical-container: ");
+  printCXIndexContainer(info->lexicalContainer);
   printf(" | isRedecl: %d", info->isRedeclaration);
   printf(" | isDef: %d", info->isDefinition);
   printf(" | isContainer: %d", info->isContainer);
index 0ec8619bed2e49b74db84e9dbcc044f35beab67f..657aed8f6a9ddc2c7d7e908fa7fee7d1c1eeaaba 100644 (file)
@@ -239,8 +239,10 @@ bool IndexingContext::handleDecl(const NamedDecl *D,
   DInfo.attributes = AttrList.getAttrs();
   DInfo.numAttributes = AttrList.getNumAttrs();
 
-  getContainerInfo(D->getDeclContext(), DInfo.Container);
-  DInfo.container = &DInfo.Container;
+  getContainerInfo(D->getDeclContext(), DInfo.SemanticContainer);
+  getContainerInfo(D->getLexicalDeclContext(), DInfo.LexicalContainer);
+  DInfo.semanticContainer = &DInfo.SemanticContainer;
+  DInfo.lexicalContainer = &DInfo.LexicalContainer;
   if (DInfo.isContainer) {
     getContainerInfo(getEntityContainer(D), DInfo.DeclAsContainer);
     DInfo.declAsContainer = &DInfo.DeclAsContainer;
@@ -506,12 +508,12 @@ bool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
   ContainerInfo Container;
   getContainerInfo(DC, Container);
 
-  CXIdxEntityRefInfo Info = { Cursor,
+  CXIdxEntityRefInfo Info = { Kind,
+                              Cursor,
                               getIndexLoc(Loc),
                               &RefEntity,
                               Parent ? &ParentEntity : 0,
-                              &Container,
-                              Kind };
+                              &Container };
   CB.indexEntityReference(ClientData, &Info);
   return true;
 }
index ff5ca1b819b3354938304ff828db81c5b349cecd..bce3ab33f073f7a656d4cbe3c09b3d2efffcf352 100644 (file)
@@ -54,7 +54,8 @@ struct DeclInfo : public CXIdxDeclInfo {
   DInfoKind Kind;
 
   EntityInfo EntInfo;
-  ContainerInfo Container;
+  ContainerInfo SemanticContainer;
+  ContainerInfo LexicalContainer;
   ContainerInfo DeclAsContainer;
 
   DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
@@ -64,7 +65,7 @@ struct DeclInfo : public CXIdxDeclInfo {
     this->isContainer = isContainer;
     attributes = 0;
     numAttributes = 0;
-    declAsContainer = container = 0;
+    declAsContainer = semanticContainer = lexicalContainer = 0;
   }
   DeclInfo(DInfoKind K,
            bool isRedeclaration, bool isDefinition, bool isContainer)
@@ -74,7 +75,7 @@ struct DeclInfo : public CXIdxDeclInfo {
     this->isContainer = isContainer;
     attributes = 0;
     numAttributes = 0;
-    declAsContainer = container = 0;
+    declAsContainer = semanticContainer = lexicalContainer = 0;
   }
 
   static bool classof(const DeclInfo *) { return true; }