Skip to content

{AST,Basic}Bridging: Use <swift/bridging> and try directly bridging one of our enums #82165

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 36 additions & 55 deletions include/swift/AST/ASTBridging.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
// Pure bridging mode does not permit including any C++/llvm/swift headers.
// See also the comments for `BRIDGING_MODE` in the top-level CMakeLists.txt file.
//
#include "swift/AST/DiagnosticKind.h"
#include "swift/Basic/BasicBridging.h"

#ifdef USED_IN_CPP_SOURCE
Expand Down Expand Up @@ -118,17 +119,15 @@ class BridgedIdentifier {
BridgedIdentifier(const void *_Nullable raw) : Raw(raw) {}

BRIDGED_INLINE BridgedIdentifier(swift::Identifier ident);

BRIDGED_INLINE swift::Identifier unbridged() const;
};

SWIFT_NAME("getter:BridgedIdentifier.raw(self:)")
inline const void *_Nullable BridgedIdentifier_raw(BridgedIdentifier ident) {
return ident.Raw;
}
SWIFT_COMPUTED_PROPERTY
const void *_Nullable getRaw() const { return Raw; }
Comment on lines +124 to +125
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice!


SWIFT_NAME("getter:BridgedIdentifier.isOperator(self:)")
BRIDGED_INLINE bool BridgedIdentifier_isOperator(const BridgedIdentifier);
BRIDGED_INLINE
SWIFT_COMPUTED_PROPERTY
bool getIsOperator() const;
};

