1353942Sdim//===--- Source.cpp - Source expression tracking ----------------*- C++ -*-===//
2353942Sdim//
3353942Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353942Sdim// See https://llvm.org/LICENSE.txt for license information.
5353942Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6353942Sdim//
7353942Sdim//===----------------------------------------------------------------------===//
8353942Sdim
9353942Sdim#include "Source.h"
10353942Sdim#include "clang/AST/Expr.h"
11353942Sdim
12353942Sdimusing namespace clang;
13353942Sdimusing namespace clang::interp;
14353942Sdim
15353942SdimSourceLocation SourceInfo::getLoc() const {
16353942Sdim  if (const Expr *E = asExpr())
17353942Sdim    return E->getExprLoc();
18353942Sdim  if (const Stmt *S = asStmt())
19353942Sdim    return S->getBeginLoc();
20353942Sdim  if (const Decl *D = asDecl())
21353942Sdim    return D->getBeginLoc();
22353942Sdim  return SourceLocation();
23353942Sdim}
24353942Sdim
25353942Sdimconst Expr *SourceInfo::asExpr() const {
26353942Sdim  if (auto *S = Source.dyn_cast<const Stmt *>())
27353942Sdim    return dyn_cast<Expr>(S);
28353942Sdim  return nullptr;
29353942Sdim}
30353942Sdim
31353942Sdimconst Expr *SourceMapper::getExpr(Function *F, CodePtr PC) const {
32353942Sdim  if (const Expr *E = getSource(F, PC).asExpr())
33353942Sdim    return E;
34353942Sdim  llvm::report_fatal_error("missing source expression");
35353942Sdim}
36353942Sdim
37353942SdimSourceLocation SourceMapper::getLocation(Function *F, CodePtr PC) const {
38353942Sdim  return getSource(F, PC).getLoc();
39353942Sdim}
40