15ffd83dbSDimitry Andric //===-- ClangUtil.cpp -----------------------------------------------------===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric // A collection of helper methods and data structures for manipulating clang 85ffd83dbSDimitry Andric // types and decls. 95ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 105ffd83dbSDimitry Andric 115ffd83dbSDimitry Andric #include "Plugins/ExpressionParser/Clang/ClangUtil.h" 125ffd83dbSDimitry Andric #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" 135ffd83dbSDimitry Andric 145ffd83dbSDimitry Andric using namespace clang; 155ffd83dbSDimitry Andric using namespace lldb_private; 165ffd83dbSDimitry Andric IsClangType(const CompilerType & ct)175ffd83dbSDimitry Andricbool ClangUtil::IsClangType(const CompilerType &ct) { 185ffd83dbSDimitry Andric // Invalid types are never Clang types. 195ffd83dbSDimitry Andric if (!ct) 205ffd83dbSDimitry Andric return false; 215ffd83dbSDimitry Andric 22*bdd1243dSDimitry Andric if (!ct.GetTypeSystem().dyn_cast_or_null<TypeSystemClang>()) 235ffd83dbSDimitry Andric return false; 245ffd83dbSDimitry Andric 255ffd83dbSDimitry Andric if (!ct.GetOpaqueQualType()) 265ffd83dbSDimitry Andric return false; 275ffd83dbSDimitry Andric 285ffd83dbSDimitry Andric return true; 295ffd83dbSDimitry Andric } 305ffd83dbSDimitry Andric GetDecl(const CompilerDecl & decl)315ffd83dbSDimitry Andricclang::Decl *ClangUtil::GetDecl(const CompilerDecl &decl) { 325ffd83dbSDimitry Andric assert(llvm::isa<TypeSystemClang>(decl.GetTypeSystem())); 335ffd83dbSDimitry Andric return static_cast<clang::Decl *>(decl.GetOpaqueDecl()); 345ffd83dbSDimitry Andric } 355ffd83dbSDimitry Andric GetQualType(const CompilerType & ct)365ffd83dbSDimitry AndricQualType ClangUtil::GetQualType(const CompilerType &ct) { 375ffd83dbSDimitry Andric // Make sure we have a clang type before making a clang::QualType 385ffd83dbSDimitry Andric if (!IsClangType(ct)) 395ffd83dbSDimitry Andric return QualType(); 405ffd83dbSDimitry Andric 415ffd83dbSDimitry Andric return QualType::getFromOpaquePtr(ct.GetOpaqueQualType()); 425ffd83dbSDimitry Andric } 435ffd83dbSDimitry Andric GetCanonicalQualType(const CompilerType & ct)445ffd83dbSDimitry AndricQualType ClangUtil::GetCanonicalQualType(const CompilerType &ct) { 455ffd83dbSDimitry Andric if (!IsClangType(ct)) 465ffd83dbSDimitry Andric return QualType(); 475ffd83dbSDimitry Andric 485ffd83dbSDimitry Andric return GetQualType(ct).getCanonicalType(); 495ffd83dbSDimitry Andric } 505ffd83dbSDimitry Andric RemoveFastQualifiers(const CompilerType & ct)515ffd83dbSDimitry AndricCompilerType ClangUtil::RemoveFastQualifiers(const CompilerType &ct) { 525ffd83dbSDimitry Andric if (!IsClangType(ct)) 535ffd83dbSDimitry Andric return ct; 545ffd83dbSDimitry Andric 555ffd83dbSDimitry Andric QualType qual_type(GetQualType(ct)); 565ffd83dbSDimitry Andric qual_type.removeLocalFastQualifiers(); 575ffd83dbSDimitry Andric return CompilerType(ct.GetTypeSystem(), qual_type.getAsOpaquePtr()); 585ffd83dbSDimitry Andric } 595ffd83dbSDimitry Andric GetAsTagDecl(const CompilerType & type)605ffd83dbSDimitry Andricclang::TagDecl *ClangUtil::GetAsTagDecl(const CompilerType &type) { 615ffd83dbSDimitry Andric clang::QualType qual_type = ClangUtil::GetCanonicalQualType(type); 625ffd83dbSDimitry Andric if (qual_type.isNull()) 635ffd83dbSDimitry Andric return nullptr; 645ffd83dbSDimitry Andric 655ffd83dbSDimitry Andric return qual_type->getAsTagDecl(); 665ffd83dbSDimitry Andric } 675ffd83dbSDimitry Andric DumpDecl(const clang::Decl * d)685ffd83dbSDimitry Andricstd::string ClangUtil::DumpDecl(const clang::Decl *d) { 695ffd83dbSDimitry Andric if (!d) 705ffd83dbSDimitry Andric return "nullptr"; 715ffd83dbSDimitry Andric 725ffd83dbSDimitry Andric std::string result; 735ffd83dbSDimitry Andric llvm::raw_string_ostream stream(result); 745ffd83dbSDimitry Andric bool deserialize = false; 755ffd83dbSDimitry Andric d->dump(stream, deserialize); 765ffd83dbSDimitry Andric 775ffd83dbSDimitry Andric stream.flush(); 785ffd83dbSDimitry Andric return result; 795ffd83dbSDimitry Andric } 805ffd83dbSDimitry Andric ToString(const clang::Type * t)815ffd83dbSDimitry Andricstd::string ClangUtil::ToString(const clang::Type *t) { 825ffd83dbSDimitry Andric return clang::QualType(t, 0).getAsString(); 835ffd83dbSDimitry Andric } 845ffd83dbSDimitry Andric ToString(const CompilerType & c)855ffd83dbSDimitry Andricstd::string ClangUtil::ToString(const CompilerType &c) { 865ffd83dbSDimitry Andric return ClangUtil::GetQualType(c).getAsString(); 875ffd83dbSDimitry Andric } 88