struct BridgedLocatedIdentifier {
SWIFT_NAME("name")
Expand Down Expand Up @@ -236,6 +235,11 @@ BridgedDeclNameLoc_createParsed(
// MARK: ASTContext
//===----------------------------------------------------------------------===//

enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedEndianness : size_t {
EndianLittle,
EndianBig,
};

class BridgedASTContext {
swift::ASTContext * _Nonnull Ctx;

Expand All @@ -245,17 +249,31 @@ class BridgedASTContext {

SWIFT_UNAVAILABLE("Use '.raw' instead")
BRIDGED_INLINE swift::ASTContext &unbridged() const;

SWIFT_COMPUTED_PROPERTY
void *_Nonnull getRaw() const { return Ctx; }

SWIFT_COMPUTED_PROPERTY
unsigned getMajorLanguageVersion() const;

SWIFT_COMPUTED_PROPERTY
unsigned getLangOptsTargetPointerBitWidth() const;

SWIFT_COMPUTED_PROPERTY
bool getLangOptsAttachCommentsToDecls() const;

SWIFT_COMPUTED_PROPERTY
BridgedEndianness getLangOptsTargetEndianness() const;

SWIFT_COMPUTED_PROPERTY
BridgedAvailabilityMacroMap getAvailabilityMacroMap() const;
};

#define IDENTIFIER_WITH_NAME(Name, _) \
SWIFT_NAME("getter:BridgedASTContext.id_" #Name "(self:)") \
BRIDGED_INLINE BridgedIdentifier BridgedASTContext_id_##Name(BridgedASTContext bridged);
#include "swift/AST/KnownIdentifiers.def"

SWIFT_NAME("getter:BridgedASTContext.raw(self:)")
BRIDGED_INLINE
void * _Nonnull BridgedASTContext_raw(BridgedASTContext bridged);

SWIFT_NAME("BridgedASTContext.init(raw:)")
BRIDGED_INLINE
BridgedASTContext BridgedASTContext_fromRaw(void * _Nonnull ptr);
Expand Down Expand Up @@ -283,9 +301,6 @@ SWIFT_NAME("BridgedASTContext.langOptsHasFeature(self:_:)")
bool BridgedASTContext_langOptsHasFeature(BridgedASTContext cContext,
BridgedFeature feature);

SWIFT_NAME("getter:BridgedASTContext.majorLanguageVersion(self:)")
unsigned BridgedASTContext_majorLanguageVersion(BridgedASTContext cContext);

SWIFT_NAME("BridgedASTContext.langOptsCustomConditionSet(self:_:)")
bool BridgedASTContext_langOptsCustomConditionSet(BridgedASTContext cContext,
BridgedStringRef cName);
Expand Down Expand Up @@ -318,25 +333,10 @@ SWIFT_NAME("BridgedASTContext.langOptsIsActiveTargetPtrAuth(self:_:)")
bool BridgedASTContext_langOptsIsActiveTargetPtrAuth(BridgedASTContext cContext,
BridgedStringRef cName);

SWIFT_NAME("getter:BridgedASTContext.langOptsTargetPointerBitWidth(self:)")
unsigned BridgedASTContext_langOptsTargetPointerBitWidth(BridgedASTContext cContext);

SWIFT_NAME("BridgedASTContext.langOptsGetTargetAtomicBitWidths(self:_:)")
SwiftInt BridgedASTContext_langOptsGetTargetAtomicBitWidths(BridgedASTContext cContext,
SwiftInt* _Nullable * _Nonnull cComponents);

enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedEndianness : size_t {
EndianLittle,
EndianBig,
};

SWIFT_NAME("getter:BridgedASTContext.langOptsAttachCommentsToDecls(self:)")
bool BridgedASTContext_langOptsAttachCommentsToDecls(
BridgedASTContext cContext);

SWIFT_NAME("getter:BridgedASTContext.langOptsTargetEndianness(self:)")
BridgedEndianness BridgedASTContext_langOptsTargetEndianness(BridgedASTContext cContext);

SWIFT_NAME("BridgedASTContext.langOptsGetLanguageVersion(self:_:)")
SwiftInt BridgedASTContext_langOptsGetLanguageVersion(BridgedASTContext cContext,
SwiftInt* _Nullable * _Nonnull cComponents);
Expand All @@ -345,10 +345,6 @@ SWIFT_NAME("BridgedASTContext.langOptsGetCompilerVersion(self:_:)")
SwiftInt BridgedASTContext_langOptsGetCompilerVersion(BridgedASTContext cContext,
SwiftInt* _Nullable * _Nonnull cComponents);

SWIFT_NAME("getter:BridgedASTContext.availabilityMacroMap(self:)")
BridgedAvailabilityMacroMap
BridgedASTContext_getAvailabilityMacroMap(BridgedASTContext cContext);

/* Deallocate an array of Swift int values that was allocated in C++. */
void deallocateIntBuffer(SwiftInt * _Nullable cComponents);

Expand Down Expand Up @@ -442,7 +438,7 @@ class BridgedASTNode {
return BridgedASTNode(e.unbridged(), BridgedASTNodeKindExpr);
}

SWIFT_UNAVAILABLE("use .kind")
SWIFT_COMPUTED_PROPERTY
BridgedASTNodeKind getKind() const {
return static_cast<BridgedASTNodeKind>(opaque & 0x7);
}
Expand All @@ -454,11 +450,6 @@ class BridgedASTNode {
BRIDGED_INLINE swift::ASTNode unbridged() const;
};

SWIFT_NAME("getter:BridgedASTNode.kind(self:)")
inline BridgedASTNodeKind BridgedASTNode_getKind(BridgedASTNode node) {
return node.getKind();
}

// Declare `.asDecl` on each BridgedXXXDecl type, which upcasts a wrapper for
// a Decl subclass to a BridgedDecl.
#define DECL(Id, Parent) \
Expand Down Expand Up @@ -575,15 +566,6 @@ class BridgedDiagnosticFixIt {
BridgedDiagnosticFixIt(BridgedSourceLoc start, uint32_t length, BridgedStringRef text);
};

/// Diagnostic severity when reporting diagnostics.
enum ENUM_EXTENSIBILITY_ATTR(open) BridgedDiagnosticSeverity : size_t {
BridgedFatalError,
BridgedError,
BridgedWarning,
BridgedRemark,
BridgedNote,
};

class BridgedDiagnostic {
public:
struct Impl;
Expand Down Expand Up @@ -622,7 +604,7 @@ bool BridgedDiagnosticEngine_hadAnyError(BridgedDiagnosticEngine);
SWIFT_NAME("BridgedDiagnostic.init(at:message:severity:engine:)")
BridgedDiagnostic BridgedDiagnostic_create(BridgedSourceLoc cLoc,
BridgedStringRef cText,
BridgedDiagnosticSeverity severity,
swift::DiagnosticKind severity,
BridgedDiagnosticEngine cDiags);

/// Highlight a source range as part of the diagnostic.
Expand Down Expand Up @@ -1930,8 +1912,11 @@ class BridgedCaptureListEntry {

public:
BRIDGED_INLINE BridgedCaptureListEntry(swift::CaptureListEntry CLE);

BRIDGED_INLINE swift::CaptureListEntry unbridged() const;

BRIDGED_INLINE
SWIFT_COMPUTED_PROPERTY
BridgedVarDecl getVarDecl() const;
};

SWIFT_NAME("BridgedCaptureListEntry.createParsed(_:declContext:ownership:"
Expand All @@ -1943,10 +1928,6 @@ BridgedCaptureListEntry BridegedCaptureListEntry_createParsed(
BridgedSourceLoc cNameLoc, BridgedSourceLoc cEqualLoc,
BridgedExpr cInitializer);

SWIFT_NAME("getter:BridgedCaptureListEntry.varDecl(self:)")
BRIDGED_INLINE BridgedVarDecl
BridegedCaptureListEntry_getVar(BridgedCaptureListEntry entry);

SWIFT_NAME("BridgedCaptureListExpr.createParsed(_:captureList:closure:)")
BridgedCaptureListExpr BridgedCaptureListExpr_createParsed(BridgedASTContext cContext,
BridgedArrayRef cCaptureList,
Expand Down
12 changes: 4 additions & 8 deletions include/swift/AST/ASTBridgingImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ swift::Identifier BridgedIdentifier::unbridged() const {
return swift::Identifier::getFromOpaquePointer(Raw);
}

bool BridgedIdentifier_isOperator(const BridgedIdentifier ident) {
return ident.unbridged().isOperator();
bool BridgedIdentifier::getIsOperator() const {
return unbridged().isOperator();
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -101,10 +101,6 @@ BridgedASTContext::BridgedASTContext(swift::ASTContext &ctx) : Ctx(&ctx) {}

swift::ASTContext &BridgedASTContext::unbridged() const { return *Ctx; }

void * _Nonnull BridgedASTContext_raw(BridgedASTContext bridged) {
return &bridged.unbridged();
}

BridgedASTContext BridgedASTContext_fromRaw(void * _Nonnull ptr) {
return *static_cast<swift::ASTContext *>(ptr);
}
Expand Down Expand Up @@ -938,8 +934,8 @@ swift::CaptureListEntry BridgedCaptureListEntry::unbridged() const {
return swift::CaptureListEntry(PBD);
}

BridgedVarDecl BridegedCaptureListEntry_getVar(BridgedCaptureListEntry entry) {
return entry.unbridged().getVar();
BridgedVarDecl BridgedCaptureListEntry::getVarDecl() const {
return unbridged().getVar();
}

//===----------------------------------------------------------------------===//
Expand Down
10 changes: 1 addition & 9 deletions include/swift/AST/DiagnosticConsumer.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#ifndef SWIFT_BASIC_DIAGNOSTICCONSUMER_H
#define SWIFT_BASIC_DIAGNOSTICCONSUMER_H

#include "swift/AST/DiagnosticKind.h"
#include "swift/Basic/LLVM.h"
#include "swift/Basic/SourceLoc.h"
#include "llvm/Support/SourceMgr.h"
Expand All @@ -30,15 +31,6 @@ namespace swift {
class SourceManager;
enum class DiagID : uint32_t;

/// Describes the kind of diagnostic.
///
enum class DiagnosticKind : uint8_t {
Error,
Warning,
Remark,
Note
};

/// Information about a diagnostic passed to DiagnosticConsumers.
struct DiagnosticInfo {
DiagID ID = DiagID(0);
Expand Down
33 changes: 33 additions & 0 deletions include/swift/AST/DiagnosticKind.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//===-- AST/DiagnosticKind.h ------------------------------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2025 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
//
//===----------------------------------------------------------------------===//

#ifndef SWIFT_AST_DIAGNOSTIC_KIND_H
#define SWIFT_AST_DIAGNOSTIC_KIND_H

/// This header is included in a bridging header. Be *very* careful with what
/// you include here! See include caveats in `ASTBridging.h`.
#include "swift/Basic/SwiftBridging.h"
#include <stdint.h>

namespace swift {

/// Describes the kind of diagnostic.
enum class ENUM_EXTENSIBILITY_ATTR(open) DiagnosticKind : uint8_t {
Error SWIFT_NAME("error"),
Warning SWIFT_NAME("warning"),
Remark SWIFT_NAME("remark"),
Note SWIFT_NAME("note")
};

} // namespace swift

#endif // SWIFT_AST_DIAGNOSTIC_KIND_H
Loading