<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 10 May 2017 at 16:10, Argyrios Kyrtzidis via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Author: akirtzidis<br>
Date: Wed May 10 10:10:36 2017<br>
New Revision: 302677<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=302677&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=302677&view=rev</a><br>
Log:<br>
[libclang] Introduce clang_Cursor_isExternalSymbol that provides info about decls marked with external_source_symbol attribute<br>
<br>
Modified:<br>
    cfe/trunk/include/clang-c/<wbr>Index.h<br>
    cfe/trunk/test/Index/get-<wbr>cursor.m<br>
    cfe/trunk/tools/c-index-test/<wbr>c-index-test.c<br>
    cfe/trunk/tools/libclang/<wbr>CIndex.cpp<br>
    cfe/trunk/tools/libclang/<wbr>libclang.exports<br>
<br>
Modified: cfe/trunk/include/clang-c/<wbr>Index.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=302677&r1=302676&r2=302677&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang-c/Index.h?rev=302677&r1=<wbr>302676&r2=302677&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang-c/<wbr>Index.h (original)<br>
+++ cfe/trunk/include/clang-c/<wbr>Index.h Wed May 10 10:10:36 2017<br>
@@ -32,7 +32,7 @@<br>
  * compatible, thus CINDEX_VERSION_MAJOR is expected to remain stable.<br>
  */<br>
 #define CINDEX_VERSION_MAJOR 0<br>
-#define CINDEX_VERSION_MINOR 38<br>
+#define CINDEX_VERSION_MINOR 39<br>
<br>
 #define CINDEX_VERSION_ENCODE(major, minor) ( \<br>
       ((major) * 10000)                       \<br>
@@ -4081,6 +4081,23 @@ CINDEX_LINKAGE unsigned clang_Cursor_isO<br>
 CINDEX_LINKAGE unsigned clang_Cursor_isVariadic(<wbr>CXCursor C);<br>
