std::string UWrapperGeneratorVB6Declare::ClangTypeToVB6(const clang::QualType& type, bool* success, bool canHaveRef, bool* isRef /*= 0*/) { if (isRef) *isRef = false; if (type->isFunctionPointerType()) { return "Long"; } else if (type->getTypeClass() == clang::Type::Builtin) { const clang::BuiltinType* builtInType = type->getAs<clang::BuiltinType>(); return ClangBuiltinTypeToVB6(builtInType, success); } else if (type->getTypeClass() == clang::Type::Pointer) { const clang::PointerType* pointerType = type->getAs<clang::PointerType>(); const clang::QualType& pointeeType = pointerType->getPointeeType(); if (pointeeType->getTypeClass() == clang::Type::Builtin) { const clang::BuiltinType* pointeeTypeBuiltin = pointeeType->getAs<clang::BuiltinType>(); switch (pointeeTypeBuiltin->getKind()) { case clang::BuiltinType::SChar: case clang::BuiltinType::Char_S: case clang::BuiltinType::UChar: case clang::BuiltinType::Char_U: return "String"; //char* --> String case clang::BuiltinType::Void: return "Long"; // void* --> Long default: if (m_ptrToLong) return "Long"; if (canHaveRef) { if (isRef) *isRef = true; return ClangBuiltinTypeToVB6(pointeeTypeBuiltin, success); } } } if (m_ptrToLong) return "Long"; std::string conv = ClangTypeToVB6(pointeeType, success, false); if (canHaveRef) { if (isRef) *isRef = true; return conv; } return "Long"; } else if (type->getTypeClass() == clang::Type::Typedef) { return ClangTypeToVB6(type->getAs<clang::TypedefType>()->desugar(), success, canHaveRef, isRef); } else if (type->getTypeClass() == clang::Type::Elaborated) { return ClangTypeToVB6(type->getAs<clang::ElaboratedType>()->desugar(), success, canHaveRef, isRef); } else if (type->getTypeClass() == clang::Type::Paren) { return ClangTypeToVB6(type->getAs<clang::ParenType>()->desugar(), success, canHaveRef, isRef); } else if (type->getTypeClass() == clang::Type::Enum) { const clang::EnumType* enumType = type->getAs<clang::EnumType>(); if (m_collectedEnums.find(enumType->getDecl()) != m_collectedEnums.end()) { return clang::QualType(enumType, 0).getAsString(); } } else if (type->getTypeClass() == clang::Type::Record) { const clang::RecordType* recType = type->getAs<clang::RecordType>(); if (m_collectedRecords.find(recType->getDecl()) != m_collectedRecords.end()) return recType->getDecl()->getNameAsString(); } if (success) *success = false; std::cout << type->getTypeClassName() << std::endl; type->dump(); return "<Unsupported>"; }
static lldb_private::Scalar::Type GetScalarTypeForClangType (clang::ASTContext &ast_context, clang::QualType clang_type, uint32_t &count) { count = 1; switch (clang_type->getTypeClass()) { default: break; case clang::Type::FunctionNoProto: case clang::Type::FunctionProto: break; case clang::Type::IncompleteArray: case clang::Type::VariableArray: break; case clang::Type::ConstantArray: break; case clang::Type::ExtVector: case clang::Type::Vector: // TODO: Set this to more than one??? break; case clang::Type::Builtin: switch (cast<clang::BuiltinType>(clang_type)->getKind()) { default: assert(0 && "Unknown builtin type!"); case clang::BuiltinType::Void: break; case clang::BuiltinType::Bool: case clang::BuiltinType::Char_S: case clang::BuiltinType::SChar: case clang::BuiltinType::WChar: case clang::BuiltinType::Char16: case clang::BuiltinType::Char32: case clang::BuiltinType::Short: case clang::BuiltinType::Int: case clang::BuiltinType::Long: case clang::BuiltinType::LongLong: case clang::BuiltinType::Int128: return lldb_private::Scalar::GetValueTypeForSignedIntegerWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT)/count); case clang::BuiltinType::Char_U: case clang::BuiltinType::UChar: case clang::BuiltinType::UShort: case clang::BuiltinType::UInt: case clang::BuiltinType::ULong: case clang::BuiltinType::ULongLong: case clang::BuiltinType::UInt128: case clang::BuiltinType::NullPtr: return lldb_private::Scalar::GetValueTypeForUnsignedIntegerWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT)/count); case clang::BuiltinType::Float: case clang::BuiltinType::Double: case clang::BuiltinType::LongDouble: return lldb_private::Scalar::GetValueTypeForFloatWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT)/count); } break; // All pointer types are represented as unsigned integer encodings. // We may nee to add a eEncodingPointer if we ever need to know the // difference case clang::Type::ObjCObjectPointer: case clang::Type::BlockPointer: case clang::Type::Pointer: case clang::Type::LValueReference: case clang::Type::RValueReference: case clang::Type::MemberPointer: return lldb_private::Scalar::GetValueTypeForUnsignedIntegerWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT)/count); // Complex numbers are made up of floats case clang::Type::Complex: count = 2; return lldb_private::Scalar::GetValueTypeForFloatWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT) / count); case clang::Type::ObjCInterface: break; case clang::Type::Record: break; case clang::Type::Enum: return lldb_private::Scalar::GetValueTypeForSignedIntegerWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT)/count); case clang::Type::Typedef: return GetScalarTypeForClangType(ast_context, cast<clang::TypedefType>(clang_type)->LookThroughTypedefs(), count); break; case clang::Type::TypeOfExpr: case clang::Type::TypeOf: case clang::Type::Decltype: //case clang::Type::QualifiedName: case clang::Type::TemplateSpecialization: break; } count = 0; return lldb_private::Scalar::e_void; }