1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
//===--- Bridging/TypeAttributeBridging.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/Attr.h"
#include "swift/AST/Identifier.h"
#include "swift/Basic/Assertions.h"
using namespace swift;
//===----------------------------------------------------------------------===//
// MARK: TypeAttributes
//===----------------------------------------------------------------------===//
// Define `.asTypeAttr` on each BridgedXXXTypeAttr type.
#define SIMPLE_TYPE_ATTR(...)
#define TYPE_ATTR(SPELLING, CLASS) \
SWIFT_NAME("getter:Bridged" #CLASS "TypeAttr.asTypeAttribute(self:)") \
BridgedTypeAttribute Bridged##CLASS##TypeAttr_asTypeAttribute( \
Bridged##CLASS##TypeAttr attr) { \
return attr.unbridged(); \
}
#include "swift/AST/TypeAttr.def"
BridgedTypeAttrKind BridgedTypeAttrKind_fromString(BridgedStringRef cStr) {
auto optKind = TypeAttribute::getAttrKindFromString(cStr.unbridged());
if (!optKind)
return BridgedTypeAttrKindNone;
switch (*optKind) {
#define TYPE_ATTR(_, CLASS) \
case TypeAttrKind::CLASS: \
return BridgedTypeAttrKind##CLASS;
#include "swift/AST/TypeAttr.def"
}
}
static std::optional<TypeAttrKind> unbridged(BridgedTypeAttrKind kind) {
switch (kind) {
#define TYPE_ATTR(_, CLASS) \
case BridgedTypeAttrKind##CLASS: \
return TypeAttrKind::CLASS;
#include "swift/AST/TypeAttr.def"
case BridgedTypeAttrKindNone:
return std::nullopt;
}
llvm_unreachable("unhandled enum value");
}
BridgedTypeAttribute BridgedTypeAttribute_createSimple(
BridgedASTContext cContext, BridgedTypeAttrKind cKind,
BridgedSourceLoc cAtLoc, BridgedSourceLoc cNameLoc) {
auto optKind = unbridged(cKind);
assert(optKind && "creating attribute of invalid kind?");
return TypeAttribute::createSimple(cContext.unbridged(), *optKind,
cAtLoc.unbridged(), cNameLoc.unbridged());
}
BridgedConventionTypeAttr BridgedConventionTypeAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceLoc cKwLoc, BridgedSourceRange cParens, BridgedStringRef cName,
BridgedSourceLoc cNameLoc, BridgedDeclNameRef cWitnessMethodProtocol,
BridgedStringRef cClangType, BridgedSourceLoc cClangTypeLoc) {
return new (cContext.unbridged()) ConventionTypeAttr(
cAtLoc.unbridged(), cKwLoc.unbridged(), cParens.unbridged(),
{cName.unbridged(), cNameLoc.unbridged()},
cWitnessMethodProtocol.unbridged(),
{cClangType.unbridged(), cClangTypeLoc.unbridged()});
}
BridgedDifferentiableTypeAttr BridgedDifferentiableTypeAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceLoc cNameLoc, BridgedSourceRange cParensRange,
BridgedDifferentiabilityKind cKind, BridgedSourceLoc cKindLoc) {
return new (cContext.unbridged()) DifferentiableTypeAttr(
cAtLoc.unbridged(), cNameLoc.unbridged(), cParensRange.unbridged(),
{unbridged(cKind), cKindLoc.unbridged()});
}
BridgedIsolatedTypeAttr BridgedIsolatedTypeAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceLoc cNameLoc, BridgedSourceRange cParensRange,
BridgedIsolatedTypeAttrIsolationKind cIsolation,
BridgedSourceLoc cIsolationLoc) {
auto isolationKind = [=] {
switch (cIsolation) {
case BridgedIsolatedTypeAttrIsolationKind_DynamicIsolation:
return IsolatedTypeAttr::IsolationKind::Dynamic;
}
llvm_unreachable("bad kind");
}();
return new (cContext.unbridged()) IsolatedTypeAttr(
cAtLoc.unbridged(), cNameLoc.unbridged(), cParensRange.unbridged(),
{isolationKind, cIsolationLoc.unbridged()});
}
BridgedOpaqueReturnTypeOfTypeAttr
BridgedOpaqueReturnTypeOfTypeAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceLoc cKwLoc, BridgedSourceRange cParens,
BridgedStringRef cMangled, BridgedSourceLoc cMangledLoc, size_t index,
BridgedSourceLoc cIndexLoc) {
return new (cContext.unbridged()) OpaqueReturnTypeOfTypeAttr(
cAtLoc.unbridged(), cKwLoc.unbridged(), cParens.unbridged(),
{cMangled.unbridged(), cMangledLoc.unbridged()},
{static_cast<unsigned int>(index), cIndexLoc.unbridged()});
}
|