r302677 - [libclang] Introduce clang_Cursor_isExternalSymbol that provides info about decls marked with external_source_symbol attribute

Argyrios Kyrtzidis via cfe-commits cfe-commits at lists.llvm.org
Wed May 10 10:00:13 PDT 2017


That’s a good idea, if you don’t get to it I’ll look into it at some point later on but it will probably not be soon.

> On May 10, 2017, at 9:10 AM, Alex L <arphaman at gmail.com> wrote:
> 
> 
> 
> On 10 May 2017 at 16:10, Argyrios Kyrtzidis via cfe-commits <cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>> wrote:
> Author: akirtzidis
> Date: Wed May 10 10:10:36 2017
> New Revision: 302677
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=302677&view=rev <http://llvm.org/viewvc/llvm-project?rev=302677&view=rev>
> Log:
> [libclang] Introduce clang_Cursor_isExternalSymbol that provides info about decls marked with external_source_symbol attribute
> 
> Modified:
>     cfe/trunk/include/clang-c/Index.h
>     cfe/trunk/test/Index/get-cursor.m
>     cfe/trunk/tools/c-index-test/c-index-test.c
>     cfe/trunk/tools/libclang/CIndex.cpp
>     cfe/trunk/tools/libclang/libclang.exports
> 
> Modified: cfe/trunk/include/clang-c/Index.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=302677&r1=302676&r2=302677&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=302677&r1=302676&r2=302677&view=diff>
> ==============================================================================
> --- cfe/trunk/include/clang-c/Index.h (original)
> +++ cfe/trunk/include/clang-c/Index.h Wed May 10 10:10:36 2017
> @@ -32,7 +32,7 @@
>   * compatible, thus CINDEX_VERSION_MAJOR is expected to remain stable.
>   */
>  #define CINDEX_VERSION_MAJOR 0
> -#define CINDEX_VERSION_MINOR 38
> +#define CINDEX_VERSION_MINOR 39
> 
>  #define CINDEX_VERSION_ENCODE(major, minor) ( \
>        ((major) * 10000)                       \
> @@ -4081,6 +4081,23 @@ CINDEX_LINKAGE unsigned clang_Cursor_isO
>  CINDEX_LINKAGE unsigned clang_Cursor_isVariadic(CXCursor C);
> 
>  /**
> + * \brief Returns non-zero if the given cursor points to a symbol marked with
> + * external_source_symbol attribute.
> + *
> + * \param language If non-NULL, and the attribute is present, will be set to
> + * the 'language' string from the attribute.
> + *
> + * \param definedIn If non-NULL, and the attribute is present, will be set to
> + * the 'definedIn' string from the attribute.
> + *
> + * \param isGenerated If non-NULL, and the attribute is present, will be set to
> + * non-zero is the 'generated_declaration' is set in the attribute.
> + */
> +CINDEX_LINKAGE unsigned clang_Cursor_isExternalSymbol(CXCursor C,
> +                                       CXString *language, CXString *definedIn,
> +                                       unsigned *isGenerated);
> +
> +/**
>   * \brief Given a cursor that represents a declaration, return the associated
>   * comment's source range.  The range may include multiple consecutive comments
>   * with whitespace in between.
> 
> Modified: cfe/trunk/test/Index/get-cursor.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/get-cursor.m?rev=302677&r1=302676&r2=302677&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/get-cursor.m?rev=302677&r1=302676&r2=302677&view=diff>
> ==============================================================================
> --- cfe/trunk/test/Index/get-cursor.m (original)
> +++ cfe/trunk/test/Index/get-cursor.m Wed May 10 10:10:36 2017
> @@ -154,6 +154,12 @@ SomeT someVar;
>  typedef MY_TYPE2(SomeT2) { int x; };
>  SomeT2 someVar2;
> 
> +#define GEN_DECL(mod_name) __attribute__((external_source_symbol(language="Swift", defined_in=mod_name, generated_declaration)))
> +
> +GEN_DECL("some_module")
> + at interface ExtCls
> +-(void)method;
> + at end
> 
>  // RUN: c-index-test -cursor-at=%s:4:28 -cursor-at=%s:5:28 %s | FileCheck -check-prefix=CHECK-PROP %s
>  // CHECK-PROP: ObjCPropertyDecl=foo1:4:26
> @@ -226,3 +232,8 @@ SomeT2 someVar2;
>  // CHECK-TRANSPARENT: 147:1 TypeRef=TokenPaste_t:144:9 Extent=[147:1 - 147:13] Spelling=TokenPaste_t ([147:1 - 147:13])
>  // CHECK-TRANSPARENT: 151:1 TypeRef=SomeT:150:17 (Transparent: struct SomeT) Extent=[151:1 - 151:6] Spelling=SomeT ([151:1 - 151:6])
>  // CHECK-TRANSPARENT: 155:1 TypeRef=SomeT2:154:18 Extent=[155:1 - 155:7] Spelling=SomeT2 ([155:1 - 155:7])
> +
> +// RUN: c-index-test -cursor-at=%s:160:12 -cursor-at=%s:161:8 %s | FileCheck -check-prefix=CHECK-EXTERNAL %s
> +// CHECK-EXTERNAL: 160:12 ObjCInterfaceDecl=ExtCls:160:12 (external lang: Swift, defined: some_module, gen: 1)
> +// CHECK-EXTERNAL: 161:8 ObjCInstanceMethodDecl=method:161:8 (external lang: Swift, defined: some_module, gen: 1)
> +C
> \ No newline at end of file
> 
> Modified: cfe/trunk/tools/c-index-test/c-index-test.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=302677&r1=302676&r2=302677&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=302677&r1=302676&r2=302677&view=diff>
> ==============================================================================
> --- cfe/trunk/tools/c-index-test/c-index-test.c (original)
> +++ cfe/trunk/tools/c-index-test/c-index-test.c Wed May 10 10:10:36 2017
> @@ -809,6 +809,19 @@ static void PrintCursor(CXCursor Cursor,
>      if (clang_Cursor_isObjCOptional(Cursor))
>        printf(" (@optional)");
> 
> +    {
> +      CXString language;
> +      CXString definedIn;
> +      unsigned generated;
> +      if (clang_Cursor_isExternalSymbol(Cursor, &language, &definedIn,
> +                                        &generated)) {
> +        printf(" (external lang: %s, defined: %s, gen: %d)",
> +            clang_getCString(language), clang_getCString(definedIn), generated);
> +        clang_disposeString(language);
> +        clang_disposeString(definedIn);
> +      }
> +    }
> +
>      if (Cursor.kind == CXCursor_IBOutletCollectionAttr) {
>        CXType T =
>          clang_getCanonicalType(clang_getIBOutletCollectionType(Cursor));
> 
> Modified: cfe/trunk/tools/libclang/CIndex.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=302677&r1=302676&r2=302677&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=302677&r1=302676&r2=302677&view=diff>
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
> +++ cfe/trunk/tools/libclang/CIndex.cpp Wed May 10 10:10:36 2017
> @@ -7479,6 +7479,35 @@ unsigned clang_Cursor_isVariadic(CXCurso
>    return 0;
>  }
> 
> +unsigned clang_Cursor_isExternalSymbol(CXCursor C,
> +                                     CXString *language, CXString *definedIn,
> +                                     unsigned *isGenerated) {
> +  if (!clang_isDeclaration(C.kind))
> +    return 0;
> +
> +  const Decl *D = getCursorDecl(C);
> +
> +  auto getExternalSymAttr = [](const Decl *D) -> ExternalSourceSymbolAttr* {
> +    if (auto *attr = D->getAttr<ExternalSourceSymbolAttr>())
> +      return attr;
> +    if (auto *dcd = dyn_cast<Decl>(D->getDeclContext())) {
> +      if (auto *attr = dcd->getAttr<ExternalSourceSymbolAttr>())
> +        return attr;
> +    }
> +    return nullptr;
> +  };
> 
> 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.
>  
> +  if (auto *attr = getExternalSymAttr(D)) {
> +    if (language)
> +      *language = cxstring::createDup(attr->getLanguage());
> +    if (definedIn)
> +      *definedIn = cxstring::createDup(attr->getDefinedIn());
> +    if (isGenerated)
> +      *isGenerated = attr->getGeneratedDeclaration();
> +    return 1;
> +  }
> +  return 0;
> +}
> +
>  CXSourceRange clang_Cursor_getCommentRange(CXCursor C) {
>    if (!clang_isDeclaration(C.kind))
>      return clang_getNullRange();
> 
> Modified: cfe/trunk/tools/libclang/libclang.exports
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=302677&r1=302676&r2=302677&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=302677&r1=302676&r2=302677&view=diff>
> ==============================================================================
> --- cfe/trunk/tools/libclang/libclang.exports (original)
> +++ cfe/trunk/tools/libclang/libclang.exports Wed May 10 10:10:36 2017
> @@ -35,6 +35,7 @@ clang_Cursor_getReceiverType
>  clang_Cursor_isAnonymous
>  clang_Cursor_isBitField
>  clang_Cursor_isDynamicCall
> +clang_Cursor_isExternalSymbol
>  clang_Cursor_isNull
>  clang_Cursor_isObjCOptional
>  clang_Cursor_isVariadic
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170510/d16caab5/attachment-0001.html>


More information about the cfe-commits mailing list