xref: /freebsd-src/contrib/llvm-project/clang/lib/AST/Interp/Source.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1a7dea167SDimitry Andric //===--- Source.cpp - Source expression tracking ----------------*- C++ -*-===//
2a7dea167SDimitry Andric //
3a7dea167SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a7dea167SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5a7dea167SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a7dea167SDimitry Andric //
7a7dea167SDimitry Andric //===----------------------------------------------------------------------===//
8a7dea167SDimitry Andric 
9a7dea167SDimitry Andric #include "Source.h"
10a7dea167SDimitry Andric #include "clang/AST/Expr.h"
11a7dea167SDimitry Andric 
12a7dea167SDimitry Andric using namespace clang;
13a7dea167SDimitry Andric using namespace clang::interp;
14a7dea167SDimitry Andric 
15a7dea167SDimitry Andric SourceLocation SourceInfo::getLoc() const {
16a7dea167SDimitry Andric   if (const Expr *E = asExpr())
17a7dea167SDimitry Andric     return E->getExprLoc();
18a7dea167SDimitry Andric   if (const Stmt *S = asStmt())
19a7dea167SDimitry Andric     return S->getBeginLoc();
20a7dea167SDimitry Andric   if (const Decl *D = asDecl())
21a7dea167SDimitry Andric     return D->getBeginLoc();
22a7dea167SDimitry Andric   return SourceLocation();
23a7dea167SDimitry Andric }
24a7dea167SDimitry Andric 
255f757f3fSDimitry Andric SourceRange SourceInfo::getRange() const {
265f757f3fSDimitry Andric   if (const Expr *E = asExpr())
275f757f3fSDimitry Andric     return E->getSourceRange();
285f757f3fSDimitry Andric   if (const Stmt *S = asStmt())
295f757f3fSDimitry Andric     return S->getSourceRange();
305f757f3fSDimitry Andric   if (const Decl *D = asDecl())
315f757f3fSDimitry Andric     return D->getSourceRange();
325f757f3fSDimitry Andric   return SourceRange();
335f757f3fSDimitry Andric }
345f757f3fSDimitry Andric 
35a7dea167SDimitry Andric const Expr *SourceInfo::asExpr() const {
36*0fca6ea1SDimitry Andric   if (const auto *S = Source.dyn_cast<const Stmt *>())
37a7dea167SDimitry Andric     return dyn_cast<Expr>(S);
38a7dea167SDimitry Andric   return nullptr;
39a7dea167SDimitry Andric }
40a7dea167SDimitry Andric 
41bdd1243dSDimitry Andric const Expr *SourceMapper::getExpr(const Function *F, CodePtr PC) const {
42a7dea167SDimitry Andric   if (const Expr *E = getSource(F, PC).asExpr())
43a7dea167SDimitry Andric     return E;
44a7dea167SDimitry Andric   llvm::report_fatal_error("missing source expression");
45a7dea167SDimitry Andric }
46a7dea167SDimitry Andric 
47bdd1243dSDimitry Andric SourceLocation SourceMapper::getLocation(const Function *F, CodePtr PC) const {
48a7dea167SDimitry Andric   return getSource(F, PC).getLoc();
49a7dea167SDimitry Andric }
505f757f3fSDimitry Andric 
515f757f3fSDimitry Andric SourceRange SourceMapper::getRange(const Function *F, CodePtr PC) const {
525f757f3fSDimitry Andric   return getSource(F, PC).getRange();
535f757f3fSDimitry Andric }
54