<br>
 /**<br>
+ * \brief Returns non-zero if the given cursor points to a symbol marked with<br>
+ * external_source_symbol attribute.<br>
+ *<br>
+ * \param language If non-NULL, and the attribute is present, will be set to<br>
+ * the 'language' string from the attribute.<br>
+ *<br>
+ * \param definedIn If non-NULL, and the attribute is present, will be set to<br>
+ * the 'definedIn' string from the attribute.<br>
+ *<br>
+ * \param isGenerated If non-NULL, and the attribute is present, will be set to<br>
+ * non-zero is the 'generated_declaration' is set in the attribute.<br>
+ */<br>
+CINDEX_LINKAGE unsigned clang_Cursor_isExternalSymbol(<wbr>CXCursor C,<br>
+                                       CXString *language, CXString *definedIn,<br>
+                                       unsigned *isGenerated);<br>
+<br>
+/**<br>
  * \brief Given a cursor that represents a declaration, return the associated<br>
  * comment's source range.  The range may include multiple consecutive comments<br>
  * with whitespace in between.<br>
<br>
Modified: cfe/trunk/test/Index/get-<wbr>cursor.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/get-cursor.m?rev=302677&r1=302676&r2=302677&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/Index/<wbr>get-cursor.m?rev=302677&r1=<wbr>302676&r2=302677&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Index/get-<wbr>cursor.m (original)<br>
+++ cfe/trunk/test/Index/get-<wbr>cursor.m Wed May 10 10:10:36 2017<br>
@@ -154,6 +154,12 @@ SomeT someVar;<br>
 typedef MY_TYPE2(SomeT2) { int x; };<br>
 SomeT2 someVar2;<br>
<br>
+#define GEN_DECL(mod_name) __attribute__((external_<wbr>source_symbol(language="Swift"<wbr>, defined_in=mod_name, generated_declaration)))<br>
+<br>
+GEN_DECL("some_module")<br>
+@interface ExtCls<br>
+-(void)method;<br>
+@end<br>
<br>
 // RUN: c-index-test -cursor-at=%s:4:28 -cursor-at=%s:5:28 %s | FileCheck -check-prefix=CHECK-PROP %s<br>
 // CHECK-PROP: ObjCPropertyDecl=foo1:4:26<br>
@@ -226,3 +232,8 @@ SomeT2 someVar2;<br>
 // CHECK-TRANSPARENT: 147:1 TypeRef=TokenPaste_t:144:9 Extent=[147:1 - 147:13] Spelling=TokenPaste_t ([147:1 - 147:13])<br>
 // CHECK-TRANSPARENT: 151:1 TypeRef=SomeT:150:17 (Transparent: struct SomeT) Extent=[151:1 - 151:6] Spelling=SomeT ([151:1 - 151:6])<br>
 // CHECK-TRANSPARENT: 155:1 TypeRef=SomeT2:154:18 Extent=[155:1 - 155:7] Spelling=SomeT2 ([155:1 - 155:7])<br>
+<br>
+// RUN: c-index-test -cursor-at=%s:160:12 -cursor-at=%s:161:8 %s | FileCheck -check-prefix=CHECK-EXTERNAL %s<br>
+// CHECK-EXTERNAL: 160:12 ObjCInterfaceDecl=ExtCls:160:<wbr>12 (external lang: Swift, defined: some_module, gen: 1)<br>
+// CHECK-EXTERNAL: 161:8 ObjCInstanceMethodDecl=method:<wbr>161:8 (external lang: Swift, defined: some_module, gen: 1)<br>
+C<br>
\ No newline at end of file<br>
<br>
Modified: cfe/trunk/tools/c-index-test/<wbr>c-index-test.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=302677&r1=302676&r2=302677&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/tools/c-<wbr>index-test/c-index-test.c?rev=<wbr>302677&r1=302676&r2=302677&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/tools/c-index-test/<wbr>c-index-test.c (original)<br>
+++ cfe/trunk/tools/c-index-test/<wbr>c-index-test.c Wed May 10 10:10:36 2017<br>
@@ -809,6 +809,19 @@ static void PrintCursor(CXCursor Cursor,<br>
     if (clang_Cursor_isObjCOptional(<wbr>Cursor))<br>
       printf(" (@optional)");<br>
<br>
+    {<br>
+      CXString language;<br>
+      CXString definedIn;<br>
+      unsigned generated;<br>
+      if (clang_Cursor_<wbr>isExternalSymbol(Cursor, &language, &definedIn,<br>
+                                        &generated)) {<br>
+        printf(" (external lang: %s, defined: %s, gen: %d)",<br>
+            clang_getCString(language), clang_getCString(definedIn), generated);<br>
+        clang_disposeString(language);<br>
+        clang_disposeString(definedIn)<wbr>;<br>
+      }<br>
+    }<br>
+<br>
     if (Cursor.kind == CXCursor_<wbr>IBOutletCollectionAttr) {<br>
       CXType T =<br>
         clang_getCanonicalType(clang_<wbr>getIBOutletCollectionType(<wbr>Cursor));<br>
<br>
Modified: cfe/trunk/tools/libclang/<wbr>CIndex.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=302677&r1=302676&r2=302677&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/tools/<wbr>libclang/CIndex.cpp?rev=<wbr>302677&r1=302676&r2=302677&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/tools/libclang/<wbr>CIndex.cpp (original)<br>
+++ cfe/trunk/tools/libclang/<wbr>CIndex.cpp Wed May 10 10:10:36 2017<br>
@@ -7479,6 +7479,35 @@ unsigned clang_Cursor_isVariadic(<wbr>CXCurso<br>
   return 0;<br>
 }<br>
<br>
+unsigned clang_Cursor_isExternalSymbol(<wbr>CXCursor C,<br>
+                                     CXString *language, CXString *definedIn,<br>
+                                     unsigned *isGenerated) {<br>
+  if (!clang_isDeclaration(C.kind))<br>
+    return 0;<br>
+<br>
+  const Decl *D = getCursorDecl(C);<br>
+<br>
+  auto getExternalSymAttr = [](const Decl *D) -> ExternalSourceSymbolAttr* {<br>
+    if (auto *attr = D->getAttr<<wbr>ExternalSourceSymbolAttr>())<br>
+      return attr;<br>
+    if (auto *dcd = dyn_cast<Decl>(D-><wbr>getDeclContext())) {<br>
+      if (auto *attr = dcd->getAttr<<wbr>ExternalSourceSymbolAttr>())<br>
+        return attr;<br>
+    }<br>
+    return nullptr;<br>
+  };<br></blockquote><div><br></div><div>I think this pattern is used in the indexing code as well. We should probably create a method in Decl that does this search for ExternalSourceSymbol attribute.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
+  if (auto *attr = getExternalSymAttr(D)) {<br>
+    if (language)<br>
+      *language = cxstring::createDup(attr-><wbr>getLanguage());<br>
+    if (definedIn)<br>
+      *definedIn = cxstring::createDup(attr-><wbr>getDefinedIn());<br>
+    if (isGenerated)<br>
+      *isGenerated = attr->getGeneratedDeclaration(<wbr>);<br>
+    return 1;<br>
+  }<br>
+  return 0;<br>
+}<br>
+<br>
 CXSourceRange clang_Cursor_getCommentRange(<wbr>CXCursor C) {<br>
   if (!clang_isDeclaration(C.kind))<br>
     return clang_getNullRange();<br>
<br>
Modified: cfe/trunk/tools/libclang/<wbr>libclang.exports<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=302677&r1=302676&r2=302677&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/tools/<wbr>libclang/libclang.exports?rev=<wbr>302677&r1=302676&r2=302677&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/tools/libclang/<wbr>libclang.exports (original)<br>
+++ cfe/trunk/tools/libclang/<wbr>libclang.exports Wed May 10 10:10:36 2017<br>
@@ -35,6 +35,7 @@ clang_Cursor_getReceiverType<br>
 clang_Cursor_isAnonymous<br>
 clang_Cursor_isBitField<br>
 clang_Cursor_isDynamicCall<br>
+clang_Cursor_isExternalSymbol<br>
 clang_Cursor_isNull<br>
 clang_Cursor_isObjCOptional<br>
 clang_Cursor_isVariadic<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>