xref: /llvm-project/clang/lib/AST/ByteCode/Source.cpp (revision 202ad47fe1bd652ee5cc7612e696a2479398c44f)
1a07aba5dSTimm Baeder //===--- Source.cpp - Source expression tracking ----------------*- C++ -*-===//
2a07aba5dSTimm Baeder //
3a07aba5dSTimm Baeder // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a07aba5dSTimm Baeder // See https://llvm.org/LICENSE.txt for license information.
5a07aba5dSTimm Baeder // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a07aba5dSTimm Baeder //
7a07aba5dSTimm Baeder //===----------------------------------------------------------------------===//
8a07aba5dSTimm Baeder 
9a07aba5dSTimm Baeder #include "Source.h"
10a07aba5dSTimm Baeder #include "clang/AST/Expr.h"
11a07aba5dSTimm Baeder 
12a07aba5dSTimm Baeder using namespace clang;
13a07aba5dSTimm Baeder using namespace clang::interp;
14a07aba5dSTimm Baeder 
15a07aba5dSTimm Baeder SourceLocation SourceInfo::getLoc() const {
16a07aba5dSTimm Baeder   if (const Expr *E = asExpr())
17a07aba5dSTimm Baeder     return E->getExprLoc();
18a07aba5dSTimm Baeder   if (const Stmt *S = asStmt())
19a07aba5dSTimm Baeder     return S->getBeginLoc();
20a07aba5dSTimm Baeder   if (const Decl *D = asDecl())
21a07aba5dSTimm Baeder     return D->getBeginLoc();
22a07aba5dSTimm Baeder   return SourceLocation();
23a07aba5dSTimm Baeder }
24a07aba5dSTimm Baeder 
25a07aba5dSTimm Baeder SourceRange SourceInfo::getRange() const {
26a07aba5dSTimm Baeder   if (const Expr *E = asExpr())
27a07aba5dSTimm Baeder     return E->getSourceRange();
28a07aba5dSTimm Baeder   if (const Stmt *S = asStmt())
29a07aba5dSTimm Baeder     return S->getSourceRange();
30a07aba5dSTimm Baeder   if (const Decl *D = asDecl())
31a07aba5dSTimm Baeder     return D->getSourceRange();
32a07aba5dSTimm Baeder   return SourceRange();
33a07aba5dSTimm Baeder }
34a07aba5dSTimm Baeder 
35a07aba5dSTimm Baeder const Expr *SourceInfo::asExpr() const {
36*202ad47fSTimm Baeder   if (const auto *S = dyn_cast_if_present<const Stmt *>(Source))
37a07aba5dSTimm Baeder     return dyn_cast<Expr>(S);
38a07aba5dSTimm Baeder   return nullptr;
39a07aba5dSTimm Baeder }
40a07aba5dSTimm Baeder 
41a07aba5dSTimm Baeder const Expr *SourceMapper::getExpr(const Function *F, CodePtr PC) const {
42a07aba5dSTimm Baeder   if (const Expr *E = getSource(F, PC).asExpr())
43a07aba5dSTimm Baeder     return E;
44a07aba5dSTimm Baeder   return nullptr;
45a07aba5dSTimm Baeder }
46a07aba5dSTimm Baeder 
47a07aba5dSTimm Baeder SourceLocation SourceMapper::getLocation(const Function *F, CodePtr PC) const {
48a07aba5dSTimm Baeder   return getSource(F, PC).getLoc();
49a07aba5dSTimm Baeder }
50a07aba5dSTimm Baeder 
51a07aba5dSTimm Baeder SourceRange SourceMapper::getRange(const Function *F, CodePtr PC) const {
52a07aba5dSTimm Baeder   return getSource(F, PC).getRange();
53a07aba5dSTimm Baeder }
54