Files
swift-mirror/lib/AST/PrettyStackTrace.cpp
Dmitri Hrybenko 536ed954ad Remove FuncExpr. Add CaptureInfo to FuncDecl. Introduce AnyFunctionRef.
AnyFunctionRef is a universal function reference that can wrap all AST nodes
that represent functions and exposes a common interface to them.  Use it in two
places in SIL where CapturingExpr was used previously.

AnyFunctionRef allows further simplifications in other places, but these will
be done separately.


Swift SVN r8239
2013-09-14 02:15:48 +00:00

158 lines
4.5 KiB
C++

//===--- PrettyStackTrace.cpp - Swift-specific PrettyStackTraceEntries ----===//
//
// 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 several Swift-specific implementations of
// PrettyStackTraceEntry.
//
//===----------------------------------------------------------------------===//
#include "swift/AST/AST.h"
#include "swift/AST/PrettyStackTrace.h"
#include "swift/AST/TypeVisitor.h"
#include "swift/Basic/Optional.h"
#include "swift/Basic/SourceManager.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/MemoryBuffer.h"
using namespace swift;
void PrettyStackTraceDecl::print(llvm::raw_ostream &out) const {
out << "While " << Action << ' ';
if (!TheDecl) {
out << "NULL declaration!\n";
return;
}
printDeclDescription(out, TheDecl, TheDecl->getASTContext());
}
void swift::printDeclDescription(llvm::raw_ostream &out, Decl *D,
ASTContext &Context) {
if (ValueDecl *named = dyn_cast<ValueDecl>(D)) {
if (named->getName().get())
out << '\'' << named->getName() << '\'';
else
out << "'anonname=" << (const void*)named << '\'';
} else {
out << "declaration";
}
out << " at ";
D->getStartLoc().print(out, Context.SourceMgr);
out << '\n';
}
void PrettyStackTraceExpr::print(llvm::raw_ostream &out) const {
out << "While " << Action << ' ';
if (!TheExpr) {
out << "NULL expression!\n";
return;
}
printExprDescription(out, TheExpr, Context);
}
void swift::printExprDescription(llvm::raw_ostream &out, Expr *E,
ASTContext &Context) {
out << "expression at ";
E->getSourceRange().print(out, Context.SourceMgr);
out << '\n';
}
void PrettyStackTraceStmt::print(llvm::raw_ostream &out) const {
out << "While " << Action << ' ';
if (!TheStmt) {
out << "NULL statement!\n";
return;
}
printStmtDescription(out, TheStmt, Context);
}
void swift::printStmtDescription(llvm::raw_ostream &out, Stmt *S,
ASTContext &Context) {
out << "statement at ";
S->getSourceRange().print(out, Context.SourceMgr);
out << '\n';
}
void PrettyStackTracePattern::print(llvm::raw_ostream &out) const {
out << "While " << Action << ' ';
if (!ThePattern) {
out << "NULL pattern!\n";
return;
}
printPatternDescription(out, ThePattern, Context);
}
void swift::printPatternDescription(llvm::raw_ostream &out, Pattern *P,
ASTContext &Context) {
out << "pattern at ";
P->getSourceRange().print(out, Context.SourceMgr);
out << '\n';
}
namespace {
/// Map a Type to an interesting declaration whose source range we
/// should print.
struct InterestingDeclForType
: TypeVisitor<InterestingDeclForType, Decl*> {
Decl *visitType(TypeBase *type) {
return nullptr;
}
Decl *visitUnboundGenericType(UnboundGenericType *type) {
return type->getDecl();
}
Decl *visitBoundGenericType(BoundGenericType *type) {
return type->getDecl();
}
Decl *visitNominalType(NominalType *type) {
return type->getDecl();
}
Decl *visitNameAliasType(NameAliasType *type) {
return type->getDecl();
}
};
}
void PrettyStackTraceType::print(llvm::raw_ostream &out) const {
out << "While " << Action << ' ';
if (TheType.isNull()) {
out << "NULL type!\n";
return;
}
printTypeDescription(out, TheType, Context);
}
void swift::printTypeDescription(llvm::raw_ostream &out, Type type,
ASTContext &Context) {
out << "type '" << type << '\'';
if (Decl *decl = InterestingDeclForType().visit(type)) {
out << " (declared at ";
decl->getSourceRange().print(out, Context.SourceMgr);
out << ')';
}
out << '\n';
}
void PrettyStackTraceTypeRepr::print(llvm::raw_ostream &out) const {
out << "While " << Action << " type ";
TheType->print(out);
if (TheType && TheType->getSourceRange().isValid()) {
out << " at ";
TheType->getSourceRange().print(out, Context.SourceMgr);
}
out << '\n';
}
void PrettyStackTraceLocation::print(llvm::raw_ostream &out) const {
out << "While " << Action << " starting at ";
Loc.print(out, Context.SourceMgr);
out << '\n';
}