mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Previously, the Parser and BranchStmt typedef-ed ExprStmtOrDecl as a pointer union. Using typedef made the objects compatible, but did not allow us to extend the type with helper methods, such as getSourceRange(), which is something you can get on all of the AST objects. This patch introduces ASTNode that subclasses from PointerUnion and is used by both parser and BranchStmt. Swift SVN r9971
44 lines
1.4 KiB
C++
44 lines
1.4 KiB
C++
//===--- ASTNode.cpp - Swift Language ASTs ----------------------*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See http://swift.org/LICENSE.txt for license information
|
|
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the ASTNode, which is a union of Stmt, Expr, and Decl.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "swift/AST/ASTNode.h"
|
|
#include "swift/AST/Decl.h"
|
|
#include "swift/AST/Expr.h"
|
|
#include "swift/AST/Stmt.h"
|
|
#include "swift/Basic/SourceLoc.h"
|
|
|
|
using namespace swift;
|
|
|
|
SourceRange ASTNode::getSourceRange() const {
|
|
if (const Expr *E = this->dyn_cast<Expr*>())
|
|
return E->getSourceRange();
|
|
if (const Stmt *S = this->dyn_cast<Stmt*>())
|
|
return S->getSourceRange();
|
|
if (const Decl *D = this->dyn_cast<Decl*>())
|
|
return D->getSourceRange();
|
|
llvm_unreachable("unsupported AST node");
|
|
}
|
|
|
|
/// \brief Return the location of the start of the statement.
|
|
SourceLoc ASTNode::getStartLoc() const {
|
|
return getSourceRange().Start;
|
|
}
|
|
|
|
/// \brief Return the location of the end of the statement.
|
|
SourceLoc ASTNode::getEndLoc() const {
|
|
return getSourceRange().End;
|
|
}
|