Files
swift-mirror/lib/AST/Bridging/MiscBridging.cpp
Hamish Knight edca7c85ad Adopt ABORT throughout the compiler
Convert a bunch of places where we're dumping to stderr and calling
`abort` over to using `ABORT` such that the message gets printed to
the pretty stack trace. This ensures it gets picked up by
CrashReporter.
2025-05-19 20:55:01 +01:00

164 lines
5.6 KiB
C++

//===--- Bridging/MiscBridging.cpp ----------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2022-2024 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#include "swift/AST/ASTBridging.h"
#include "swift/AST/ASTContext.h"
#include "swift/AST/Decl.h"
#include "swift/AST/Expr.h"
#include "swift/AST/ProtocolConformanceRef.h"
#include "swift/AST/Stmt.h"
#include "swift/AST/TypeRepr.h"
#include "swift/Basic/Assertions.h"
#ifdef PURE_BRIDGING_MODE
// In PURE_BRIDGING_MODE, bridging functions are not inlined and therefore
// included in the cpp file.
#include "swift/AST/ASTBridgingImpl.h"
#endif
using namespace swift;
//===----------------------------------------------------------------------===//
// MARK: Misc
//===----------------------------------------------------------------------===//
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
void BridgedTopLevelCodeDecl_dump(void *decl) {
static_cast<TopLevelCodeDecl *>(decl)->dump(llvm::errs());
}
void BridgedExpr_dump(void *expr) {
static_cast<Expr *>(expr)->dump(llvm::errs());
}
void BridgedDecl_dump(void *decl) {
static_cast<Decl *>(decl)->dump(llvm::errs());
}
void BridgedStmt_dump(void *statement) {
static_cast<Stmt *>(statement)->dump(llvm::errs());
}
void BridgedTypeRepr_dump(void *type) { static_cast<TypeRepr *>(type)->dump(); }
#pragma clang diagnostic pop
//===----------------------------------------------------------------------===//
// MARK: Metatype registration
//===----------------------------------------------------------------------===//
static bool declMetatypesInitialized = false;
// Filled in by class registration in initializeSwiftModules().
static SwiftMetatype declMetatypes[(unsigned)DeclKind::Last_Decl + 1];
// Does return null if initializeSwiftModules() is never called.
SwiftMetatype Decl::getDeclMetatype(DeclKind kind) {
SwiftMetatype metatype = declMetatypes[(unsigned)kind];
if (declMetatypesInitialized && !metatype) {
ABORT([&](auto &out) {
out << "Decl " << getKindName(kind) << " not registered";
});
}
return metatype;
}
/// Registers the metatype of a Decl class.
/// Called by initializeSwiftModules().
void registerBridgedDecl(BridgedStringRef bridgedClassName,
SwiftMetatype metatype) {
declMetatypesInitialized = true;
auto declKind = llvm::StringSwitch<std::optional<swift::DeclKind>>(
bridgedClassName.unbridged())
#define DECL(Id, Parent) .Case(#Id "Decl", swift::DeclKind::Id)
#include "swift/AST/DeclNodes.def"
.Default(std::nullopt);
if (!declKind) {
ABORT([&](auto &out) {
out << "Unknown Decl class " << bridgedClassName.unbridged();
});
}
declMetatypes[(unsigned)declKind.value()] = metatype;
}
BridgedOwnedString BridgedDeclObj::getDebugDescription() const {
std::string str;
llvm::raw_string_ostream os(str);
unbridged()->print(os);
return BridgedOwnedString(str);
}
//===----------------------------------------------------------------------===//
// MARK: BridgedASTType
//===----------------------------------------------------------------------===//
BridgedOwnedString BridgedASTType::getDebugDescription() const {
std::string str;
llvm::raw_string_ostream os(str);
unbridged().dump(os);
return BridgedOwnedString(str);
}
//===----------------------------------------------------------------------===//
// MARK: Conformance
//===----------------------------------------------------------------------===//
BridgedOwnedString BridgedConformance::getDebugDescription() const {
std::string str;
llvm::raw_string_ostream os(str);
unbridged().print(os);
return BridgedOwnedString(str);
}
//===----------------------------------------------------------------------===//
// MARK: SubstitutionMap
//===----------------------------------------------------------------------===//
static_assert(sizeof(BridgedSubstitutionMap) >= sizeof(swift::SubstitutionMap),
"BridgedSubstitutionMap has wrong size");
BridgedSubstitutionMap BridgedSubstitutionMap::get(BridgedGenericSignature genSig, BridgedArrayRef replacementTypes) {
return SubstitutionMap::get(genSig.unbridged(),
replacementTypes.unbridged<Type>(),
swift::LookUpConformanceInModule());
}
BridgedOwnedString BridgedSubstitutionMap::getDebugDescription() const {
std::string str;
llvm::raw_string_ostream os(str);
unbridged().dump(os);
return BridgedOwnedString(str);
}
//===----------------------------------------------------------------------===//
// MARK: GenericSignature
//===----------------------------------------------------------------------===//
BridgedOwnedString BridgedGenericSignature::getDebugDescription() const {
std::string str;
llvm::raw_string_ostream os(str);
unbridged().print(os);
return BridgedOwnedString(str);
}
//===----------------------------------------------------------------------===//
// MARK: BridgedPoundKeyword
//===----------------------------------------------------------------------===//
BridgedPoundKeyword BridgedPoundKeyword_fromString(BridgedStringRef cStr) {
return llvm::StringSwitch<BridgedPoundKeyword>(cStr.unbridged())
#define POUND_KEYWORD(NAME) .Case(#NAME, BridgedPoundKeyword_##NAME)
#include "swift/AST/TokenKinds.def"
.Default(BridgedPoundKeyword_None);
}