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