xref: /freebsd-src/contrib/llvm-project/clang/lib/Interpreter/InterpreterUtils.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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