106c3fb27SDimitry Andric //===--- InterpreterUtils.cpp - Incremental Utils --------*- C++ -*-===// 206c3fb27SDimitry Andric // 306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606c3fb27SDimitry Andric // 706c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 806c3fb27SDimitry Andric // 906c3fb27SDimitry Andric // This file implements some common utils used in the incremental library. 1006c3fb27SDimitry Andric // 1106c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 1206c3fb27SDimitry Andric 1306c3fb27SDimitry Andric #include "InterpreterUtils.h" 1406c3fb27SDimitry Andric 1506c3fb27SDimitry Andric namespace clang { 1606c3fb27SDimitry Andric 1706c3fb27SDimitry Andric IntegerLiteral *IntegerLiteralExpr(ASTContext &C, uint64_t Val) { 1806c3fb27SDimitry Andric return IntegerLiteral::Create(C, llvm::APSInt::getUnsigned(Val), 1906c3fb27SDimitry Andric C.UnsignedLongLongTy, SourceLocation()); 2006c3fb27SDimitry Andric } 2106c3fb27SDimitry Andric 2206c3fb27SDimitry Andric Expr *CStyleCastPtrExpr(Sema &S, QualType Ty, Expr *E) { 2306c3fb27SDimitry Andric ASTContext &Ctx = S.getASTContext(); 2406c3fb27SDimitry Andric if (!Ty->isPointerType()) 2506c3fb27SDimitry Andric Ty = Ctx.getPointerType(Ty); 2606c3fb27SDimitry Andric 2706c3fb27SDimitry Andric TypeSourceInfo *TSI = Ctx.getTrivialTypeSourceInfo(Ty, SourceLocation()); 2806c3fb27SDimitry Andric Expr *Result = 2906c3fb27SDimitry Andric S.BuildCStyleCastExpr(SourceLocation(), TSI, SourceLocation(), E).get(); 3006c3fb27SDimitry Andric assert(Result && "Cannot create CStyleCastPtrExpr"); 3106c3fb27SDimitry Andric return Result; 3206c3fb27SDimitry Andric } 3306c3fb27SDimitry Andric 3406c3fb27SDimitry Andric Expr *CStyleCastPtrExpr(Sema &S, QualType Ty, uintptr_t Ptr) { 3506c3fb27SDimitry Andric ASTContext &Ctx = S.getASTContext(); 3606c3fb27SDimitry Andric return CStyleCastPtrExpr(S, Ty, IntegerLiteralExpr(Ctx, (uint64_t)Ptr)); 3706c3fb27SDimitry Andric } 3806c3fb27SDimitry Andric 3906c3fb27SDimitry Andric Sema::DeclGroupPtrTy CreateDGPtrFrom(Sema &S, Decl *D) { 4006c3fb27SDimitry Andric SmallVector<Decl *, 1> DeclsInGroup; 4106c3fb27SDimitry Andric DeclsInGroup.push_back(D); 4206c3fb27SDimitry Andric Sema::DeclGroupPtrTy DeclGroupPtr = S.BuildDeclaratorGroup(DeclsInGroup); 4306c3fb27SDimitry Andric return DeclGroupPtr; 4406c3fb27SDimitry Andric } 4506c3fb27SDimitry Andric 4606c3fb27SDimitry Andric NamespaceDecl *LookupNamespace(Sema &S, llvm::StringRef Name, 4706c3fb27SDimitry Andric const DeclContext *Within) { 4806c3fb27SDimitry Andric DeclarationName DName = &S.Context.Idents.get(Name); 4906c3fb27SDimitry Andric LookupResult R(S, DName, SourceLocation(), 5006c3fb27SDimitry Andric Sema::LookupNestedNameSpecifierName); 5106c3fb27SDimitry Andric R.suppressDiagnostics(); 5206c3fb27SDimitry Andric if (!Within) 5306c3fb27SDimitry Andric S.LookupName(R, S.TUScope); 5406c3fb27SDimitry Andric else { 5506c3fb27SDimitry Andric if (const auto *TD = dyn_cast<clang::TagDecl>(Within); 5606c3fb27SDimitry Andric TD && !TD->getDefinition()) 5706c3fb27SDimitry Andric // No definition, no lookup result. 5806c3fb27SDimitry Andric return nullptr; 5906c3fb27SDimitry Andric 6006c3fb27SDimitry Andric S.LookupQualifiedName(R, const_cast<DeclContext *>(Within)); 6106c3fb27SDimitry Andric } 6206c3fb27SDimitry Andric 6306c3fb27SDimitry Andric if (R.empty()) 6406c3fb27SDimitry Andric return nullptr; 6506c3fb27SDimitry Andric 6606c3fb27SDimitry Andric R.resolveKind(); 6706c3fb27SDimitry Andric 6806c3fb27SDimitry Andric return dyn_cast<NamespaceDecl>(R.getFoundDecl()); 6906c3fb27SDimitry Andric } 7006c3fb27SDimitry Andric 7106c3fb27SDimitry Andric NamedDecl *LookupNamed(Sema &S, llvm::StringRef Name, 7206c3fb27SDimitry Andric const DeclContext *Within) { 7306c3fb27SDimitry Andric DeclarationName DName = &S.Context.Idents.get(Name); 7406c3fb27SDimitry Andric LookupResult R(S, DName, SourceLocation(), Sema::LookupOrdinaryName, 75*0fca6ea1SDimitry Andric RedeclarationKind::ForVisibleRedeclaration); 7606c3fb27SDimitry Andric 7706c3fb27SDimitry Andric R.suppressDiagnostics(); 7806c3fb27SDimitry Andric 7906c3fb27SDimitry Andric if (!Within) 8006c3fb27SDimitry Andric S.LookupName(R, S.TUScope); 8106c3fb27SDimitry Andric else { 8206c3fb27SDimitry Andric const DeclContext *PrimaryWithin = nullptr; 8306c3fb27SDimitry Andric if (const auto *TD = dyn_cast<TagDecl>(Within)) 8406c3fb27SDimitry Andric PrimaryWithin = llvm::dyn_cast_or_null<DeclContext>(TD->getDefinition()); 8506c3fb27SDimitry Andric else 8606c3fb27SDimitry Andric PrimaryWithin = Within->getPrimaryContext(); 8706c3fb27SDimitry Andric 8806c3fb27SDimitry Andric // No definition, no lookup result. 8906c3fb27SDimitry Andric if (!PrimaryWithin) 9006c3fb27SDimitry Andric return nullptr; 9106c3fb27SDimitry Andric 9206c3fb27SDimitry Andric S.LookupQualifiedName(R, const_cast<DeclContext *>(PrimaryWithin)); 9306c3fb27SDimitry Andric } 9406c3fb27SDimitry Andric 9506c3fb27SDimitry Andric if (R.empty()) 9606c3fb27SDimitry Andric return nullptr; 9706c3fb27SDimitry Andric R.resolveKind(); 9806c3fb27SDimitry Andric 9906c3fb27SDimitry Andric if (R.isSingleResult()) 10006c3fb27SDimitry Andric return llvm::dyn_cast<NamedDecl>(R.getFoundDecl()); 10106c3fb27SDimitry Andric 10206c3fb27SDimitry Andric return nullptr; 10306c3fb27SDimitry Andric } 10406c3fb27SDimitry Andric 10506c3fb27SDimitry Andric std::string GetFullTypeName(ASTContext &Ctx, QualType QT) { 10606c3fb27SDimitry Andric PrintingPolicy Policy(Ctx.getPrintingPolicy()); 10706c3fb27SDimitry Andric Policy.SuppressScope = false; 10806c3fb27SDimitry Andric Policy.AnonymousTagLocations = false; 10906c3fb27SDimitry Andric return QT.getAsString(Policy); 11006c3fb27SDimitry Andric } 11106c3fb27SDimitry Andric } // namespace clang 112