mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
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
158 lines
4.5 KiB
C++
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';
|
|
}
|