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
IntegerLiteralExpr(ASTContext & C,uint64_t Val)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
CStyleCastPtrExpr(Sema & S,QualType Ty,Expr * E)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
CStyleCastPtrExpr(Sema & S,QualType Ty,uintptr_t Ptr)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
CreateDGPtrFrom(Sema & S,Decl * D)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
LookupNamespace(Sema & S,llvm::StringRef Name,const DeclContext * Within)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
LookupNamed(Sema & S,llvm::StringRef Name,const DeclContext * Within)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
GetFullTypeName(ASTContext & Ctx,QualType QT)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