@@ -3018,28 +3018,11 @@ bool TypeSystemClang::IsCStringType(lldb::opaque_compiler_type_t type,
3018
3018
}
3019
3019
3020
3020
bool TypeSystemClang::IsFunctionType (lldb::opaque_compiler_type_t type) {
3021
- if (type) {
3022
- clang::QualType qual_type = RemoveWrappingTypes (GetCanonicalQualType (type));
3023
-
3024
- if (qual_type->isFunctionType ()) {
3025
- return true ;
3026
- }
3021
+ auto isFunctionType = [&](clang::QualType qual_type) {
3022
+ return qual_type->isFunctionType ();
3023
+ };
3027
3024
3028
- const clang::Type::TypeClass type_class = qual_type->getTypeClass ();
3029
- switch (type_class) {
3030
- default :
3031
- break ;
3032
- case clang::Type::LValueReference:
3033
- case clang::Type::RValueReference: {
3034
- const clang::ReferenceType *reference_type =
3035
- llvm::cast<clang::ReferenceType>(qual_type.getTypePtr ());
3036
- if (reference_type)
3037
- return IsFunctionType (
3038
- reference_type->getPointeeType ().getAsOpaquePtr ());
3039
- } break ;
3040
- }
3041
- }
3042
- return false ;
3025
+ return IsTypeImpl (type, isFunctionType);
3043
3026
}
3044
3027
3045
3028
// Used to detect "Homogeneous Floating-point Aggregates"
@@ -3153,11 +3136,13 @@ TypeSystemClang::GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type,
3153
3136
return CompilerType ();
3154
3137
}
3155
3138
3156
- bool TypeSystemClang::IsFunctionPointerType (lldb::opaque_compiler_type_t type) {
3139
+ bool TypeSystemClang::IsTypeImpl (
3140
+ lldb::opaque_compiler_type_t type,
3141
+ llvm::function_ref<bool (clang::QualType)> predicate) const {
3157
3142
if (type) {
3158
3143
clang::QualType qual_type = RemoveWrappingTypes (GetCanonicalQualType (type));
3159
3144
3160
- if (qual_type-> isFunctionPointerType ( ))
3145
+ if (predicate (qual_type ))
3161
3146
return true ;
3162
3147
3163
3148
const clang::Type::TypeClass type_class = qual_type->getTypeClass ();
@@ -3170,20 +3155,25 @@ bool TypeSystemClang::IsFunctionPointerType(lldb::opaque_compiler_type_t type) {
3170
3155
const clang::ReferenceType *reference_type =
3171
3156
llvm::cast<clang::ReferenceType>(qual_type.getTypePtr ());
3172
3157
if (reference_type)
3173
- return IsFunctionPointerType (
3174
- reference_type->getPointeeType ().getAsOpaquePtr ());
3158
+ return IsTypeImpl (reference_type->getPointeeType ().getAsOpaquePtr (), predicate);
3175
3159
} break ;
3176
3160
}
3177
3161
}
3178
3162
return false ;
3179
3163
}
3180
3164
3165
+ bool TypeSystemClang::IsFunctionPointerType (lldb::opaque_compiler_type_t type) {
3166
+ auto isFunctionPointerType = [](clang::QualType qual_type) {
3167
+ return qual_type->isFunctionPointerType ();
3168
+ };
3169
+
3170
+ return IsTypeImpl (type, isFunctionPointerType);
3171
+ }
3172
+
3181
3173
bool TypeSystemClang::IsBlockPointerType (
3182
3174
lldb::opaque_compiler_type_t type,
3183
3175
CompilerType *function_pointer_type_ptr) {
3184
- if (type) {
3185
- clang::QualType qual_type = RemoveWrappingTypes (GetCanonicalQualType (type));
3186
-
3176
+ auto isBlockPointerType = [&](clang::QualType qual_type) {
3187
3177
if (qual_type->isBlockPointerType ()) {
3188
3178
if (function_pointer_type_ptr) {
3189
3179
const clang::BlockPointerType *block_pointer_type =
@@ -3196,23 +3186,10 @@ bool TypeSystemClang::IsBlockPointerType(
3196
3186
return true ;
3197
3187
}
3198
3188
3199
- const clang::Type::TypeClass type_class = qual_type->getTypeClass ();
3200
- switch (type_class) {
3201
- default :
3202
- break ;
3189
+ return false ;
3190
+ };
3203
3191
3204
- case clang::Type::LValueReference:
3205
- case clang::Type::RValueReference: {
3206
- const clang::ReferenceType *reference_type =
3207
- llvm::cast<clang::ReferenceType>(qual_type.getTypePtr ());
3208
- if (reference_type)
3209
- return IsBlockPointerType (
3210
- reference_type->getPointeeType ().getAsOpaquePtr (),
3211
- function_pointer_type_ptr);
3212
- } break ;
3213
- }
3214
- }
3215
- return false ;
3192
+ return IsTypeImpl (type, isBlockPointerType);
3216
3193
}
3217
3194
3218
3195
bool TypeSystemClang::IsIntegerType (lldb::opaque_compiler_type_t type,
0 commit comments