xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/ExpressionParser/Clang/ClangUtil.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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 Andric bool 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 Andric clang::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 Andric QualType 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 Andric QualType 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 Andric CompilerType 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 Andric clang::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 Andric std::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 Andric std::string ClangUtil::ToString(const clang::Type *t) {
825ffd83dbSDimitry Andric   return clang::QualType(t, 0).getAsString();
835ffd83dbSDimitry Andric }
845ffd83dbSDimitry Andric 
ToString(const CompilerType & c)855ffd83dbSDimitry Andric std::string ClangUtil::ToString(const CompilerType &c) {
865ffd83dbSDimitry Andric   return ClangUtil::GetQualType(c).getAsString();
875ffd83dbSDimitry Andric }
88