On 10 May 2017 at 16:10, Argyrios Kyrtzidis via cfe-commits < cfe-commits@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 > 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 > ============================================================ > ================== > --- 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 > ============================================================ > ================== > --- 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") > +@interface ExtCls > +-(void)method; > +@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 > ============================================================ > ================== > --- 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 > ============================================================ > ================== > --- 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 > ============================================================ > ================== > --- 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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits