ClangUtil.cpp revision 360784
1//===-- ClangUtil.cpp -------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7// A collection of helper methods and data structures for manipulating clang
8// types and decls.
9//===----------------------------------------------------------------------===//
10
11#include "lldb/Symbol/ClangUtil.h"
12#include "lldb/Symbol/ClangASTContext.h"
13
14using namespace clang;
15using namespace lldb_private;
16
17bool ClangUtil::IsClangType(const CompilerType &ct) {
18  // Invalid types are never Clang types.
19  if (!ct)
20    return false;
21
22  if (llvm::dyn_cast_or_null<ClangASTContext>(ct.GetTypeSystem()) == nullptr)
23    return false;
24
25  if (!ct.GetOpaqueQualType())
26    return false;
27
28  return true;
29}
30
31QualType ClangUtil::GetQualType(const CompilerType &ct) {
32  // Make sure we have a clang type before making a clang::QualType
33  if (!IsClangType(ct))
34    return QualType();
35
36  return QualType::getFromOpaquePtr(ct.GetOpaqueQualType());
37}
38
39QualType ClangUtil::GetCanonicalQualType(const CompilerType &ct) {
40  if (!IsClangType(ct))
41    return QualType();
42
43  return GetQualType(ct).getCanonicalType();
44}
45
46CompilerType ClangUtil::RemoveFastQualifiers(const CompilerType &ct) {
47  if (!IsClangType(ct))
48    return ct;
49
50  QualType qual_type(GetQualType(ct));
51  qual_type.removeLocalFastQualifiers();
52  return CompilerType(ct.GetTypeSystem(), qual_type.getAsOpaquePtr());
53}
54
55clang::TagDecl *ClangUtil::GetAsTagDecl(const CompilerType &type) {
56  clang::QualType qual_type = ClangUtil::GetCanonicalQualType(type);
57  if (qual_type.isNull())
58    return nullptr;
59
60  return qual_type->getAsTagDecl();
61}
62
63std::string ClangUtil::DumpDecl(const clang::Decl *d) {
64  if (!d)
65    return "nullptr";
66
67  std::string result;
68  llvm::raw_string_ostream stream(result);
69  bool deserialize = false;
70  d->dump(stream, deserialize);
71
72  stream.flush();
73  return result;
74}
75
76std::string ClangUtil::ToString(const clang::Type *t) {
77  return clang::QualType(t, 0).getAsString();
78}
79
80std::string ClangUtil::ToString(const CompilerType &c) {
81  return ClangUtil::GetQualType(c).getAsString();
82}
83