forked from OSchip/llvm-project
Expose cxx constructor and method properties through libclang and python bindings.
Summary: I have exposed the following function through libclang and the clang.cindex python bindings: clang_CXXConstructor_isConvertingConstructor, clang_CXXConstructor_isCopyConstructor, clang_CXXConstructor_isDefaultConstructor, clang_CXXConstructor_isMoveConstructor, clang_CXXMethod_isDefaulted I need (some of) these methods for a C++ code model I am building in Python to drive a code generator. Reviewers: compnerd, skalinichev Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D15469 llvm-svn: 267706
This commit is contained in:
parent
7ac9628648
commit
2956535b7c
|
@ -1174,6 +1174,32 @@ class Cursor(Structure):
|
|||
"""
|
||||
return conf.lib.clang_CXXMethod_isConst(self)
|
||||
|
||||
def is_converting_constructor(self):
|
||||
"""Returns True if the cursor refers to a C++ converting constructor.
|
||||
"""
|
||||
return conf.lib.clang_CXXConstructor_isConvertingConstructor(self)
|
||||
|
||||
def is_copy_constructor(self):
|
||||
"""Returns True if the cursor refers to a C++ copy constructor.
|
||||
"""
|
||||
return conf.lib.clang_CXXConstructor_isCopyConstructor(self)
|
||||
|
||||
def is_default_constructor(self):
|
||||
"""Returns True if the cursor refers to a C++ default constructor.
|
||||
"""
|
||||
return conf.lib.clang_CXXConstructor_isDefaultConstructor(self)
|
||||
|
||||
def is_move_constructor(self):
|
||||
"""Returns True if the cursor refers to a C++ move constructor.
|
||||
"""
|
||||
return conf.lib.clang_CXXConstructor_isMoveConstructor(self)
|
||||
|
||||
def is_default_method(self):
|
||||
"""Returns True if the cursor refers to a C++ member function or member
|
||||
function template that is declared '= default'.
|
||||
"""
|
||||
return conf.lib.clang_CXXMethod_isDefaulted(self)
|
||||
|
||||
def is_mutable_field(self):
|
||||
"""Returns True if the cursor refers to a C++ field that is declared
|
||||
'mutable'.
|
||||
|
@ -2918,6 +2944,22 @@ functionList = [
|
|||
[Index, c_char_p],
|
||||
c_object_p),
|
||||
|
||||
("clang_CXXConstructor_isConvertingConstructor",
|
||||
[Cursor],
|
||||
bool),
|
||||
|
||||
("clang_CXXConstructor_isCopyConstructor",
|
||||
[Cursor],
|
||||
bool),
|
||||
|
||||
("clang_CXXConstructor_isDefaultConstructor",
|
||||
[Cursor],
|
||||
bool),
|
||||
|
||||
("clang_CXXConstructor_isMoveConstructor",
|
||||
[Cursor],
|
||||
bool),
|
||||
|
||||
("clang_CXXField_isMutable",
|
||||
[Cursor],
|
||||
bool),
|
||||
|
@ -2926,6 +2968,10 @@ functionList = [
|
|||
[Cursor],
|
||||
bool),
|
||||
|
||||
("clang_CXXMethod_isDefaulted",
|
||||
[Cursor],
|
||||
bool),
|
||||
|
||||
("clang_CXXMethod_isPureVirtual",
|
||||
[Cursor],
|
||||
bool),
|
||||
|
|
|
@ -112,6 +112,88 @@ def test_is_const_method():
|
|||
assert foo.is_const_method()
|
||||
assert not bar.is_const_method()
|
||||
|
||||
def test_is_converting_constructor():
|
||||
"""Ensure Cursor.is_converting_constructor works."""
|
||||
source = 'class X { explicit X(int); X(double); X(); };'
|
||||
tu = get_tu(source, lang='cpp')
|
||||
|
||||
xs = get_cursors(tu, 'X')
|
||||
|
||||
assert len(xs) == 4
|
||||
assert xs[0].kind == CursorKind.CLASS_DECL
|
||||
cs = xs[1:]
|
||||
assert cs[0].kind == CursorKind.CONSTRUCTOR
|
||||
assert cs[1].kind == CursorKind.CONSTRUCTOR
|
||||
assert cs[2].kind == CursorKind.CONSTRUCTOR
|
||||
|
||||
assert not cs[0].is_converting_constructor()
|
||||
assert cs[1].is_converting_constructor()
|
||||
assert not cs[2].is_converting_constructor()
|
||||
|
||||
|
||||
def test_is_copy_constructor():
|
||||
"""Ensure Cursor.is_copy_constructor works."""
|
||||
source = 'class X { X(); X(const X&); X(X&&); };'
|
||||
tu = get_tu(source, lang='cpp')
|
||||
|
||||
xs = get_cursors(tu, 'X')
|
||||
assert xs[0].kind == CursorKind.CLASS_DECL
|
||||
cs = xs[1:]
|
||||
assert cs[0].kind == CursorKind.CONSTRUCTOR
|
||||
assert cs[1].kind == CursorKind.CONSTRUCTOR
|
||||
assert cs[2].kind == CursorKind.CONSTRUCTOR
|
||||
|
||||
assert not cs[0].is_copy_constructor()
|
||||
assert cs[1].is_copy_constructor()
|
||||
assert not cs[2].is_copy_constructor()
|
||||
|
||||
def test_is_default_constructor():
|
||||
"""Ensure Cursor.is_default_constructor works."""
|
||||
source = 'class X { X(); X(int); };'
|
||||
tu = get_tu(source, lang='cpp')
|
||||
|
||||
xs = get_cursors(tu, 'X')
|
||||
assert xs[0].kind == CursorKind.CLASS_DECL
|
||||
cs = xs[1:]
|
||||
assert cs[0].kind == CursorKind.CONSTRUCTOR
|
||||
assert cs[1].kind == CursorKind.CONSTRUCTOR
|
||||
|
||||
assert cs[0].is_default_constructor()
|
||||
assert not cs[1].is_default_constructor()
|
||||
|
||||
def test_is_move_constructor():
|
||||
"""Ensure Cursor.is_move_constructor works."""
|
||||
source = 'class X { X(); X(const X&); X(X&&); };'
|
||||
tu = get_tu(source, lang='cpp')
|
||||
|
||||
xs = get_cursors(tu, 'X')
|
||||
assert xs[0].kind == CursorKind.CLASS_DECL
|
||||
cs = xs[1:]
|
||||
assert cs[0].kind == CursorKind.CONSTRUCTOR
|
||||
assert cs[1].kind == CursorKind.CONSTRUCTOR
|
||||
assert cs[2].kind == CursorKind.CONSTRUCTOR
|
||||
|
||||
assert not cs[0].is_move_constructor()
|
||||
assert not cs[1].is_move_constructor()
|
||||
assert cs[2].is_move_constructor()
|
||||
|
||||
def test_is_default_method():
|
||||
"""Ensure Cursor.is_default_method works."""
|
||||
source = 'class X { X() = default; }; class Y { Y(); };'
|
||||
tu = get_tu(source, lang='cpp')
|
||||
|
||||
xs = get_cursors(tu, 'X')
|
||||
ys = get_cursors(tu, 'Y')
|
||||
|
||||
assert len(xs) == 2
|
||||
assert len(ys) == 2
|
||||
|
||||
xc = xs[1]
|
||||
yc = ys[1]
|
||||
|
||||
assert xc.is_default_method()
|
||||
assert not yc.is_default_method()
|
||||
|
||||
def test_is_mutable_field():
|
||||
"""Ensure Cursor.is_mutable_field works."""
|
||||
source = 'class X { int x_; mutable int y_; };'
|
||||
|
|
|
@ -4073,11 +4073,36 @@ CXFile clang_Module_getTopLevelHeader(CXTranslationUnit,
|
|||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ constructor is a converting constructor.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXConstructor_isConvertingConstructor(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ constructor is a copy constructor.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXConstructor_isCopyConstructor(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ constructor is the default constructor.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXConstructor_isDefaultConstructor(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ constructor is a move constructor.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXConstructor_isMoveConstructor(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ field is declared 'mutable'.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXField_isMutable(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ method is declared '= default'.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXMethod_isDefaulted(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ member function or member function template is
|
||||
* pure virtual.
|
||||
|
|
|
@ -10,4 +10,4 @@ struct Foo {
|
|||
// CHECK: FunctionDecl=foo:1:6 (unavailable) [type=void ()] [typekind=FunctionProto] [resulttype=void] [resulttypekind=Void] [isPOD=0]
|
||||
// CHECK: StructDecl=Foo:3:8 (Definition) [type=Foo] [typekind=Record] [isPOD=1]
|
||||
// CHECK: CXXMethod=foo:4:7 (unavailable) [type=int (){{.*}}] [typekind=FunctionProto] [resulttype=int] [resulttypekind=Int] [isPOD=0]
|
||||
// CHECK: CXXConstructor=Foo:5:3 (unavailable) [type=void (){{.*}}] [typekind=FunctionProto] [resulttype=void] [resulttypekind=Void] [isPOD=0]
|
||||
// CHECK: CXXConstructor=Foo:5:3 (unavailable) (default constructor) [type=void (){{.*}}] [typekind=FunctionProto] [resulttype=void] [resulttypekind=Void] [isPOD=0]
|
||||
|
|
|
@ -59,7 +59,7 @@ void f() {
|
|||
// RUN: -file-refs-at=%s:2:9 \
|
||||
// CHECK-NEXT: ClassDecl=C:2:9 (Definition)
|
||||
// CHECK-NEXT: ClassDecl=C:2:9 (Definition) =[2:9 - 2:10]
|
||||
// CHECK-NEXT: CXXConstructor=C:4:5 (Definition) =[4:5 - 4:6]
|
||||
// CHECK-NEXT: CXXConstructor=C:4:5 (Definition) (default constructor) =[4:5 - 4:6]
|
||||
// CHECK-NEXT: TypeRef=class NS::C:2:9 =[9:10 - 9:11]
|
||||
// CHECK-NEXT: TypeRef=class NS::C:2:9 =[10:3 - 10:4]
|
||||
// CHECK-NEXT: TypeRef=class NS::C:2:9 =[15:7 - 15:8]
|
||||
|
@ -69,7 +69,7 @@ void f() {
|
|||
// RUN: -file-refs-at=%s:16:18 \
|
||||
// CHECK-NEXT: CallExpr=C:4:5
|
||||
// CHECK-NEXT: ClassDecl=C:2:9 (Definition) =[2:9 - 2:10]
|
||||
// CHECK-NEXT: CXXConstructor=C:4:5 (Definition) =[4:5 - 4:6]
|
||||
// CHECK-NEXT: CXXConstructor=C:4:5 (Definition) (default constructor) =[4:5 - 4:6]
|
||||
// CHECK-NEXT: TypeRef=class NS::C:2:9 =[9:10 - 9:11]
|
||||
// CHECK-NEXT: TypeRef=class NS::C:2:9 =[10:3 - 10:4]
|
||||
// CHECK-NEXT: TypeRef=class NS::C:2:9 =[15:7 - 15:8]
|
||||
|
@ -91,7 +91,7 @@ void f() {
|
|||
// CHECK-NEXT: CallExpr=S:35:3
|
||||
// CHECK-NEXT: StructDecl=S:34:8 (Definition) =[34:8 - 34:9]
|
||||
// CHECK-NEXT: CXXConstructor=S:35:3 =[35:3 - 35:4]
|
||||
// CHECK-NEXT: CXXConstructor=S:36:3 =[36:3 - 36:4]
|
||||
// CHECK-NEXT: CXXConstructor=S:36:3 (default constructor) =[36:3 - 36:4]
|
||||
// CHECK-NEXT: TypeRef=struct Test2::S:34:8 =[39:9 - 39:10]
|
||||
// CHECK-NEXT: TypeRef=struct Test2::S:34:8 =[43:14 - 43:15]
|
||||
|
||||
|
|
|
@ -208,7 +208,7 @@ void test(TestColl coll) {
|
|||
// CHECK-TEMPLSPEC: 66:23 ClassDecl=TC:66:23 (Definition) [Specialization of TC:59:7] Extent=[66:1 - 66:31] Spelling=TC ([66:23 - 66:25])
|
||||
|
||||
// RUN: c-index-test -cursor-at=%s:69:3 -cursor-at=%s:70:11 -cursor-at=%s:73:6 -cursor-at=%s:74:6 -cursor-at=%s:77:8 -cursor-at=%s:78:8 -cursor-at=%s:79:8 -cursor-at=%s:80:8 -cursor-at=%s:81:8 -cursor-at=%s:82:8 -cursor-at=%s:85:6 -cursor-at=%s:86:6 -cursor-at=%s:87:6 -cursor-at=%s:88:6 -cursor-at=%s:91:5 -cursor-at=%s:92:5 -cursor-at=%s:93:5 -cursor-at=%s:94:5 -cursor-at=%s:95:5 -cursor-at=%s:96:5 -cursor-at=%s:97:5 -cursor-at=%s:98:5 -cursor-at=%s:100:5 -cursor-at=%s:101:5 -cursor-at=%s:104:6 -cursor-at=%s:105:6 -cursor-at=%s:106:6 -cursor-at=%s:107:6 -cursor-at=%s:108:6 -cursor-at=%s:109:6 -cursor-at=%s:110:6 -cursor-at=%s:111:6 -cursor-at=%s:113:6 -cursor-at=%s:114:6 -cursor-at=%s:117:8 -cursor-at=%s:118:8 -cursor-at=%s:120:8 -cursor-at=%s:121:8 -cursor-at=%s:122:8 -cursor-at=%s:123:8 -cursor-at=%s:124:8 -cursor-at=%s:125:8 -cursor-at=%s:128:6 -cursor-at=%s:129:6 -cursor-at=%s:130:6 -cursor-at=%s:132:3 -std=c++11 %s | FileCheck -check-prefix=CHECK-SPELLING %s
|
||||
// CHECK-SPELLING: 69:3 CXXConstructor=A:69:3 Extent=[69:3 - 69:6] Spelling=A ([69:3 - 69:4])
|
||||
// CHECK-SPELLING: 69:3 CXXConstructor=A:69:3 (default constructor) Extent=[69:3 - 69:6] Spelling=A ([69:3 - 69:4])
|
||||
// CHECK-SPELLING: 70:11 CXXDestructor=~A:70:11 (virtual) Extent=[70:3 - 70:15] Spelling=~A ([70:11 - 70:13])
|
||||
// CHECK-SPELLING: 73:6 CXXMethod=operator=:73:6 Extent=[73:3 - 73:25] Spelling=operator= ([73:6 - 73:15])
|
||||
// CHECK-SPELLING: 74:6 CXXMethod=operator=:74:6 Extent=[74:3 - 74:29] Spelling=operator= ([74:6 - 74:15])
|
||||
|
|
|
@ -27,7 +27,18 @@ template class A<int>;
|
|||
class B {
|
||||
mutable int x_;
|
||||
int y_;
|
||||
|
||||
B() = default;
|
||||
B(int);
|
||||
explicit B(double);
|
||||
B(const B&);
|
||||
B(B&&);
|
||||
};
|
||||
|
||||
class C {
|
||||
explicit C(const C&);
|
||||
};
|
||||
|
||||
// RUN: c-index-test -index-file %s > %t
|
||||
// RUN: FileCheck %s -input-file=%t
|
||||
|
||||
|
@ -37,3 +48,9 @@ class B {
|
|||
// CHECK: [indexDeclaration]: kind: c++-instance-method | name: meth | {{.*}} | loc: 23:26
|
||||
// CHECK: [indexDeclaration]: kind: field | name: x_ | USR: c:@S@B@FI@x_ | lang: C++ | cursor: FieldDecl=x_:28:15 (Definition) (mutable) | loc: 28:15 | semantic-container: [B:27:7] | lexical-container: [B:27:7] | isRedecl: 0 | isDef: 1 | isContainer: 0 | isImplicit: 0
|
||||
// CHECK: [indexDeclaration]: kind: field | name: y_ | USR: c:@S@B@FI@y_ | lang: C++ | cursor: FieldDecl=y_:29:7 (Definition) | loc: 29:7 | semantic-container: [B:27:7] | lexical-container: [B:27:7] | isRedecl: 0 | isDef: 1 | isContainer: 0 | isImplicit: 0
|
||||
// CHECK: [indexDeclaration]: kind: constructor | name: B | {{.*}} (default constructor) (defaulted) | loc: 31:3
|
||||
// CHECK: [indexDeclaration]: kind: constructor | name: B | {{.*}} (converting constructor) | loc: 32:3
|
||||
// CHECK: [indexDeclaration]: kind: constructor | name: B | {{.*}} | loc: 33:12
|
||||
// CHECK: [indexDeclaration]: kind: constructor | name: B | {{.*}} (copy constructor) (converting constructor) | loc: 34:3
|
||||
// CHECK: [indexDeclaration]: kind: constructor | name: B | {{.*}} (move constructor) (converting constructor) | loc: 35:3
|
||||
// CHECK: [indexDeclaration]: kind: constructor | name: C | {{.*}} (copy constructor) | loc: 39:12
|
||||
|
|
|
@ -25,10 +25,10 @@ X::X(int value) {
|
|||
|
||||
// RUN: c-index-test -test-load-source all %s | FileCheck %s
|
||||
// CHECK: load-classes.cpp:3:8: StructDecl=X:3:8 (Definition) Extent=[3:1 - 21:2]
|
||||
// CHECK: load-classes.cpp:4:3: CXXConstructor=X:4:3 Extent=[4:3 - 4:15] [access=public]
|
||||
// CHECK: load-classes.cpp:4:3: CXXConstructor=X:4:3 (converting constructor) Extent=[4:3 - 4:15] [access=public]
|
||||
// FIXME: missing TypeRef in the constructor name
|
||||
// CHECK: load-classes.cpp:4:9: ParmDecl=value:4:9 (Definition) Extent=[4:5 - 4:14]
|
||||
// CHECK: load-classes.cpp:5:3: CXXConstructor=X:5:3 Extent=[5:3 - 5:16] [access=public]
|
||||
// CHECK: load-classes.cpp:5:3: CXXConstructor=X:5:3 (copy constructor) (converting constructor) Extent=[5:3 - 5:16] [access=public]
|
||||
// FIXME: missing TypeRef in the constructor name
|
||||
// CHECK: load-classes.cpp:5:14: ParmDecl=x:5:14 (Definition) Extent=[5:5 - 5:15]
|
||||
// CHECK: load-classes.cpp:5:11: TypeRef=struct X:3:8 Extent=[5:11 - 5:12]
|
||||
|
@ -46,7 +46,7 @@ X::X(int value) {
|
|||
// CHECK: load-classes.cpp:16:21: TemplateTypeParameter=T:16:21 (Definition) Extent=[16:12 - 16:22] [access=public]
|
||||
// CHECK: load-classes.cpp:19:16: CXXMethod=virtualMemberFunction:19:16 (virtual) Extent=[19:3 - 19:39] [access=private]
|
||||
// CHECK: load-classes.cpp:20:16: CXXMethod=pureVirtualMemberFunction:20:16 (virtual) (pure) Extent=[20:3 - 20:47] [access=private]
|
||||
// CHECK: load-classes.cpp:23:4: CXXConstructor=X:23:4 (Definition) Extent=[23:1 - 24:2] [access=public]
|
||||
// CHECK: load-classes.cpp:23:4: CXXConstructor=X:23:4 (Definition) (converting constructor) Extent=[23:1 - 24:2] [access=public]
|
||||
// CHECK: load-classes.cpp:23:1: TypeRef=struct X:3:8 Extent=[23:1 - 23:2]
|
||||
// CHECK: load-classes.cpp:23:10: ParmDecl=value:23:10 (Definition) Extent=[23:6 - 23:15]
|
||||
// CHECK: load-classes.cpp:23:17: CompoundStmt= Extent=[23:17 - 24:2]
|
||||
|
|
|
@ -68,7 +68,7 @@ decltype(auto) autoInt = 5;
|
|||
// CHECK: TemplateTemplateParameter=W:8:60 (Definition) [type=] [typekind=Invalid] [isPOD=0]
|
||||
// CHECK: Namespace=inner:14:11 (Definition) [type=] [typekind=Invalid] [isPOD=0]
|
||||
// CHECK: StructDecl=Bar:16:8 (Definition) [type=outer::inner::Bar] [typekind=Record] [isPOD=0] [nbFields=3]
|
||||
// CHECK: CXXConstructor=Bar:17:3 (Definition) [type=void (outer::Foo<bool> *){{.*}}] [typekind=FunctionProto] [canonicaltype=void (outer::Foo<bool> *){{.*}}] [canonicaltypekind=FunctionProto] [resulttype=void] [resulttypekind=Void] [args= [outer::Foo<bool> *] [Pointer]] [isPOD=0]
|
||||
// CHECK: CXXConstructor=Bar:17:3 (Definition) (converting constructor) [type=void (outer::Foo<bool> *){{.*}}] [typekind=FunctionProto] [canonicaltype=void (outer::Foo<bool> *){{.*}}] [canonicaltypekind=FunctionProto] [resulttype=void] [resulttypekind=Void] [args= [outer::Foo<bool> *] [Pointer]] [isPOD=0]
|
||||
// CHECK: ParmDecl=foo:17:25 (Definition) [type=outer::Foo<bool> *] [typekind=Pointer] [canonicaltype=outer::Foo<bool> *] [canonicaltypekind=Pointer] [isPOD=1] [pointeetype=outer::Foo<bool>] [pointeekind=Unexposed]
|
||||
// CHECK: NamespaceRef=outer:1:11 [type=] [typekind=Invalid] [isPOD=0]
|
||||
// CHECK: TemplateRef=Foo:4:8 [type=] [typekind=Invalid] [isPOD=0]
|
||||
|
|
|
@ -1653,7 +1653,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo * Name) {
|
|||
// CHECK: 45:58: DeclRefExpr=a:45:28 Extent=[45:58 - 45:59]
|
||||
// CHECK: 45:62: DeclRefExpr=b:45:38 Extent=[45:62 - 45:63]
|
||||
// CHECK: 46:1: CXXAccessSpecifier=:46:1 (Definition) Extent=[46:1 - 46:8]
|
||||
// CHECK: 47:3: CXXConstructor=StringRef:47:3 (Definition) Extent=[47:3 - 47:37]
|
||||
// CHECK: 47:3: CXXConstructor=StringRef:47:3 (Definition) (default constructor) Extent=[47:3 - 47:37]
|
||||
// CHECK: 47:16: MemberRef=Data:43:15 Extent=[47:16 - 47:20]
|
||||
// CHECK: 47:21: UnexposedExpr= Extent=[47:21 - 47:22]
|
||||
// CHECK: 47:21: IntegerLiteral= Extent=[47:21 - 47:22]
|
||||
|
@ -1661,7 +1661,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo * Name) {
|
|||
// CHECK: 47:32: UnexposedExpr= Extent=[47:32 - 47:33]
|
||||
// CHECK: 47:32: IntegerLiteral= Extent=[47:32 - 47:33]
|
||||
// CHECK: 47:35: CompoundStmt= Extent=[47:35 - 47:37]
|
||||
// CHECK: 48:3: CXXConstructor=StringRef:48:3 (Definition) Extent=[48:3 - 48:71]
|
||||
// CHECK: 48:3: CXXConstructor=StringRef:48:3 (Definition) (converting constructor) Extent=[48:3 - 48:71]
|
||||
// CHECK: 48:25: ParmDecl=Str:48:25 (Definition) Extent=[48:13 - 48:28]
|
||||
// CHECK: 48:32: MemberRef=Data:43:15 Extent=[48:32 - 48:36]
|
||||
// CHECK: 48:37: DeclRefExpr=Str:48:25 Extent=[48:37 - 48:40]
|
||||
|
@ -1768,7 +1768,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo * Name) {
|
|||
// CHECK: 65:11: Namespace=clang:65:11 (Definition) Extent=[65:1 - 81:2]
|
||||
// CHECK: 66:7: ClassDecl=IdentifierInfo:66:7 (Definition) Extent=[66:1 - 80:2]
|
||||
// CHECK: 67:1: CXXAccessSpecifier=:67:1 (Definition) Extent=[67:1 - 67:8]
|
||||
// CHECK: 67:8: CXXConstructor=IdentifierInfo:67:8 Extent=[67:8 - 67:24]
|
||||
// CHECK: 67:8: CXXConstructor=IdentifierInfo:67:8 (default constructor) Extent=[67:8 - 67:24]
|
||||
// CHECK: 68:15: CXXMethod=getNameStart:68:15 (Definition) (const) Extent=[68:3 - 71:4] [access=public]
|
||||
// CHECK: 68:36: CompoundStmt= Extent=[68:36 - 71:4]
|
||||
// CHECK: 69:5: DeclStmt= Extent=[69:5 - 69:65]
|
||||
|
|
|
@ -30,7 +30,7 @@ void J() {
|
|||
// CHECK: skip-function-bodies.mm:3:7: ClassDecl=A:3:7 (Definition) Extent=[3:1 - 14:2]
|
||||
// CHECK: skip-function-bodies.mm:4:9: ClassDecl=B:4:9 (Definition) Extent=[4:3 - 4:13]
|
||||
// CHECK: skip-function-bodies.mm:6:1: CXXAccessSpecifier=:6:1 (Definition) Extent=[6:1 - 6:8]
|
||||
// CHECK: skip-function-bodies.mm:7:3: CXXConstructor=A:7:3 Extent=[7:3 - 7:6]
|
||||
// CHECK: skip-function-bodies.mm:7:3: CXXConstructor=A:7:3 (default constructor) Extent=[7:3 - 7:6]
|
||||
// CHECK-NOT: skip-function-bodies.mm:8:12: StructDecl=C:8:12 (Definition) Extent=[8:5 - 10:6]
|
||||
// CHECK-NOT: skip-function-bodies.mm:9:12: CXXMethod=d:9:12 (Definition) Extent=[9:7 - 9:18]
|
||||
// CHECK: skip-function-bodies.mm:13:13: TypedefDecl=E:13:13 (Definition) Extent=[13:3 - 13:14]
|
||||
|
|
|
@ -772,9 +772,20 @@ static void PrintCursor(CXCursor Cursor, const char *CommentSchemaFile) {
|
|||
|
||||
clang_disposeString(DeprecatedMessage);
|
||||
clang_disposeString(UnavailableMessage);
|
||||
|
||||
|
||||
if (clang_CXXConstructor_isDefaultConstructor(Cursor))
|
||||
printf(" (default constructor)");
|
||||
|
||||
if (clang_CXXConstructor_isMoveConstructor(Cursor))
|
||||
printf(" (move constructor)");
|
||||
if (clang_CXXConstructor_isCopyConstructor(Cursor))
|
||||
printf(" (copy constructor)");
|
||||
if (clang_CXXConstructor_isConvertingConstructor(Cursor))
|
||||
printf(" (converting constructor)");
|
||||
if (clang_CXXField_isMutable(Cursor))
|
||||
printf(" (mutable)");
|
||||
if (clang_CXXMethod_isDefaulted(Cursor))
|
||||
printf(" (defaulted)");
|
||||
if (clang_CXXMethod_isStatic(Cursor))
|
||||
printf(" (static)");
|
||||
if (clang_CXXMethod_isVirtual(Cursor))
|
||||
|
|
|
@ -7360,6 +7360,48 @@ CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU,
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
extern "C" {
|
||||
|
||||
unsigned clang_CXXConstructor_isDefaultConstructor(CXCursor C) {
|
||||
if (!clang_isDeclaration(C.kind))
|
||||
return 0;
|
||||
|
||||
const Decl *D = cxcursor::getCursorDecl(C);
|
||||
const CXXConstructorDecl *Constructor =
|
||||
D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
|
||||
return (Constructor && Constructor->isDefaultConstructor()) ? 1 : 0;
|
||||
}
|
||||
|
||||
unsigned clang_CXXConstructor_isCopyConstructor(CXCursor C) {
|
||||
if (!clang_isDeclaration(C.kind))
|
||||
return 0;
|
||||
|
||||
const Decl *D = cxcursor::getCursorDecl(C);
|
||||
const CXXConstructorDecl *Constructor =
|
||||
D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
|
||||
return (Constructor && Constructor->isCopyConstructor()) ? 1 : 0;
|
||||
}
|
||||
|
||||
unsigned clang_CXXConstructor_isMoveConstructor(CXCursor C) {
|
||||
if (!clang_isDeclaration(C.kind))
|
||||
return 0;
|
||||
|
||||
const Decl *D = cxcursor::getCursorDecl(C);
|
||||
const CXXConstructorDecl *Constructor =
|
||||
D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
|
||||
return (Constructor && Constructor->isMoveConstructor()) ? 1 : 0;
|
||||
}
|
||||
|
||||
unsigned clang_CXXConstructor_isConvertingConstructor(CXCursor C) {
|
||||
if (!clang_isDeclaration(C.kind))
|
||||
return 0;
|
||||
|
||||
const Decl *D = cxcursor::getCursorDecl(C);
|
||||
const CXXConstructorDecl *Constructor =
|
||||
D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
|
||||
// Passing 'false' excludes constructors marked 'explicit'.
|
||||
return (Constructor && Constructor->isConvertingConstructor(false)) ? 1 : 0;
|
||||
}
|
||||
|
||||
unsigned clang_CXXField_isMutable(CXCursor C) {
|
||||
if (!clang_isDeclaration(C.kind))
|
||||
return 0;
|
||||
|
@ -7390,6 +7432,16 @@ unsigned clang_CXXMethod_isConst(CXCursor C) {
|
|||
return (Method && (Method->getTypeQualifiers() & Qualifiers::Const)) ? 1 : 0;
|
||||
}
|
||||
|
||||
unsigned clang_CXXMethod_isDefaulted(CXCursor C) {
|
||||
if (!clang_isDeclaration(C.kind))
|
||||
return 0;
|
||||
|
||||
const Decl *D = cxcursor::getCursorDecl(C);
|
||||
const CXXMethodDecl *Method =
|
||||
D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
|
||||
return (Method && Method->isDefaulted()) ? 1 : 0;
|
||||
}
|
||||
|
||||
unsigned clang_CXXMethod_isStatic(CXCursor C) {
|
||||
if (!clang_isDeclaration(C.kind))
|
||||
return 0;
|
||||
|
|
|
@ -2,7 +2,12 @@ clang_CXCursorSet_contains
|
|||
clang_CXCursorSet_insert
|
||||
clang_CXIndex_getGlobalOptions
|
||||
clang_CXIndex_setGlobalOptions
|
||||
clang_CXXConstructor_isConvertingConstructor
|
||||
clang_CXXConstructor_isCopyConstructor
|
||||
clang_CXXConstructor_isDefaultConstructor
|
||||
clang_CXXConstructor_isMoveConstructor
|
||||
clang_CXXField_isMutable
|
||||
clang_CXXMethod_isDefaulted
|
||||
clang_CXXMethod_isConst
|
||||
clang_CXXMethod_isPureVirtual
|
||||
clang_CXXMethod_isStatic
|
||||
|
|
Loading…
Reference in New Issue