xref: /freebsd/contrib/llvm-project/clang/lib/Interpreter/InterpreterUtils.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1*06c3fb27SDimitry Andric //===--- InterpreterUtils.cpp - Incremental Utils --------*- C++ -*-===//
2*06c3fb27SDimitry Andric //
3*06c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*06c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*06c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*06c3fb27SDimitry Andric //
7*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
8*06c3fb27SDimitry Andric //
9*06c3fb27SDimitry Andric // This file implements some common utils used in the incremental library.
10*06c3fb27SDimitry Andric //
11*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
12*06c3fb27SDimitry Andric 
13*06c3fb27SDimitry Andric #include "InterpreterUtils.h"
14*06c3fb27SDimitry Andric 
15*06c3fb27SDimitry Andric namespace clang {
16*06c3fb27SDimitry Andric 
17*06c3fb27SDimitry Andric IntegerLiteral *IntegerLiteralExpr(ASTContext &C, uint64_t Val) {
18*06c3fb27SDimitry Andric   return IntegerLiteral::Create(C, llvm::APSInt::getUnsigned(Val),
19*06c3fb27SDimitry Andric                                 C.UnsignedLongLongTy, SourceLocation());
20*06c3fb27SDimitry Andric }
21*06c3fb27SDimitry Andric 
22*06c3fb27SDimitry Andric Expr *CStyleCastPtrExpr(Sema &S, QualType Ty, Expr *E) {
23*06c3fb27SDimitry Andric   ASTContext &Ctx = S.getASTContext();
24*06c3fb27SDimitry Andric   if (!Ty->isPointerType())
25*06c3fb27SDimitry Andric     Ty = Ctx.getPointerType(Ty);
26*06c3fb27SDimitry Andric 
27*06c3fb27SDimitry Andric   TypeSourceInfo *TSI = Ctx.getTrivialTypeSourceInfo(Ty, SourceLocation());
28*06c3fb27SDimitry Andric   Expr *Result =
29*06c3fb27SDimitry Andric       S.BuildCStyleCastExpr(SourceLocation(), TSI, SourceLocation(), E).get();
30*06c3fb27SDimitry Andric   assert(Result && "Cannot create CStyleCastPtrExpr");
31*06c3fb27SDimitry Andric   return Result;
32*06c3fb27SDimitry Andric }
33*06c3fb27SDimitry Andric 
34*06c3fb27SDimitry Andric Expr *CStyleCastPtrExpr(Sema &S, QualType Ty, uintptr_t Ptr) {
35*06c3fb27SDimitry Andric   ASTContext &Ctx = S.getASTContext();
36*06c3fb27SDimitry Andric   return CStyleCastPtrExpr(S, Ty, IntegerLiteralExpr(Ctx, (uint64_t)Ptr));
37*06c3fb27SDimitry Andric }
38*06c3fb27SDimitry Andric 
39*06c3fb27SDimitry Andric Sema::DeclGroupPtrTy CreateDGPtrFrom(Sema &S, Decl *D) {
40*06c3fb27SDimitry Andric   SmallVector<Decl *, 1> DeclsInGroup;
41*06c3fb27SDimitry Andric   DeclsInGroup.push_back(D);
42*06c3fb27SDimitry Andric   Sema::DeclGroupPtrTy DeclGroupPtr = S.BuildDeclaratorGroup(DeclsInGroup);
43*06c3fb27SDimitry Andric   return DeclGroupPtr;
44*06c3fb27SDimitry Andric }
45*06c3fb27SDimitry Andric 
46*06c3fb27SDimitry Andric NamespaceDecl *LookupNamespace(Sema &S, llvm::StringRef Name,
47*06c3fb27SDimitry Andric                                const DeclContext *Within) {
48*06c3fb27SDimitry Andric   DeclarationName DName = &S.Context.Idents.get(Name);
49*06c3fb27SDimitry Andric   LookupResult R(S, DName, SourceLocation(),
50*06c3fb27SDimitry Andric                  Sema::LookupNestedNameSpecifierName);
51*06c3fb27SDimitry Andric   R.suppressDiagnostics();
52*06c3fb27SDimitry Andric   if (!Within)
53*06c3fb27SDimitry Andric     S.LookupName(R, S.TUScope);
54*06c3fb27SDimitry Andric   else {
55*06c3fb27SDimitry Andric     if (const auto *TD = dyn_cast<clang::TagDecl>(Within);
56*06c3fb27SDimitry Andric         TD && !TD->getDefinition())
57*06c3fb27SDimitry Andric       // No definition, no lookup result.
58*06c3fb27SDimitry Andric       return nullptr;
59*06c3fb27SDimitry Andric 
60*06c3fb27SDimitry Andric     S.LookupQualifiedName(R, const_cast<DeclContext *>(Within));
61*06c3fb27SDimitry Andric   }
62*06c3fb27SDimitry Andric 
63*06c3fb27SDimitry Andric   if (R.empty())
64*06c3fb27SDimitry Andric     return nullptr;
65*06c3fb27SDimitry Andric 
66*06c3fb27SDimitry Andric   R.resolveKind();
67*06c3fb27SDimitry Andric 
68*06c3fb27SDimitry Andric   return dyn_cast<NamespaceDecl>(R.getFoundDecl());
69*06c3fb27SDimitry Andric }
70*06c3fb27SDimitry Andric 
71*06c3fb27SDimitry Andric NamedDecl *LookupNamed(Sema &S, llvm::StringRef Name,
72*06c3fb27SDimitry Andric                        const DeclContext *Within) {
73*06c3fb27SDimitry Andric   DeclarationName DName = &S.Context.Idents.get(Name);
74*06c3fb27SDimitry Andric   LookupResult R(S, DName, SourceLocation(), Sema::LookupOrdinaryName,
75*06c3fb27SDimitry Andric                  Sema::ForVisibleRedeclaration);
76*06c3fb27SDimitry Andric 
77*06c3fb27SDimitry Andric   R.suppressDiagnostics();
78*06c3fb27SDimitry Andric 
79*06c3fb27SDimitry Andric   if (!Within)
80*06c3fb27SDimitry Andric     S.LookupName(R, S.TUScope);
81*06c3fb27SDimitry Andric   else {
82*06c3fb27SDimitry Andric     const DeclContext *PrimaryWithin = nullptr;
83*06c3fb27SDimitry Andric     if (const auto *TD = dyn_cast<TagDecl>(Within))
84*06c3fb27SDimitry Andric       PrimaryWithin = llvm::dyn_cast_or_null<DeclContext>(TD->getDefinition());
85*06c3fb27SDimitry Andric     else
86*06c3fb27SDimitry Andric       PrimaryWithin = Within->getPrimaryContext();
87*06c3fb27SDimitry Andric 
88*06c3fb27SDimitry Andric     // No definition, no lookup result.
89*06c3fb27SDimitry Andric     if (!PrimaryWithin)
90*06c3fb27SDimitry Andric       return nullptr;
91*06c3fb27SDimitry Andric 
92*06c3fb27SDimitry Andric     S.LookupQualifiedName(R, const_cast<DeclContext *>(PrimaryWithin));
93*06c3fb27SDimitry Andric   }
94*06c3fb27SDimitry Andric 
95*06c3fb27SDimitry Andric   if (R.empty())
96*06c3fb27SDimitry Andric     return nullptr;
97*06c3fb27SDimitry Andric   R.resolveKind();
98*06c3fb27SDimitry Andric 
99*06c3fb27SDimitry Andric   if (R.isSingleResult())
100*06c3fb27SDimitry Andric     return llvm::dyn_cast<NamedDecl>(R.getFoundDecl());
101*06c3fb27SDimitry Andric 
102*06c3fb27SDimitry Andric   return nullptr;
103*06c3fb27SDimitry Andric }
104*06c3fb27SDimitry Andric 
105*06c3fb27SDimitry Andric std::string GetFullTypeName(ASTContext &Ctx, QualType QT) {
106*06c3fb27SDimitry Andric   PrintingPolicy Policy(Ctx.getPrintingPolicy());
107*06c3fb27SDimitry Andric   Policy.SuppressScope = false;
108*06c3fb27SDimitry Andric   Policy.AnonymousTagLocations = false;
109*06c3fb27SDimitry Andric   return QT.getAsString(Policy);
110*06c3fb27SDimitry Andric }
111*06c3fb27SDimitry Andric } // namespace clang
112