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