r175299 - libclang: add clang_getTypeSpelling(CXType CT)
Douglas Gregor
dgregor at apple.com
Wed Mar 13 17:37:52 PDT 2013
On Feb 15, 2013, at 1:15 PM, Dmitri Gribenko <gribozavr at gmail.com> wrote:
> Author: gribozavr
> Date: Fri Feb 15 15:15:49 2013
> New Revision: 175299
>
> URL: http://llvm.org/viewvc/llvm-project?rev=175299&view=rev
> Log:
> libclang: add clang_getTypeSpelling(CXType CT)
>
> Adds a function clang_getTypeSpelling(CXType CT) that returns
> a CXString containing the underlying type.
It would be nice if this API allowed us to supply a declarator string, because clients are likely to want to format types for (e.g.,) a named declaration.
- Doug
> Patch by Ben Gertzfield.
>
> Added:
> cfe/trunk/test/Index/print-type.c
> - copied, changed from r175292, cfe/trunk/test/Index/print-typekind.c
> cfe/trunk/test/Index/print-type.cpp
> cfe/trunk/test/Index/print-type.m
> - copied, changed from r175292, cfe/trunk/test/Index/print-typekind.m
> Removed:
> cfe/trunk/test/Index/print-typekind.c
> cfe/trunk/test/Index/print-typekind.m
> cfe/trunk/test/Index/vector-types.c
> Modified:
> cfe/trunk/include/clang-c/Index.h
> cfe/trunk/tools/c-index-test/c-index-test.c
> cfe/trunk/tools/libclang/CXType.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=175299&r1=175298&r2=175299&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang-c/Index.h (original)
> +++ cfe/trunk/include/clang-c/Index.h Fri Feb 15 15:15:49 2013
> @@ -32,7 +32,7 @@
> * compatible, thus CINDEX_VERSION_MAJOR is expected to remain stable.
> */
> #define CINDEX_VERSION_MAJOR 0
> -#define CINDEX_VERSION_MINOR 11
> +#define CINDEX_VERSION_MINOR 12
>
> #define CINDEX_VERSION_ENCODE(major, minor) ( \
> ((major) * 10000) \
> @@ -2695,6 +2695,14 @@ typedef struct {
> CINDEX_LINKAGE CXType clang_getCursorType(CXCursor C);
>
> /**
> + * \brief Pretty-print the underlying type using the rules of the
> + * language of the translation unit from which it came.
> + *
> + * If the type is invalid, an empty string is returned.
> + */
> +CINDEX_LINKAGE CXString clang_getTypeSpelling(CXType CT);
> +
> +/**
> * \brief Retrieve the underlying type of a typedef declaration.
> *
> * If the cursor does not reference a typedef declaration, an invalid type is
>
> Copied: cfe/trunk/test/Index/print-type.c (from r175292, cfe/trunk/test/Index/print-typekind.c)
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/print-type.c?p2=cfe/trunk/test/Index/print-type.c&p1=cfe/trunk/test/Index/print-typekind.c&r1=175292&r2=175299&rev=175299&view=diff
> ==============================================================================
> --- cfe/trunk/test/Index/print-typekind.c (original)
> +++ cfe/trunk/test/Index/print-type.c Fri Feb 15 15:15:49 2013
> @@ -1,28 +1,44 @@
> typedef int FooType;
> int *p;
> -int *f(int *p, char *x, FooType z) {
> +int *f(int *p, char *x, FooType z, int arr[5], void (*fn)(int)) {
> + fn(*p);
> const FooType w = z;
> - return p + z;
> + return p + z + arr[3];
> }
> typedef double OtherType;
> typedef int ArrayType[5];
> +int __attribute__((vector_size(16))) x;
> +typedef int __attribute__((vector_size(16))) int4_t;
>
> -// RUN: c-index-test -test-print-typekind %s | FileCheck %s
> -// CHECK: TypedefDecl=FooType:1:13 (Definition) typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: VarDecl=p:2:6 typekind=Pointer [isPOD=1]
> -// CHECK: FunctionDecl=f:3:6 (Definition) typekind=FunctionProto [canonical=FunctionProto] [result=Pointer] [args= Pointer Pointer Typedef] [isPOD=0]
> -// CHECK: ParmDecl=p:3:13 (Definition) typekind=Pointer [isPOD=1]
> -// CHECK: ParmDecl=x:3:22 (Definition) typekind=Pointer [isPOD=1]
> -// CHECK: ParmDecl=z:3:33 (Definition) typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: TypeRef=FooType:1:13 typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: CompoundStmt= typekind=Invalid [isPOD=0]
> -// CHECK: DeclStmt= typekind=Invalid [isPOD=0]
> -// CHECK: VarDecl=w:4:17 (Definition) typekind=Typedef const [canonical=Int] [isPOD=1]
> -// CHECK: TypeRef=FooType:1:13 typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: DeclRefExpr=z:3:33 typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: ReturnStmt= typekind=Invalid [isPOD=0]
> -// CHECK: BinaryOperator= typekind=Pointer [isPOD=1]
> -// CHECK: DeclRefExpr=p:3:13 typekind=Pointer [isPOD=1]
> -// CHECK: DeclRefExpr=z:3:33 typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: TypedefDecl=OtherType:7:16 (Definition) typekind=Typedef [canonical=Double] [isPOD=1]
> -// CHECK: TypedefDecl=ArrayType:8:13 (Definition) typekind=Typedef [canonical=ConstantArray] [isPOD=1]
> +// RUN: c-index-test -test-print-type %s | FileCheck %s
> +// CHECK: FunctionDecl=f:3:6 (Definition) [type=int *(int *, char *, FooType, int *, void (*)(int))] [typekind=FunctionProto] [canonicaltype=int *(int *, char *, int, int *, void (*)(int))] [canonicaltypekind=FunctionProto] [resulttype=int *] [resulttypekind=Pointer] [args= [int *] [Pointer] [char *] [Pointer] [FooType] [Typedef] [int *] [Pointer] [void (*)(int)] [Pointer]] [isPOD=0]
> +// CHECK: ParmDecl=p:3:13 (Definition) [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: ParmDecl=x:3:22 (Definition) [type=char *] [typekind=Pointer] [isPOD=1]
> +// CHECK: ParmDecl=z:3:33 (Definition) [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: TypeRef=FooType:1:13 [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: ParmDecl=arr:3:40 (Definition) [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: IntegerLiteral= [type=int] [typekind=Int] [isPOD=1]
> +// CHECK: ParmDecl=fn:3:55 (Definition) [type=void (*)(int)] [typekind=Pointer] [canonicaltype=void (*)(int)] [canonicaltypekind=Pointer] [isPOD=1]
> +// CHECK: ParmDecl=:3:62 (Definition) [type=int] [typekind=Int] [isPOD=1]
> +// CHECK: CompoundStmt= [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: CallExpr=fn:3:55 [type=void] [typekind=Void] [isPOD=0]
> +// CHECK: DeclRefExpr=fn:3:55 [type=void (*)(int)] [typekind=Pointer] [canonicaltype=void (*)(int)] [canonicaltypekind=Pointer] [isPOD=1]
> +// CHECK: UnaryOperator= [type=int] [typekind=Int] [isPOD=1]
> +// CHECK: DeclRefExpr=p:3:13 [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: DeclStmt= [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: VarDecl=w:5:17 (Definition) [type=const FooType] [typekind=Typedef] const [canonicaltype=const int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: TypeRef=FooType:1:13 [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: DeclRefExpr=z:3:33 [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: ReturnStmt= [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: BinaryOperator= [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: BinaryOperator= [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: DeclRefExpr=p:3:13 [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: DeclRefExpr=z:3:33 [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: ArraySubscriptExpr= [type=int] [typekind=Int] [isPOD=1]
> +// CHECK: DeclRefExpr=arr:3:40 [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: IntegerLiteral= [type=int] [typekind=Int] [isPOD=1]
> +// CHECK: TypedefDecl=OtherType:8:16 (Definition) [type=OtherType] [typekind=Typedef] [canonicaltype=double] [canonicaltypekind=Double] [isPOD=1]
> +// CHECK: TypedefDecl=ArrayType:9:13 (Definition) [type=ArrayType] [typekind=Typedef] [canonicaltype=int [5]] [canonicaltypekind=ConstantArray] [isPOD=1]
> +// CHECK: IntegerLiteral= [type=int] [typekind=Int] [isPOD=1]
> +// CHECK: VarDecl=x:10:38 [type=__attribute__((__vector_size__(4 * sizeof(int)))) int] [typekind=Vector] [isPOD=1]
> +// CHECK: TypedefDecl=int4_t:11:46 (Definition) [type=int4_t] [typekind=Typedef] [canonicaltype=__attribute__((__vector_size__(4 * sizeof(int)))) int] [canonicaltypekind=Vector] [isPOD=1]
>
> Added: cfe/trunk/test/Index/print-type.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/print-type.cpp?rev=175299&view=auto
> ==============================================================================
> --- cfe/trunk/test/Index/print-type.cpp (added)
> +++ cfe/trunk/test/Index/print-type.cpp Fri Feb 15 15:15:49 2013
> @@ -0,0 +1,56 @@
> +namespace outer {
> +
> +template<typename T>
> +struct Foo {
> + T t;
> +};
> +
> +namespace inner {
> +
> +struct Bar {
> + Bar(outer::Foo<bool>* foo) { };
> +
> + typedef int FooType;
> + int *p;
> + int *f(int *p, char *x, FooType z) {
> + const FooType w = z;
> + return p + z;
> + }
> + typedef double OtherType;
> + typedef int ArrayType[5];
> +};
> +
> +}
> +}
> +
> +// RUN: c-index-test -test-print-type %s | FileCheck %s
> +// CHECK: Namespace=outer:1:11 (Definition) [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: ClassTemplate=Foo:4:8 (Definition) [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: TemplateTypeParameter=T:3:19 (Definition) [type=T] [typekind=Unexposed] [canonicaltype=type-parameter-0-0] [canonicaltypekind=Unexposed] [isPOD=0]
> +// CHECK: FieldDecl=t:5:5 (Definition) [type=T] [typekind=Unexposed] [canonicaltype=type-parameter-0-0] [canonicaltypekind=Unexposed] [isPOD=0]
> +// CHECK: TypeRef=T:3:19 [type=T] [typekind=Unexposed] [canonicaltype=type-parameter-0-0] [canonicaltypekind=Unexposed] [isPOD=0]
> +// CHECK: Namespace=inner:8:11 (Definition) [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: StructDecl=Bar:10:8 (Definition) [type=outer::inner::Bar] [typekind=Record] [isPOD=0]
> +// CHECK: CXXConstructor=Bar:11: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: ParmDecl=foo:11:25 (Definition) [type=outer::Foo<bool> *] [typekind=Pointer] [canonicaltype=outer::Foo<bool> *] [canonicaltypekind=Pointer] [isPOD=1]
> +// CHECK: NamespaceRef=outer:1:11 [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: TemplateRef=Foo:4:8 [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: CompoundStmt= [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: TypedefDecl=FooType:13:15 (Definition) [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: FieldDecl=p:14:8 (Definition) [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: CXXMethod=f:15:8 (Definition) [type=int *(int *, char *, FooType)] [typekind=FunctionProto] [canonicaltype=int *(int *, char *, int)] [canonicaltypekind=FunctionProto] [resulttype=int *] [resulttypekind=Pointer] [args= [int *] [Pointer] [char *] [Pointer] [FooType] [Typedef]] [isPOD=0]
> +// CHECK: ParmDecl=p:15:15 (Definition) [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: ParmDecl=x:15:24 (Definition) [type=char *] [typekind=Pointer] [isPOD=1]
> +// CHECK: ParmDecl=z:15:35 (Definition) [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: TypeRef=FooType:13:15 [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: CompoundStmt= [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: DeclStmt= [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: VarDecl=w:16:19 (Definition) [type=const FooType] [typekind=Typedef] const [canonicaltype=const int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: TypeRef=FooType:13:15 [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: DeclRefExpr=z:15:35 [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: ReturnStmt= [type=] [typekind=Invalid] [isPOD=0]
> +// CHECK: BinaryOperator= [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: DeclRefExpr=p:15:15 [type=int *] [typekind=Pointer] [isPOD=1]
> +// CHECK: DeclRefExpr=z:15:35 [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
> +// CHECK: TypedefDecl=OtherType:19:18 (Definition) [type=OtherType] [typekind=Typedef] [canonicaltype=double] [canonicaltypekind=Double] [isPOD=1]
> +// CHECK: TypedefDecl=ArrayType:20:15 (Definition) [type=ArrayType] [typekind=Typedef] [canonicaltype=int [5]] [canonicaltypekind=ConstantArray] [isPOD=1]
>
> Copied: cfe/trunk/test/Index/print-type.m (from r175292, cfe/trunk/test/Index/print-typekind.m)
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/print-type.m?p2=cfe/trunk/test/Index/print-type.m&p1=cfe/trunk/test/Index/print-typekind.m&r1=175292&r2=175299&rev=175299&view=diff
> ==============================================================================
> --- cfe/trunk/test/Index/print-typekind.m (original)
> +++ cfe/trunk/test/Index/print-type.m Fri Feb 15 15:15:49 2013
> @@ -4,7 +4,7 @@
> -(const id) mymethod2:(id)x blah:(Class)y boo:(SEL)z;
> @end
>
> -// RUN: c-index-test -test-print-typekind %s | FileCheck %s
> -// CHECK: ObjCPropertyDecl=x:2:25 typekind=ObjCId [canonical=ObjCObjectPointer]
> -// CHECK: ObjCInstanceMethodDecl=mymethod:3:8 typekind=Invalid [result=Int]
> -// CHECK: ObjCInstanceMethodDecl=mymethod2:blah:boo::4:13 typekind=Invalid [result=ObjCId] [args= ObjCId ObjCClass ObjCSel]
> +// RUN: c-index-test -test-print-type %s | FileCheck %s
> +// CHECK: ObjCPropertyDecl=x:2:25 [type=id] [typekind=ObjCId] [canonicaltype=id] [canonicaltypekind=ObjCObjectPointer] [isPOD=1]
> +// CHECK: ObjCInstanceMethodDecl=mymethod:3:8 [type=] [typekind=Invalid] [resulttype=int] [resulttypekind=Int] [isPOD=0]
> +// CHECK: ObjCInstanceMethodDecl=mymethod2:blah:boo::4:13 [type=] [typekind=Invalid] [resulttype=const id] [resulttypekind=ObjCId] [args= [id] [ObjCId] [Class] [ObjCClass] [SEL] [ObjCSel]] [isPOD=0]
>
> Removed: cfe/trunk/test/Index/print-typekind.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/print-typekind.c?rev=175298&view=auto
> ==============================================================================
> --- cfe/trunk/test/Index/print-typekind.c (original)
> +++ cfe/trunk/test/Index/print-typekind.c (removed)
> @@ -1,28 +0,0 @@
> -typedef int FooType;
> -int *p;
> -int *f(int *p, char *x, FooType z) {
> - const FooType w = z;
> - return p + z;
> -}
> -typedef double OtherType;
> -typedef int ArrayType[5];
> -
> -// RUN: c-index-test -test-print-typekind %s | FileCheck %s
> -// CHECK: TypedefDecl=FooType:1:13 (Definition) typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: VarDecl=p:2:6 typekind=Pointer [isPOD=1]
> -// CHECK: FunctionDecl=f:3:6 (Definition) typekind=FunctionProto [canonical=FunctionProto] [result=Pointer] [args= Pointer Pointer Typedef] [isPOD=0]
> -// CHECK: ParmDecl=p:3:13 (Definition) typekind=Pointer [isPOD=1]
> -// CHECK: ParmDecl=x:3:22 (Definition) typekind=Pointer [isPOD=1]
> -// CHECK: ParmDecl=z:3:33 (Definition) typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: TypeRef=FooType:1:13 typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: CompoundStmt= typekind=Invalid [isPOD=0]
> -// CHECK: DeclStmt= typekind=Invalid [isPOD=0]
> -// CHECK: VarDecl=w:4:17 (Definition) typekind=Typedef const [canonical=Int] [isPOD=1]
> -// CHECK: TypeRef=FooType:1:13 typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: DeclRefExpr=z:3:33 typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: ReturnStmt= typekind=Invalid [isPOD=0]
> -// CHECK: BinaryOperator= typekind=Pointer [isPOD=1]
> -// CHECK: DeclRefExpr=p:3:13 typekind=Pointer [isPOD=1]
> -// CHECK: DeclRefExpr=z:3:33 typekind=Typedef [canonical=Int] [isPOD=1]
> -// CHECK: TypedefDecl=OtherType:7:16 (Definition) typekind=Typedef [canonical=Double] [isPOD=1]
> -// CHECK: TypedefDecl=ArrayType:8:13 (Definition) typekind=Typedef [canonical=ConstantArray] [isPOD=1]
>
> Removed: cfe/trunk/test/Index/print-typekind.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/print-typekind.m?rev=175298&view=auto
> ==============================================================================
> --- cfe/trunk/test/Index/print-typekind.m (original)
> +++ cfe/trunk/test/Index/print-typekind.m (removed)
> @@ -1,10 +0,0 @@
> - at interface Foo
> - at property (readonly) id x;
> --(int) mymethod;
> --(const id) mymethod2:(id)x blah:(Class)y boo:(SEL)z;
> - at end
> -
> -// RUN: c-index-test -test-print-typekind %s | FileCheck %s
> -// CHECK: ObjCPropertyDecl=x:2:25 typekind=ObjCId [canonical=ObjCObjectPointer]
> -// CHECK: ObjCInstanceMethodDecl=mymethod:3:8 typekind=Invalid [result=Int]
> -// CHECK: ObjCInstanceMethodDecl=mymethod2:blah:boo::4:13 typekind=Invalid [result=ObjCId] [args= ObjCId ObjCClass ObjCSel]
>
> Removed: cfe/trunk/test/Index/vector-types.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/vector-types.c?rev=175298&view=auto
> ==============================================================================
> --- cfe/trunk/test/Index/vector-types.c (original)
> +++ cfe/trunk/test/Index/vector-types.c (removed)
> @@ -1,6 +0,0 @@
> -int __attribute__((vector_size(16))) x;
> -typedef int __attribute__((vector_size(16))) int4_t;
> -
> -// RUN: c-index-test -test-print-typekind %s | FileCheck %s
> -// CHECK: VarDecl=x:1:38 typekind=Vector [isPOD=1]
> -// CHECK: TypedefDecl=int4_t:2:46 (Definition) typekind=Typedef [canonical=Vector] [isPOD=1]
>
> 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=175299&r1=175298&r2=175299&view=diff
> ==============================================================================
> --- cfe/trunk/tools/c-index-test/c-index-test.c (original)
> +++ cfe/trunk/tools/c-index-test/c-index-test.c Fri Feb 15 15:15:49 2013
> @@ -1083,36 +1083,42 @@ static enum CXChildVisitResult PrintLink
> /* Typekind testing. */
> /******************************************************************************/
>
> -static enum CXChildVisitResult PrintTypeKind(CXCursor cursor, CXCursor p,
> - CXClientData d) {
> +static void PrintTypeAndTypeKind(CXType T, const char *Format) {
> + CXString TypeSpelling, TypeKindSpelling;
> +
> + TypeSpelling = clang_getTypeSpelling(T);
> + TypeKindSpelling = clang_getTypeKindSpelling(T.kind);
> + printf(Format,
> + clang_getCString(TypeSpelling),
> + clang_getCString(TypeKindSpelling));
> + clang_disposeString(TypeSpelling);
> + clang_disposeString(TypeKindSpelling);
> +}
> +
> +static enum CXChildVisitResult PrintType(CXCursor cursor, CXCursor p,
> + CXClientData d) {
> if (!clang_isInvalid(clang_getCursorKind(cursor))) {
> CXType T = clang_getCursorType(cursor);
> - CXString S = clang_getTypeKindSpelling(T.kind);
> PrintCursor(cursor, NULL);
> - printf(" typekind=%s", clang_getCString(S));
> + PrintTypeAndTypeKind(T, " [type=%s] [typekind=%s]");
> if (clang_isConstQualifiedType(T))
> printf(" const");
> if (clang_isVolatileQualifiedType(T))
> printf(" volatile");
> if (clang_isRestrictQualifiedType(T))
> printf(" restrict");
> - clang_disposeString(S);
> /* Print the canonical type if it is different. */
> {
> CXType CT = clang_getCanonicalType(T);
> if (!clang_equalTypes(T, CT)) {
> - CXString CS = clang_getTypeKindSpelling(CT.kind);
> - printf(" [canonical=%s]", clang_getCString(CS));
> - clang_disposeString(CS);
> + PrintTypeAndTypeKind(CT, " [canonicaltype=%s] [canonicaltypekind=%s]");
> }
> }
> /* Print the return type if it exists. */
> {
> CXType RT = clang_getCursorResultType(cursor);
> if (RT.kind != CXType_Invalid) {
> - CXString RS = clang_getTypeKindSpelling(RT.kind);
> - printf(" [result=%s]", clang_getCString(RS));
> - clang_disposeString(RS);
> + PrintTypeAndTypeKind(RT, " [resulttype=%s] [resulttypekind=%s]");
> }
> }
> /* Print the argument types if they exist. */
> @@ -1124,9 +1130,7 @@ static enum CXChildVisitResult PrintType
> for (i = 0; i < numArgs; ++i) {
> CXType T = clang_getCursorType(clang_Cursor_getArgument(cursor, i));
> if (T.kind != CXType_Invalid) {
> - CXString S = clang_getTypeKindSpelling(T.kind);
> - printf(" %s", clang_getCString(S));
> - clang_disposeString(S);
> + PrintTypeAndTypeKind(T, " [%s] [%s]");
> }
> }
> printf("]");
> @@ -3543,7 +3547,7 @@ static void print_usage(void) {
> " c-index-test -test-inclusion-stack-tu <AST file>\n");
> fprintf(stderr,
> " c-index-test -test-print-linkage-source {<args>}*\n"
> - " c-index-test -test-print-typekind {<args>}*\n"
> + " c-index-test -test-print-type {<args>}*\n"
> " c-index-test -test-print-bitwidth {<args>}*\n"
> " c-index-test -print-usr [<CursorKind> {<args>}]*\n"
> " c-index-test -print-usr-file <file>\n"
> @@ -3625,9 +3629,9 @@ int cindextest_main(int argc, const char
> else if (argc > 2 && strcmp(argv[1], "-test-print-linkage-source") == 0)
> return perform_test_load_source(argc - 2, argv + 2, "all", PrintLinkage,
> NULL);
> - else if (argc > 2 && strcmp(argv[1], "-test-print-typekind") == 0)
> + else if (argc > 2 && strcmp(argv[1], "-test-print-type") == 0)
> return perform_test_load_source(argc - 2, argv + 2, "all",
> - PrintTypeKind, 0);
> + PrintType, 0);
> else if (argc > 2 && strcmp(argv[1], "-test-print-bitwidth") == 0)
> return perform_test_load_source(argc - 2, argv + 2, "all",
> PrintBitWidth, 0);
>
> Modified: cfe/trunk/tools/libclang/CXType.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXType.cpp?rev=175299&r1=175298&r2=175299&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CXType.cpp (original)
> +++ cfe/trunk/tools/libclang/CXType.cpp Fri Feb 15 15:15:49 2013
> @@ -200,6 +200,21 @@ CXType clang_getCursorType(CXCursor C) {
> return MakeCXType(QualType(), TU);
> }
>
> +CXString clang_getTypeSpelling(CXType CT) {
> + QualType T = GetQualType(CT);
> + if (T.isNull())
> + return cxstring::createEmpty();
> +
> + CXTranslationUnit TU = GetTU(CT);
> + SmallString<64> Str;
> + llvm::raw_svector_ostream OS(Str);
> + PrintingPolicy PP(cxtu::getASTUnit(TU)->getASTContext().getLangOpts());
> +
> + T.print(OS, PP);
> +
> + return cxstring::createDup(OS.str());
> +}
> +
> CXType clang_getTypedefDeclUnderlyingType(CXCursor C) {
> using namespace cxcursor;
> CXTranslationUnit TU = cxcursor::getCursorTU(C);
>
> Modified: cfe/trunk/tools/libclang/libclang.exports
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=175299&r1=175298&r2=175299&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/libclang.exports (original)
> +++ cfe/trunk/tools/libclang/libclang.exports Fri Feb 15 15:15:49 2013
> @@ -205,6 +205,7 @@ clang_getTranslationUnitCursor
> clang_getTranslationUnitSpelling
> clang_getTypeDeclaration
> clang_getTypeKindSpelling
> +clang_getTypeSpelling
> clang_getTypedefDeclUnderlyingType
> clang_hashCursor
> clang_indexLoc_getCXSourceLocation
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list