diff options
author | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-11-27 12:02:39 +0000 |
---|---|---|
committer | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-11-27 12:02:39 +0000 |
commit | 58828cc308e0a6030d0418573376624d01baa7d3 (patch) | |
tree | 5cebb4a6456d75f99576b4c4cce87121c0de16e7 | |
parent | 114aaa3c46f021df3c13f83d773589adc3993afd (diff) |
[libclang] Fix clang_Cursor_getNumArguments and clang_Cursor_getArgument for CXXConstructExpr
Constructors have the same methods for arguments as call expressions.
Let's provide a way to get their arguments the same way.
Differential Revision: https://reviews.llvm.org/D54934
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@347654 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/Index/print-type.cpp | 3 | ||||
-rw-r--r-- | tools/libclang/CXCursor.cpp | 10 |
2 files changed, 13 insertions, 0 deletions
diff --git a/test/Index/print-type.cpp b/test/Index/print-type.cpp index 3c76c97cca..654b456239 100644 --- a/test/Index/print-type.cpp +++ b/test/Index/print-type.cpp @@ -77,6 +77,8 @@ using baz = C<A<void>>; auto autoTemplPointer = &autoTemplRefParam; +outer::Foo<bool> parameter; +outer::inner::Bar construct(¶meter); // RUN: c-index-test -test-print-type %s -std=c++14 | FileCheck %s // CHECK: Namespace=outer:1:11 (Definition) [type=] [typekind=Invalid] [isPOD=0] // CHECK: ClassTemplate=Foo:4:8 (Definition) [type=] [typekind=Invalid] [isPOD=0] @@ -185,3 +187,4 @@ auto autoTemplPointer = &autoTemplRefParam; // CHECK: DeclRefExpr=templRefParam:71:40 [type=Specialization<Specialization<bool> &>] [typekind=Unexposed] [templateargs/1= [type=Specialization<bool> &] [typekind=LValueReference]] [canonicaltype=Specialization<Specialization<bool> &>] [canonicaltypekind=Record] [canonicaltemplateargs/1= [type=Specialization<bool> &] [typekind=LValueReference]] [isPOD=1] // CHECK: TypeAliasDecl=baz:76:7 (Definition) [type=baz] [typekind=Typedef] [templateargs/1= [type=A<void>] [typekind=Unexposed]] [canonicaltype=A<void>] [canonicaltypekind=Record] [canonicaltemplateargs/1= [type=void] [typekind=Void]] [isPOD=0] // CHECK: VarDecl=autoTemplPointer:78:6 (Definition) [type=Specialization<Specialization<bool> &> *] [typekind=Auto] [canonicaltype=Specialization<Specialization<bool> &> *] [canonicaltypekind=Pointer] [isPOD=1] [pointeetype=Specialization<Specialization<bool> &>] [pointeekind=Record] +// CHECK: CallExpr=Bar:17:3 [type=outer::inner::Bar] [typekind=Elaborated] [canonicaltype=outer::inner::Bar] [canonicaltypekind=Record] [args= [outer::Foo<bool> *] [Pointer]] [isPOD=0] [nbFields=3] diff --git a/tools/libclang/CXCursor.cpp b/tools/libclang/CXCursor.cpp index 7e14b5f893..b8c2529169 100644 --- a/tools/libclang/CXCursor.cpp +++ b/tools/libclang/CXCursor.cpp @@ -1164,6 +1164,9 @@ int clang_Cursor_getNumArguments(CXCursor C) { if (const CallExpr *CE = dyn_cast<CallExpr>(E)) { return CE->getNumArgs(); } + if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E)) { + return CE->getNumArgs(); + } } return -1; @@ -1192,6 +1195,13 @@ CXCursor clang_Cursor_getArgument(CXCursor C, unsigned i) { cxcursor::getCursorTU(C)); } } + if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E)) { + if (i < CE->getNumArgs()) { + return cxcursor::MakeCXCursor(CE->getArg(i), + getCursorDecl(C), + cxcursor::getCursorTU(C)); + } + } } return clang_getNullCursor(); |