[libclang 7/8] Add support for getting property setter and getter names

Summary: This allows libclang to access the actual names of property setters and getters without needing to go through the indexer API. Usually default names are used, but the property can specify a different name.

Reviewers: yvvan, jbcoe

Reviewed By: yvvan

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D49634

llvm-svn: 338816
This commit is contained in:
Michael Wu 2018-08-03 05:38:29 +00:00
parent 40ff105663
commit 6e88f5334c
5 changed files with 76 additions and 0 deletions

View File

@ -4448,6 +4448,18 @@ typedef enum {
CINDEX_LINKAGE unsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C,
unsigned reserved);
/**
* Given a cursor that represents a property declaration, return the
* name of the method that implements the getter.
*/
CINDEX_LINKAGE CXString clang_Cursor_getObjCPropertyGetterName(CXCursor C);
/**
* Given a cursor that represents a property declaration, return the
* name of the method that implements the setter, if any.
*/
CINDEX_LINKAGE CXString clang_Cursor_getObjCPropertySetterName(CXCursor C);
/**
* 'Qualifiers' written next to the return and parameter types in
* Objective-C method declarations.

View File

@ -0,0 +1,10 @@
@interface Foo
@property (assign,readwrite,getter=b,setter=c:) id a;
@property (assign,readonly,getter=e) id d;
@property (assign,readwrite) id f;
@end
// RUN: c-index-test -test-print-type-declaration %s | FileCheck %s
// CHECK: ObjCPropertyDecl=a:2:52 [getter,assign,readwrite,setter,] (getter=b) (setter=c:) [typedeclaration=id] [typekind=ObjCId]
// CHECK: ObjCPropertyDecl=d:3:41 [readonly,getter,assign,] (getter=e) [typedeclaration=id] [typekind=ObjCId]
// CHECK: ObjCPropertyDecl=f:4:33 [assign,readwrite,] [typedeclaration=id] [typekind=ObjCId]

View File

@ -1103,6 +1103,34 @@ static void PrintCursor(CXCursor Cursor, const char *CommentSchemaFile) {
}
}
if (Cursor.kind == CXCursor_ObjCPropertyDecl) {
CXString Name = clang_Cursor_getObjCPropertyGetterName(Cursor);
CXString Spelling = clang_getCursorSpelling(Cursor);
const char *CName = clang_getCString(Name);
const char *CSpelling = clang_getCString(Spelling);
if (CName && strcmp(CName, CSpelling)) {
printf(" (getter=%s)", CName);
}
clang_disposeString(Spelling);
clang_disposeString(Name);
}
if (Cursor.kind == CXCursor_ObjCPropertyDecl) {
CXString Name = clang_Cursor_getObjCPropertySetterName(Cursor);
CXString Spelling = clang_getCursorSpelling(Cursor);
const char *CName = clang_getCString(Name);
const char *CSpelling = clang_getCString(Spelling);
char *DefaultSetter = malloc(strlen(CSpelling) + 5);
sprintf(DefaultSetter, "set%s:", CSpelling);
DefaultSetter[3] &= ~(1 << 5); /* Make uppercase */
if (CName && strcmp(CName, DefaultSetter)) {
printf(" (setter=%s)", CName);
}
free(DefaultSetter);
clang_disposeString(Spelling);
clang_disposeString(Name);
}
{
unsigned QT = clang_Cursor_getObjCDeclQualifiers(Cursor);
if (QT != CXObjCDeclQualifier_None) {

View File

@ -7913,6 +7913,30 @@ unsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C, unsigned reserved) {
return Result;
}
CXString clang_Cursor_getObjCPropertyGetterName(CXCursor C) {
if (C.kind != CXCursor_ObjCPropertyDecl)
return cxstring::createNull();
const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C));
Selector sel = PD->getGetterName();
if (sel.isNull())
return cxstring::createNull();
return cxstring::createDup(sel.getAsString());
}
CXString clang_Cursor_getObjCPropertySetterName(CXCursor C) {
if (C.kind != CXCursor_ObjCPropertyDecl)
return cxstring::createNull();
const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C));
Selector sel = PD->getSetterName();
if (sel.isNull())
return cxstring::createNull();
return cxstring::createDup(sel.getAsString());
}
unsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C) {
if (!clang_isDeclaration(C.kind))
return CXObjCDeclQualifier_None;

View File

@ -31,6 +31,8 @@ clang_Cursor_getRawCommentText
clang_Cursor_getNumArguments
clang_Cursor_getObjCDeclQualifiers
clang_Cursor_getObjCPropertyAttributes
clang_Cursor_getObjCPropertyGetterName
clang_Cursor_getObjCPropertySetterName
clang_Cursor_getObjCSelectorIndex
clang_Cursor_getOffsetOfField
clang_Cursor_getSpellingNameRange