Skip to content

Commit

Permalink
Index: expose is_mutable_field
Browse files Browse the repository at this point in the history
Expose isMutable via libClang and python bindings.

Patch by Jonathan B Coe!

llvm-svn: 251410
  • Loading branch information
compnerd committed Oct 27, 2015
1 parent c7cb880 commit 6ea75db
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 0 deletions.
10 changes: 10 additions & 0 deletions clang/bindings/python/clang/cindex.py
Original file line number Diff line number Diff line change
Expand Up @@ -1170,6 +1170,12 @@ def is_const_method(self):
"""
return conf.lib.clang_CXXMethod_isConst(self)

def is_mutable_field(self):
"""Returns True if the cursor refers to a C++ field that is declared
'mutable'.
"""
return conf.lib.clang_CXXField_isMutable(self)

def is_pure_virtual_method(self):
"""Returns True if the cursor refers to a C++ member function or member
function template that is declared pure virtual.
Expand Down Expand Up @@ -2897,6 +2903,10 @@ def cursor(self):
[Index, c_char_p],
c_object_p),

("clang_CXXField_isMutable",
[Cursor],
bool),

("clang_CXXMethod_isConst",
[Cursor],
bool),
Expand Down
15 changes: 15 additions & 0 deletions clang/bindings/python/tests/cindex/test_cursor.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,21 @@ def test_is_const_method():
assert foo.is_const_method()
assert not bar.is_const_method()

def test_is_mutable_field():
"""Ensure Cursor.is_mutable_field works."""
source = 'class X { int x_; mutable int y_; };'
tu = get_tu(source, lang='cpp')

cls = get_cursor(tu, 'X')
x_ = get_cursor(tu, 'x_')
y_ = get_cursor(tu, 'y_')
assert cls is not None
assert x_ is not None
assert y_ is not None

assert not x_.is_mutable_field()
assert y_.is_mutable_field()

def test_is_static_method():
"""Ensure Cursor.is_static_method works."""

Expand Down
5 changes: 5 additions & 0 deletions clang/include/clang-c/Index.h
Original file line number Diff line number Diff line change
Expand Up @@ -3956,6 +3956,11 @@ CXFile clang_Module_getTopLevelHeader(CXTranslationUnit,
* @{
*/

/**
* \brief Determine if a C++ field is declared 'mutable'.
*/
CINDEX_LINKAGE unsigned clang_CXXField_isMutable(CXCursor C);

/**
* \brief Determine if a C++ member function or member function template is
* pure virtual.
Expand Down
6 changes: 6 additions & 0 deletions clang/test/Index/index-file.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,16 @@ template <> void A<int>::meth();
template class A<int>;
}

class B {
mutable int x_;
int y_;
};
// RUN: c-index-test -index-file %s > %t
// RUN: FileCheck %s -input-file=%t

// CHECK: [indexDeclaration]: kind: type-alias | name: MyTypeAlias | {{.*}} | loc: 1:7
// CHECK: [indexDeclaration]: kind: struct-template-spec | name: TS | {{.*}} | loc: 11:8
// CHECK: [indexDeclaration]: kind: function-template-spec | name: tfoo | {{.*}} | loc: 15:6
// 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
2 changes: 2 additions & 0 deletions clang/tools/c-index-test/c-index-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -767,6 +767,8 @@ static void PrintCursor(CXCursor Cursor, const char *CommentSchemaFile) {
clang_disposeString(DeprecatedMessage);
clang_disposeString(UnavailableMessage);

if (clang_CXXField_isMutable(Cursor))
printf(" (mutable)");
if (clang_CXXMethod_isStatic(Cursor))
printf(" (static)");
if (clang_CXXMethod_isVirtual(Cursor))
Expand Down
10 changes: 10 additions & 0 deletions clang/tools/libclang/CIndex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6888,6 +6888,16 @@ CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU,
//===----------------------------------------------------------------------===//

extern "C" {
unsigned clang_CXXField_isMutable(CXCursor C) {
if (!clang_isDeclaration(C.kind))
return 0;

if (const auto D = cxcursor::getCursorDecl(C))
if (const auto FD = dyn_cast_or_null<FieldDecl>(D))
return FD->isMutable() ? 1 : 0;
return 0;
}

unsigned clang_CXXMethod_isPureVirtual(CXCursor C) {
if (!clang_isDeclaration(C.kind))
return 0;
Expand Down
1 change: 1 addition & 0 deletions clang/tools/libclang/libclang.exports
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ clang_CXCursorSet_contains
clang_CXCursorSet_insert
clang_CXIndex_getGlobalOptions
clang_CXIndex_setGlobalOptions
clang_CXXField_isMutable
clang_CXXMethod_isConst
clang_CXXMethod_isPureVirtual
clang_CXXMethod_isStatic
Expand Down

0 comments on commit 6ea75db

Please sign in to comment.