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