return GetDeclContextForType(ClangUtil::GetQualType(type));
}
+/// Aggressively desugar the provided type, skipping past various kinds of
+/// syntactic sugar and other constructs one typically wants to ignore.
+/// The \p mask argument allows one to skip certain kinds of simplifications,
+/// when one wishes to handle a certain kind of type directly.
+static QualType Desugar(QualType type,
+ ArrayRef<clang::Type::TypeClass> mask = {}) {
+ while (true) {
+ if (find(mask, type->getTypeClass()) != mask.end())
+ return type;
+ switch (type->getTypeClass()) {
+ case clang::Type::Auto:
+ case clang::Type::Elaborated:
+ case clang::Type::Paren:
+ case clang::Type::Typedef:
+ type = type->getLocallyUnqualifiedSingleStepDesugaredType();
+ break;
+ default:
+ return type;
+ }
+ }
+}
+
clang::DeclContext *
ClangASTContext::GetDeclContextForType(clang::QualType type) {
if (type.isNull())
return nullptr;
- clang::QualType qual_type = type.getCanonicalType();
+ clang::QualType qual_type = Desugar(type.getCanonicalType());
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::ObjCInterface:
return llvm::cast<clang::RecordType>(qual_type)->getDecl();
case clang::Type::Enum:
return llvm::cast<clang::EnumType>(qual_type)->getDecl();
- case clang::Type::Typedef:
- return GetDeclContextForType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType());
- case clang::Type::Auto:
- return GetDeclContextForType(
- llvm::cast<clang::AutoType>(qual_type)->getDeducedType());
- case clang::Type::Elaborated:
- return GetDeclContextForType(
- llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
- case clang::Type::Paren:
- return GetDeclContextForType(
- llvm::cast<clang::ParenType>(qual_type)->desugar());
default:
break;
}
static bool GetCompleteQualType(clang::ASTContext *ast,
clang::QualType qual_type,
bool allow_completion = true) {
+ qual_type = Desugar(qual_type);
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::ConstantArray:
}
} break;
- case clang::Type::Typedef:
- return GetCompleteQualType(ast, llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType(),
- allow_completion);
-
- case clang::Type::Auto:
- return GetCompleteQualType(
- ast, llvm::cast<clang::AutoType>(qual_type)->getDeducedType(),
- allow_completion);
-
- case clang::Type::Elaborated:
- return GetCompleteQualType(
- ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType(),
- allow_completion);
-
- case clang::Type::Paren:
- return GetCompleteQualType(
- ast, llvm::cast<clang::ParenType>(qual_type)->desugar(),
- allow_completion);
-
case clang::Type::Attributed:
return GetCompleteQualType(
ast, llvm::cast<clang::AttributedType>(qual_type)->getModifiedType(),
// Tests
bool ClangASTContext::IsAggregateType(lldb::opaque_compiler_type_t type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type(Desugar(GetCanonicalQualType(type)));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::ObjCObject:
case clang::Type::ObjCInterface:
return true;
- case clang::Type::Auto:
- return IsAggregateType(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr());
- case clang::Type::Elaborated:
- return IsAggregateType(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr());
- case clang::Type::Typedef:
- return IsAggregateType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr());
- case clang::Type::Paren:
- return IsAggregateType(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
default:
break;
}
}
bool ClangASTContext::IsAnonymousType(lldb::opaque_compiler_type_t type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type(Desugar(GetCanonicalQualType(type)));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
}
break;
}
- case clang::Type::Auto:
- return IsAnonymousType(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr());
- case clang::Type::Elaborated:
- return IsAnonymousType(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr());
- case clang::Type::Typedef:
- return IsAnonymousType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr());
- case clang::Type::Paren:
- return IsAnonymousType(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
default:
break;
}
bool ClangASTContext::IsArrayType(lldb::opaque_compiler_type_t type,
CompilerType *element_type_ptr,
uint64_t *size, bool *is_incomplete) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type(Desugar(GetCanonicalQualType(type)));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
if (is_incomplete)
*is_incomplete = false;
return true;
-
- case clang::Type::Typedef:
- return IsArrayType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- element_type_ptr, size, is_incomplete);
- case clang::Type::Auto:
- return IsArrayType(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- element_type_ptr, size, is_incomplete);
- case clang::Type::Elaborated:
- return IsArrayType(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- element_type_ptr, size, is_incomplete);
- case clang::Type::Paren:
- return IsArrayType(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- element_type_ptr, size, is_incomplete);
}
if (element_type_ptr)
element_type_ptr->Clear();
bool ClangASTContext::IsFunctionType(lldb::opaque_compiler_type_t type,
bool *is_variadic_ptr) {
if (type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
if (qual_type->isFunctionType()) {
if (is_variadic_ptr) {
switch (type_class) {
default:
break;
- case clang::Type::Typedef:
- return IsFunctionType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- nullptr);
- case clang::Type::Auto:
- return IsFunctionType(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- nullptr);
- case clang::Type::Elaborated:
- return IsFunctionType(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- nullptr);
- case clang::Type::Paren:
- return IsFunctionType(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- nullptr);
case clang::Type::LValueReference:
case clang::Type::RValueReference: {
const clang::ReferenceType *reference_type =
if (!type)
return 0;
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type(Desugar(GetCanonicalQualType(type)));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Record:
}
break;
- case clang::Type::Typedef:
- return IsHomogeneousAggregate(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- base_type_ptr);
-
- case clang::Type::Auto:
- return IsHomogeneousAggregate(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- base_type_ptr);
-
- case clang::Type::Elaborated:
- return IsHomogeneousAggregate(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- base_type_ptr);
default:
break;
}
bool ClangASTContext::IsFunctionPointerType(lldb::opaque_compiler_type_t type) {
if (type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
if (qual_type->isFunctionPointerType())
return true;
switch (type_class) {
default:
break;
- case clang::Type::Typedef:
- return IsFunctionPointerType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr());
- case clang::Type::Auto:
- return IsFunctionPointerType(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr());
- case clang::Type::Elaborated:
- return IsFunctionPointerType(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr());
- case clang::Type::Paren:
- return IsFunctionPointerType(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
case clang::Type::LValueReference:
case clang::Type::RValueReference: {
lldb::opaque_compiler_type_t type,
CompilerType *function_pointer_type_ptr) {
if (type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
if (qual_type->isBlockPointerType()) {
if (function_pointer_type_ptr) {
switch (type_class) {
default:
break;
- case clang::Type::Typedef:
- return IsBlockPointerType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- function_pointer_type_ptr);
- case clang::Type::Auto:
- return IsBlockPointerType(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- function_pointer_type_ptr);
- case clang::Type::Elaborated:
- return IsBlockPointerType(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- function_pointer_type_ptr);
- case clang::Type::Paren:
- return IsBlockPointerType(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- function_pointer_type_ptr);
case clang::Type::LValueReference:
case clang::Type::RValueReference: {
bool ClangASTContext::IsPointerType(lldb::opaque_compiler_type_t type,
CompilerType *pointee_type) {
if (type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Builtin:
->getPointeeType()
.getAsOpaquePtr());
return true;
- case clang::Type::Typedef:
- return IsPointerType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- pointee_type);
- case clang::Type::Auto:
- return IsPointerType(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- pointee_type);
- case clang::Type::Elaborated:
- return IsPointerType(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- pointee_type);
- case clang::Type::Paren:
- return IsPointerType(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- pointee_type);
default:
break;
}
bool ClangASTContext::IsPointerOrReferenceType(
lldb::opaque_compiler_type_t type, CompilerType *pointee_type) {
if (type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Builtin:
->desugar()
.getAsOpaquePtr());
return true;
- case clang::Type::Typedef:
- return IsPointerOrReferenceType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- pointee_type);
- case clang::Type::Auto:
- return IsPointerOrReferenceType(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- pointee_type);
- case clang::Type::Elaborated:
- return IsPointerOrReferenceType(
- llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- pointee_type);
- case clang::Type::Paren:
- return IsPointerOrReferenceType(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- pointee_type);
default:
break;
}
CompilerType *pointee_type,
bool *is_rvalue) {
if (type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
if (is_rvalue)
*is_rvalue = true;
return true;
- case clang::Type::Typedef:
- return IsReferenceType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- pointee_type, is_rvalue);
- case clang::Type::Auto:
- return IsReferenceType(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- pointee_type, is_rvalue);
- case clang::Type::Elaborated:
- return IsReferenceType(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- pointee_type, is_rvalue);
- case clang::Type::Paren:
- return IsReferenceType(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- pointee_type, is_rvalue);
default:
break;
bool check_objc) {
clang::QualType pointee_qual_type;
if (type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
bool success = false;
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
success = true;
break;
- case clang::Type::Typedef:
- return IsPossibleDynamicType(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- dynamic_pointee_type, check_cplusplus,
- check_objc);
-
- case clang::Type::Auto:
- return IsPossibleDynamicType(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- dynamic_pointee_type, check_cplusplus,
- check_objc);
-
- case clang::Type::Elaborated:
- return IsPossibleDynamicType(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- dynamic_pointee_type, check_cplusplus,
- check_objc);
-
- case clang::Type::Paren:
- return IsPossibleDynamicType(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- dynamic_pointee_type, check_cplusplus, check_objc);
default:
break;
}
if (pointee_or_element_clang_type)
pointee_or_element_clang_type->Clear();
- clang::QualType qual_type(GetQualType(type));
+ clang::QualType qual_type =
+ Desugar(GetQualType(type), {clang::Type::Typedef});
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
.getAsOpaquePtr());
return eTypeIsEnumeration | eTypeHasValue;
- case clang::Type::Auto:
- return CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .GetTypeInfo(pointee_or_element_clang_type);
- case clang::Type::Elaborated:
- return CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetTypeInfo(pointee_or_element_clang_type);
- case clang::Type::Paren:
- return CompilerType(this, llvm::cast<clang::ParenType>(qual_type)
- ->desugar()
- .getAsOpaquePtr())
- .GetTypeInfo(pointee_or_element_clang_type);
-
case clang::Type::FunctionProto:
return eTypeIsFuncPrototype | eTypeHasValue;
case clang::Type::FunctionNoProto:
if (!type)
return lldb::eTypeClassInvalid;
- clang::QualType qual_type(GetQualType(type));
+ clang::QualType qual_type =
+ Desugar(GetQualType(type), {clang::Type::Typedef});
switch (qual_type->getTypeClass()) {
+ case clang::Type::Auto:
+ case clang::Type::Elaborated:
+ case clang::Type::Paren:
+ llvm_unreachable("Handled in Desugar!");
case clang::Type::UnaryTransform:
break;
case clang::Type::FunctionNoProto:
return lldb::eTypeClassTypedef;
case clang::Type::UnresolvedUsing:
break;
- case clang::Type::Paren:
- return CompilerType(this, llvm::cast<clang::ParenType>(qual_type)
- ->desugar()
- .getAsOpaquePtr())
- .GetTypeClass();
- case clang::Type::Auto:
- return CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .GetTypeClass();
- case clang::Type::Elaborated:
- return CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetTypeClass();
case clang::Type::Attributed:
break;
ClangASTContext::GetNumMemberFunctions(lldb::opaque_compiler_type_t type) {
size_t num_functions = 0;
if (type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
switch (qual_type->getTypeClass()) {
case clang::Type::Record:
if (GetCompleteQualType(getASTContext(), qual_type)) {
}
break;
- case clang::Type::Typedef:
- return CompilerType(this, llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr())
- .GetNumMemberFunctions();
-
- case clang::Type::Auto:
- return CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .GetNumMemberFunctions();
-
- case clang::Type::Elaborated:
- return CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetNumMemberFunctions();
-
- case clang::Type::Paren:
- return CompilerType(this, llvm::cast<clang::ParenType>(qual_type)
- ->desugar()
- .getAsOpaquePtr())
- .GetNumMemberFunctions();
-
default:
break;
}
CompilerType clang_type;
CompilerDecl clang_decl;
if (type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
switch (qual_type->getTypeClass()) {
case clang::Type::Record:
if (GetCompleteQualType(getASTContext(), qual_type)) {
}
break;
- case clang::Type::Typedef:
- return GetMemberFunctionAtIndex(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- idx);
-
- case clang::Type::Auto:
- return GetMemberFunctionAtIndex(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- idx);
-
- case clang::Type::Elaborated:
- return GetMemberFunctionAtIndex(
- llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- idx);
-
- case clang::Type::Paren:
- return GetMemberFunctionAtIndex(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- idx);
-
default:
break;
}
return lldb::eEncodingInvalid;
count = 1;
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
switch (qual_type->getTypeClass()) {
+ case clang::Type::Auto:
+ case clang::Type::Elaborated:
+ case clang::Type::Paren:
+ case clang::Type::Typedef:
+ llvm_unreachable("Handled in Desugar!");
+
case clang::Type::UnaryTransform:
break;
break;
case clang::Type::Enum:
return lldb::eEncodingSint;
- case clang::Type::Typedef:
- return CompilerType(this, llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr())
- .GetEncoding(count);
-
- case clang::Type::Auto:
- return CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .GetEncoding(count);
-
- case clang::Type::Elaborated:
- return CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetEncoding(count);
-
- case clang::Type::Paren:
- return CompilerType(this, llvm::cast<clang::ParenType>(qual_type)
- ->desugar()
- .getAsOpaquePtr())
- .GetEncoding(count);
case clang::Type::TypeOfExpr:
return CompilerType(this, llvm::cast<clang::TypeOfExprType>(qual_type)
->getUnderlyingExpr()
if (!type)
return lldb::eFormatDefault;
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
switch (qual_type->getTypeClass()) {
+ case clang::Type::Auto:
+ case clang::Type::Elaborated:
+ case clang::Type::Paren:
+ case clang::Type::Typedef:
+ llvm_unreachable("Handled in Desugar!");
case clang::Type::UnaryTransform:
break;
break;
case clang::Type::Enum:
return lldb::eFormatEnum;
- case clang::Type::Typedef:
- return CompilerType(this, llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr())
- .GetFormat();
- case clang::Type::Auto:
- return CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->desugar()
- .getAsOpaquePtr())
- .GetFormat();
- case clang::Type::Paren:
- return CompilerType(this, llvm::cast<clang::ParenType>(qual_type)
- ->desugar()
- .getAsOpaquePtr())
- .GetFormat();
- case clang::Type::Elaborated:
- return CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetFormat();
case clang::Type::TypeOfExpr:
return CompilerType(this, llvm::cast<clang::TypeOfExprType>(qual_type)
->getUnderlyingExpr()
return 0;
uint32_t num_children = 0;
- clang::QualType qual_type(GetQualType(type));
+ clang::QualType qual_type(Desugar(GetQualType(type)));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Builtin:
num_children = num_pointee_children;
} break;
- case clang::Type::Typedef:
- num_children = CompilerType(this, llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr())
- .GetNumChildren(omit_empty_base_classes, exe_ctx);
- break;
-
- case clang::Type::Auto:
- num_children = CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .GetNumChildren(omit_empty_base_classes, exe_ctx);
- break;
-
- case clang::Type::Elaborated:
- num_children =
- CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetNumChildren(omit_empty_base_classes, exe_ctx);
- break;
-
- case clang::Type::Paren:
- num_children =
- CompilerType(
- this,
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr())
- .GetNumChildren(omit_empty_base_classes, exe_ctx);
- break;
default:
break;
}
return 0;
uint32_t count = 0;
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type(Desugar(GetCanonicalQualType(type)));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Record:
}
break;
- case clang::Type::Typedef:
- count = CompilerType(this, llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr())
- .GetNumFields();
- break;
-
- case clang::Type::Auto:
- count = CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .GetNumFields();
- break;
-
- case clang::Type::Elaborated:
- count = CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetNumFields();
- break;
-
- case clang::Type::Paren:
- count =
- CompilerType(
- this,
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr())
- .GetNumFields();
- break;
-
case clang::Type::ObjCObjectPointer: {
const clang::ObjCObjectPointerType *objc_class_type =
qual_type->getAs<clang::ObjCObjectPointerType>();
if (!type)
return CompilerType();
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type(Desugar(GetCanonicalQualType(type)));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Record:
}
break;
- case clang::Type::Typedef:
- return CompilerType(this, llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr())
- .GetFieldAtIndex(idx, name, bit_offset_ptr, bitfield_bit_size_ptr,
- is_bitfield_ptr);
-
- case clang::Type::Auto:
- return CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .GetFieldAtIndex(idx, name, bit_offset_ptr, bitfield_bit_size_ptr,
- is_bitfield_ptr);
-
- case clang::Type::Elaborated:
- return CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetFieldAtIndex(idx, name, bit_offset_ptr, bitfield_bit_size_ptr,
- is_bitfield_ptr);
-
- case clang::Type::Paren:
- return CompilerType(this, llvm::cast<clang::ParenType>(qual_type)
- ->desugar()
- .getAsOpaquePtr())
- .GetFieldAtIndex(idx, name, bit_offset_ptr, bitfield_bit_size_ptr,
- is_bitfield_ptr);
-
default:
break;
}
uint32_t
ClangASTContext::GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) {
uint32_t count = 0;
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Record:
}
break;
- case clang::Type::Typedef:
- count = GetNumDirectBaseClasses(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr());
- break;
-
- case clang::Type::Auto:
- count = GetNumDirectBaseClasses(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr());
- break;
-
- case clang::Type::Elaborated:
- count = GetNumDirectBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr());
- break;
-
- case clang::Type::Paren:
- return GetNumDirectBaseClasses(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
-
default:
break;
}
uint32_t
ClangASTContext::GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) {
uint32_t count = 0;
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Record:
}
break;
- case clang::Type::Typedef:
- count = GetNumVirtualBaseClasses(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr());
- break;
-
- case clang::Type::Auto:
- count = GetNumVirtualBaseClasses(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr());
- break;
-
- case clang::Type::Elaborated:
- count =
- GetNumVirtualBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr());
- break;
-
- case clang::Type::Paren:
- count = GetNumVirtualBaseClasses(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
- break;
-
default:
break;
}
CompilerType ClangASTContext::GetDirectBaseClassAtIndex(
lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Record:
}
break;
- case clang::Type::Typedef:
- return GetDirectBaseClassAtIndex(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- idx, bit_offset_ptr);
-
- case clang::Type::Auto:
- return GetDirectBaseClassAtIndex(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- idx, bit_offset_ptr);
-
- case clang::Type::Elaborated:
- return GetDirectBaseClassAtIndex(
- llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- idx, bit_offset_ptr);
-
- case clang::Type::Paren:
- return GetDirectBaseClassAtIndex(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- idx, bit_offset_ptr);
-
default:
break;
}
CompilerType ClangASTContext::GetVirtualBaseClassAtIndex(
lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Record:
}
break;
- case clang::Type::Typedef:
- return GetVirtualBaseClassAtIndex(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- idx, bit_offset_ptr);
-
- case clang::Type::Auto:
- return GetVirtualBaseClassAtIndex(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- idx, bit_offset_ptr);
-
- case clang::Type::Elaborated:
- return GetVirtualBaseClassAtIndex(
- llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- idx, bit_offset_ptr);
-
- case clang::Type::Paren:
- return GetVirtualBaseClassAtIndex(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- idx, bit_offset_ptr);
-
default:
break;
}
if (type.isNull())
return 0;
- clang::QualType qual_type(type.getCanonicalType());
+ clang::QualType qual_type = Desugar(type.getCanonicalType());
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Builtin:
return 0; // When we function pointers, they have no children...
case clang::Type::UnresolvedUsing:
return 0;
- case clang::Type::Paren:
- return GetNumPointeeChildren(
- llvm::cast<clang::ParenType>(qual_type)->desugar());
- case clang::Type::Typedef:
- return GetNumPointeeChildren(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType());
- case clang::Type::Auto:
- return GetNumPointeeChildren(
- llvm::cast<clang::AutoType>(qual_type)->getDeducedType());
- case clang::Type::Elaborated:
- return GetNumPointeeChildren(
- llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
case clang::Type::TypeOfExpr:
return GetNumPointeeChildren(llvm::cast<clang::TypeOfExprType>(qual_type)
->getUnderlyingExpr()
return exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
};
- clang::QualType parent_qual_type(GetCanonicalQualType(type));
+ clang::QualType parent_qual_type(Desugar(GetCanonicalQualType(type)));
const clang::Type::TypeClass parent_type_class =
parent_qual_type->getTypeClass();
child_bitfield_bit_size = 0;
}
break;
- case clang::Type::Typedef: {
- CompilerType typedefed_clang_type(
- this, llvm::cast<clang::TypedefType>(parent_qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr());
- return typedefed_clang_type.GetChildCompilerTypeAtIndex(
- exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
- ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
- child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
- child_is_deref_of_parent, valobj, language_flags);
- } break;
-
- case clang::Type::Auto: {
- CompilerType elaborated_clang_type(
- this, llvm::cast<clang::AutoType>(parent_qual_type)
- ->getDeducedType()
- .getAsOpaquePtr());
- return elaborated_clang_type.GetChildCompilerTypeAtIndex(
- exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
- ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
- child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
- child_is_deref_of_parent, valobj, language_flags);
- }
-
- case clang::Type::Elaborated: {
- CompilerType elaborated_clang_type(
- this, llvm::cast<clang::ElaboratedType>(parent_qual_type)
- ->getNamedType()
- .getAsOpaquePtr());
- return elaborated_clang_type.GetChildCompilerTypeAtIndex(
- exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
- ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
- child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
- child_is_deref_of_parent, valobj, language_flags);
- }
-
- case clang::Type::Paren: {
- CompilerType paren_clang_type(this,
- llvm::cast<clang::ParenType>(parent_qual_type)
- ->desugar()
- .getAsOpaquePtr());
- return paren_clang_type.GetChildCompilerTypeAtIndex(
- exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
- ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
- child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
- child_is_deref_of_parent, valobj, language_flags);
- }
-
default:
break;
}
lldb::opaque_compiler_type_t type, const char *name,
bool omit_empty_base_classes, std::vector<uint32_t> &child_indexes) {
if (type && name && name[0]) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Record:
}
} break;
- case clang::Type::Typedef:
- return CompilerType(this, llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr())
- .GetIndexOfChildMemberWithName(name, omit_empty_base_classes,
- child_indexes);
-
- case clang::Type::Auto:
- return CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .GetIndexOfChildMemberWithName(name, omit_empty_base_classes,
- child_indexes);
-
- case clang::Type::Elaborated:
- return CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetIndexOfChildMemberWithName(name, omit_empty_base_classes,
- child_indexes);
-
- case clang::Type::Paren:
- return CompilerType(this, llvm::cast<clang::ParenType>(qual_type)
- ->desugar()
- .getAsOpaquePtr())
- .GetIndexOfChildMemberWithName(name, omit_empty_base_classes,
- child_indexes);
-
default:
break;
}
const char *name,
bool omit_empty_base_classes) {
if (type && name && name[0]) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
}
} break;
- case clang::Type::Auto:
- return CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .GetIndexOfChildWithName(name, omit_empty_base_classes);
-
- case clang::Type::Elaborated:
- return CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetIndexOfChildWithName(name, omit_empty_base_classes);
-
- case clang::Type::Paren:
- return CompilerType(this, llvm::cast<clang::ParenType>(qual_type)
- ->desugar()
- .getAsOpaquePtr())
- .GetIndexOfChildWithName(name, omit_empty_base_classes);
-
- case clang::Type::Typedef:
- return CompilerType(this, llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr())
- .GetIndexOfChildWithName(name, omit_empty_base_classes);
-
default:
break;
}
if (!type)
return 0;
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type = Desugar(GetCanonicalQualType(type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Record:
}
break;
- case clang::Type::Typedef:
- return CompilerType(this, llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr())
- .GetNumTemplateArguments();
-
- case clang::Type::Auto:
- return CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .GetNumTemplateArguments();
-
- case clang::Type::Elaborated:
- return CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .GetNumTemplateArguments();
-
- case clang::Type::Paren:
- return CompilerType(this, llvm::cast<clang::ParenType>(qual_type)
- ->desugar()
- .getAsOpaquePtr())
- .GetNumTemplateArguments();
-
default:
break;
}
if (!type)
return nullptr;
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type(Desugar(GetCanonicalQualType(type)));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
case clang::Type::Record: {
cxx_record_decl);
}
- case clang::Type::Typedef:
- return GetAsTemplateSpecialization(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr());
-
- case clang::Type::Auto:
- return GetAsTemplateSpecialization(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr());
-
- case clang::Type::Elaborated:
- return GetAsTemplateSpecialization(
- llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr());
-
- case clang::Type::Paren:
- return GetAsTemplateSpecialization(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
-
default:
return nullptr;
}
if (!type)
return false;
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type(Desugar(GetCanonicalQualType(type)));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class) {
}
} break;
- case clang::Type::Typedef:
- return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)
- ->getDecl()
- ->getUnderlyingType()
- .getAsOpaquePtr(),
- has_extern);
-
- case clang::Type::Auto:
- return SetHasExternalStorage(llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr(),
- has_extern);
-
- case clang::Type::Elaborated:
- return SetHasExternalStorage(llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr(),
- has_extern);
-
- case clang::Type::Paren:
- return SetHasExternalStorage(
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
- has_extern);
-
default:
break;
}
void ClangASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type,
Stream *s) {
if (type) {
- clang::QualType qual_type(GetQualType(type));
+ clang::QualType qual_type =
+ Desugar(GetQualType(type), {clang::Type::Typedef});
llvm::SmallVector<char, 1024> buf;
llvm::raw_svector_ostream llvm_ostrm(buf);
}
} break;
- case clang::Type::Auto:
- CompilerType(this, llvm::cast<clang::AutoType>(qual_type)
- ->getDeducedType()
- .getAsOpaquePtr())
- .DumpTypeDescription(s);
- return;
-
- case clang::Type::Elaborated:
- CompilerType(this, llvm::cast<clang::ElaboratedType>(qual_type)
- ->getNamedType()
- .getAsOpaquePtr())
- .DumpTypeDescription(s);
- return;
-
- case clang::Type::Paren:
- CompilerType(
- this,
- llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr())
- .DumpTypeDescription(s);
- return;
-
case clang::Type::Record: {
GetCompleteType(type);