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