[cfe-commits] libclang: Patch to expose array size and element type

Argyrios Kyrtzidis kyrtzidis at apple.com
Tue Sep 20 18:03:09 PDT 2011


> diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
> index 07bcf9e..3257664 100644
> --- a/include/clang-c/Index.h
> +++ b/include/clang-c/Index.h
> @@ -1955,7 +1955,8 @@ enum CXTypeKind {
>    CXType_ObjCInterface = 108,
>    CXType_ObjCObjectPointer = 109,
>    CXType_FunctionNoProto = 110,
> -  CXType_FunctionProto = 111
> +  CXType_FunctionProto = 111,
> +  CXType_ConstantArray = 112
>  };
>  
>  /**
> @@ -2047,6 +2048,20 @@ CINDEX_LINKAGE CXType clang_getCursorResultType(CXCursor C);
>  CINDEX_LINKAGE unsigned clang_isPODType(CXType T);
>  
>  /**
> + * \brief Return the element type of an array type.
> + *
> + * If a non-array type is passed in, an invalid type is returned.
> + */
> +CINDEX_LINKAGE CXType clang_getArrayElementType(CXType T);
> +
> +/**
> + * \brief Return the the array size of a constant array.
> + *
> + * If a non-array type is passed in, -1 is returned.
> + */
> +CINDEX_LINKAGE int clang_getArraySize(CXType T);
> +
> +/**
>   * \brief Returns 1 if the base class specified by the cursor with kind
>   *   CX_CXXBaseSpecifier is virtual.
>   */
> diff --git a/tools/libclang/CXType.cpp b/tools/libclang/CXType.cpp
> index 45c7346..2a20298 100644
> --- a/tools/libclang/CXType.cpp
> +++ b/tools/libclang/CXType.cpp
> @@ -84,6 +84,7 @@ static CXTypeKind GetTypeKind(QualType T) {
>      TKCASE(ObjCObjectPointer);
>      TKCASE(FunctionNoProto);
>      TKCASE(FunctionProto);
> +    TKCASE(ConstantArray);
>      default:
>        return CXType_Unexposed;
>    }
> @@ -330,6 +331,7 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
>      TKIND(ObjCObjectPointer);
>      TKIND(FunctionNoProto);
>      TKIND(FunctionProto);
> +    TKIND(ConstantArray);
>    }
>  #undef TKIND
>    return cxstring::createCXString(s);
> @@ -373,6 +375,46 @@ unsigned clang_isPODType(CXType X) {
>    return T.isPODType(AU->getASTContext()) ? 1 : 0;
>  }
>  
> +CXType clang_getArrayElementType(CXType X)

Nitpick but please use 'CXType CT' or 'T' as parameter name. I see that clang_isPODType also has 'X' but let's just ignore it :-)

> +{
> +	CXTranslationUnit TU = GetTU(X);
> +	QualType ET = QualType();
> +	QualType T = GetQualType(X);
> +	const Type *TP = T.getTypePtrOrNull();
> +
> +	if (TP) {
> +		switch (TP->getTypeClass()) {
> +		case Type::ConstantArray:
> +			ET = cast<ConstantArrayType>(TP)->getElementType();
> +			break;
> +		default:
> +			break;
> +		}
> +	}
> +	return MakeCXType(ET, TU);
> +}
> +
> +int clang_getArraySize(CXType X)

Better to have it return 'long long' I think.

> +{
> +	int result = -1;
> +	QualType T = GetQualType(X);
> +	const Type *TP = T.getTypePtrOrNull();
> +
> +	if (TP) {
> +		switch (TP->getTypeClass()) {
> +		case Type::ConstantArray:
> +			{
> +				llvm::APInt size = cast<ConstantArrayType>(TP)->getSize();
> +				result = size.getSExtValue();
> +			}
> +			break;
> +		default:
> +			break;
> +		}
> +	}
> +	return result;
> +}

LLVM conventions are no tabs, 2 spaces for indentation, and '{' on the same line as the case statement and the function declaration. This applies to all your patches.

Could you also add a test at 'test/Index/print-typekind.c' ?

-Argyrios

> +
>  CXString clang_getDeclObjCTypeEncoding(CXCursor C) {
>    if ((C.kind < CXCursor_FirstDecl) || (C.kind > CXCursor_LastDecl))
>      return cxstring::createCXString("");
> diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports
> index ea7aaf0..cc6c326 100644
> --- a/tools/libclang/libclang.exports
> +++ b/tools/libclang/libclang.exports
> @@ -42,6 +42,8 @@ clang_equalRanges
>  clang_equalTypes
>  clang_executeOnThread
>  clang_formatDiagnostic
> +clang_getArrayElementType
> +clang_getArraySize
>  clang_getCString
>  clang_getCXTUResourceUsage
>  clang_getCXXAccessSpecifier




On Sep 15, 2011, at 5:38 AM, Vinay Sajip wrote:

> I've attached a patch which exposes array size and element type via the libclang API. At the moment, only constant arrays are handled.
> 
> 
> Comments welcome.
> 
> Regards,
> 
> Vinay Sajip
> <const-arrays.diff>_______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110920/e623d3e9/attachment.html>


More information about the cfe-commits mailing list