|  | //===--- Source.cpp - Source expression tracking ----------------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "Source.h" | 
|  | #include "clang/AST/Expr.h" | 
|  |  | 
|  | using namespace clang; | 
|  | using namespace clang::interp; | 
|  |  | 
|  | SourceLocation SourceInfo::getLoc() const { | 
|  | if (const Expr *E = asExpr()) | 
|  | return E->getExprLoc(); | 
|  | if (const Stmt *S = asStmt()) | 
|  | return S->getBeginLoc(); | 
|  | if (const Decl *D = asDecl()) | 
|  | return D->getBeginLoc(); | 
|  | return SourceLocation(); | 
|  | } | 
|  |  | 
|  | SourceRange SourceInfo::getRange() const { | 
|  | if (const Expr *E = asExpr()) | 
|  | return E->getSourceRange(); | 
|  | if (const Stmt *S = asStmt()) | 
|  | return S->getSourceRange(); | 
|  | if (const Decl *D = asDecl()) | 
|  | return D->getSourceRange(); | 
|  | return SourceRange(); | 
|  | } | 
|  |  | 
|  | const Expr *SourceInfo::asExpr() const { | 
|  | if (const auto *S = dyn_cast_if_present<const Stmt *>(Source)) | 
|  | return dyn_cast<Expr>(S); | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | const Expr *SourceMapper::getExpr(const Function *F, CodePtr PC) const { | 
|  | if (const Expr *E = getSource(F, PC).asExpr()) | 
|  | return E; | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | SourceLocation SourceMapper::getLocation(const Function *F, CodePtr PC) const { | 
|  | return getSource(F, PC).getLoc(); | 
|  | } | 
|  |  | 
|  | SourceRange SourceMapper::getRange(const Function *F, CodePtr PC) const { | 
|  | return getSource(F, PC).getRange(); | 
|  | } |