//===--- Bridging/DeclAttributeBridging.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/AutoDiff.h" #include "swift/AST/Expr.h" #include "swift/AST/Identifier.h" #include "swift/Basic/Assertions.h" using namespace swift; //===----------------------------------------------------------------------===// // MARK: AutoDiff //===----------------------------------------------------------------------===// DifferentiabilityKind unbridged(BridgedDifferentiabilityKind cKind) { switch (cKind) { case BridgedDifferentiabilityKindNonDifferentiable: return DifferentiabilityKind::NonDifferentiable; case BridgedDifferentiabilityKindForward: return DifferentiabilityKind::Forward; case BridgedDifferentiabilityKindReverse: return DifferentiabilityKind::Reverse; case BridgedDifferentiabilityKindNormal: return DifferentiabilityKind::Normal; case BridgedDifferentiabilityKindLinear: return DifferentiabilityKind::Linear; } llvm_unreachable("unhandled enum value"); } ParsedAutoDiffParameter BridgedParsedAutoDiffParameter::unbridged() const { switch (kind) { case Kind::Named: return ParsedAutoDiffParameter::getNamedParameter(loc.unbridged(), value.name.unbridged()); case Kind::Ordered: return ParsedAutoDiffParameter::getOrderedParameter(loc.unbridged(), value.index); case Kind::Self: return ParsedAutoDiffParameter::getSelfParameter(loc.unbridged()); } llvm_unreachable("unhandled enum value"); } //===----------------------------------------------------------------------===// // MARK: DeclAttributes //===----------------------------------------------------------------------===// // Define `.asDeclAttribute` on each BridgedXXXAttr type. #define SIMPLE_DECL_ATTR(...) #define DECL_ATTR(_, CLASS, ...) \ BridgedDeclAttribute Bridged##CLASS##Attr_asDeclAttribute( \ Bridged##CLASS##Attr attr) { \ return static_cast(attr.unbridged()); \ } #include "swift/AST/DeclAttr.def" BridgedDeclAttrKind BridgedDeclAttrKind_fromString(BridgedStringRef cStr) { auto optKind = DeclAttribute::getAttrKindFromString(cStr.unbridged()); if (!optKind) return BridgedDeclAttrKindNone; switch (*optKind) { #define DECL_ATTR(_, CLASS, ...) \ case DeclAttrKind::CLASS: \ return BridgedDeclAttrKind##CLASS; #include "swift/AST/DeclAttr.def" } } std::optional unbridged(BridgedDeclAttrKind kind) { switch (kind) { #define DECL_ATTR(_, CLASS, ...) \ case BridgedDeclAttrKind##CLASS: \ return DeclAttrKind::CLASS; #include "swift/AST/DeclAttr.def" case BridgedDeclAttrKindNone: return std::nullopt; } llvm_unreachable("unhandled enum value"); } BridgedDeclAttribute BridgedDeclAttribute_createSimple( BridgedASTContext cContext, BridgedDeclAttrKind cKind, BridgedSourceLoc cAtLoc, BridgedSourceLoc cAttrLoc) { auto optKind = unbridged(cKind); assert(optKind && "creating attribute of invalid kind?"); return DeclAttribute::createSimple(cContext.unbridged(), *optKind, cAtLoc.unbridged(), cAttrLoc.unbridged()); } bool BridgedDeclAttribute_shouldBeRejectedByParser(BridgedDeclAttrKind cKind) { auto optKind = unbridged(cKind); if (!optKind) return false; return DeclAttribute::shouldBeRejectedByParser(*optKind); } bool BridgedDeclAttribute_isDeclModifier(BridgedDeclAttrKind cKind) { auto optKind = unbridged(cKind); if (!optKind) return false; return DeclAttribute::isDeclModifier(*optKind); } void BridgedDeclAttributes_add(BridgedDeclAttributes *cAttrs, BridgedDeclAttribute cAdd) { auto attrs = cAttrs->unbridged(); attrs.add(cAdd.unbridged()); *cAttrs = attrs; } static AvailableAttr::Kind unbridge(BridgedAvailableAttrKind value) { switch (value) { case BridgedAvailableAttrKindDefault: return AvailableAttr::Kind::Default; case BridgedAvailableAttrKindDeprecated: return AvailableAttr::Kind::Deprecated; case BridgedAvailableAttrKindUnavailable: return AvailableAttr::Kind::Unavailable; case BridgedAvailableAttrKindNoAsync: return AvailableAttr::Kind::NoAsync; } llvm_unreachable("unhandled enum value"); } BridgedAvailableAttr BridgedAvailableAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedIdentifier cDomainIdentifier, BridgedSourceLoc cDomainLoc, BridgedAvailableAttrKind cKind, BridgedStringRef cMessage, BridgedStringRef cRenamed, BridgedVersionTuple cIntroduced, BridgedSourceRange cIntroducedRange, BridgedVersionTuple cDeprecated, BridgedSourceRange cDeprecatedRange, BridgedVersionTuple cObsoleted, BridgedSourceRange cObsoletedRange, bool isSPI) { return new (cContext.unbridged()) AvailableAttr(cAtLoc.unbridged(), cRange.unbridged(), cDomainIdentifier.unbridged(), cDomainLoc.unbridged(), unbridge(cKind), cMessage.unbridged(), cRenamed.unbridged(), cIntroduced.unbridged(), cIntroducedRange.unbridged(), cDeprecated.unbridged(), cDeprecatedRange.unbridged(), cObsoleted.unbridged(), cObsoletedRange.unbridged(), /*Implicit=*/false, /*IsSPI=*/isSPI); } BridgedAvailableAttr BridgedAvailableAttr_createUnavailableInEmbedded(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange) { return AvailableAttr::createUnavailableInEmbedded( cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged()); } void BridgedAvailableAttr_setIsGroupMember(BridgedAvailableAttr cAttr) { cAttr.unbridged()->setIsGroupMember(); } void BridgedAvailableAttr_setIsGroupedWithWildcard(BridgedAvailableAttr cAttr) { cAttr.unbridged()->setIsGroupedWithWildcard(); } void BridgedAvailableAttr_setIsGroupTerminator(BridgedAvailableAttr cAttr) { cAttr.unbridged()->setIsGroupTerminator(); } static std::optional unbridge(BridgedAccessLevel level) { switch (level) { case BridgedAccessLevelPrivate: return AccessLevel::Private; case BridgedAccessLevelFilePrivate: return AccessLevel::FilePrivate; case BridgedAccessLevelInternal: return AccessLevel::Internal; case BridgedAccessLevelPackage: return AccessLevel::Package; case BridgedAccessLevelPublic: return AccessLevel::Public; case BridgedAccessLevelOpen: return AccessLevel::Open; case BridgedAccessLevelNone: return std::nullopt; } llvm_unreachable("unhandled BridgedAccessLevel"); } BridgedABIAttr BridgedABIAttr_createParsed(BridgedASTContext cContext, BridgedSourceLoc atLoc, BridgedSourceRange range, BridgedNullableDecl abiDecl) { return new (cContext.unbridged()) ABIAttr(abiDecl.unbridged(), atLoc.unbridged(), range.unbridged(), /*isImplicit=*/false); } BridgedAccessControlAttr BridgedAccessControlAttr_createParsed(BridgedASTContext cContext, BridgedSourceRange cRange, BridgedAccessLevel cAccessLevel) { return new (cContext.unbridged()) AccessControlAttr( /*atLoc=*/{}, cRange.unbridged(), unbridge(cAccessLevel).value()); } BridgedAlignmentAttr BridgedAlignmentAttr_createParsed(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, size_t cValue) { return new (cContext.unbridged()) AlignmentAttr( cValue, cAtLoc.unbridged(), cRange.unbridged(), /*Implicit=*/false); } BridgedAllowFeatureSuppressionAttr BridgedAllowFeatureSuppressionAttr_createParsed(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, bool inverted, BridgedArrayRef cFeatures) { SmallVector features; for (auto elem : cFeatures.unbridged()) features.push_back(elem.unbridged()); return AllowFeatureSuppressionAttr::create( cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), /*implicit*/ false, inverted, features); } BridgedBackDeployedAttr BridgedBackDeployedAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedPlatformKind cPlatform, BridgedVersionTuple cVersion) { return new (cContext.unbridged()) BackDeployedAttr( cAtLoc.unbridged(), cRange.unbridged(), unbridge(cPlatform), cVersion.unbridged(), /*Implicit=*/false); } BridgedCDeclAttr BridgedCDeclAttr_createParsed(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedStringRef cName) { return new (cContext.unbridged()) CDeclAttr(cName.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), /*Implicit=*/false, /*Underscored*/true); } BridgedCustomAttr BridgedCustomAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedTypeRepr cType, BridgedNullableCustomAttributeInitializer cInitContext, BridgedNullableArgumentList cArgumentList) { ASTContext &context = cContext.unbridged(); return CustomAttr::create( context, cAtLoc.unbridged(), new (context) TypeExpr(cType.unbridged()), cInitContext.unbridged(), cArgumentList.unbridged()); } BridgedDerivativeAttr BridgedDerivativeAttr_createParsedImpl( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedNullableTypeRepr cBaseType, BridgedDeclNameRef cOriginalName, BridgedDeclNameLoc cOriginalNameLoc, std::optional cAccessorKind, BridgedArrayRef cParams) { std::optional accessorKind; if (cAccessorKind) accessorKind = unbridged(*cAccessorKind); SmallVector params; for (auto &elem : cParams.unbridged()) params.push_back(elem.unbridged()); return DerivativeAttr::create(cContext.unbridged(), /*implicit=*/false, cAtLoc.unbridged(), cRange.unbridged(), cBaseType.unbridged(), DeclNameRefWithLoc{cOriginalName.unbridged(), cOriginalNameLoc.unbridged(), accessorKind}, params); } BridgedDerivativeAttr BridgedDerivativeAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedNullableTypeRepr cBaseType, BridgedDeclNameRef cOriginalName, BridgedDeclNameLoc cOriginalNameLoc, BridgedAccessorKind cAccessorKind, BridgedArrayRef cParams) { return BridgedDerivativeAttr_createParsedImpl( cContext, cAtLoc, cRange, cBaseType, cOriginalName, cOriginalNameLoc, cAccessorKind, cParams); } BridgedDerivativeAttr BridgedDerivativeAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedNullableTypeRepr cBaseType, BridgedDeclNameRef cOriginalName, BridgedDeclNameLoc cOriginalNameLoc, BridgedArrayRef cParams) { return BridgedDerivativeAttr_createParsedImpl( cContext, cAtLoc, cRange, cBaseType, cOriginalName, cOriginalNameLoc, /*cAccessorKind=*/std::nullopt, cParams); } BridgedDifferentiableAttr BridgedDifferentiableAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedDifferentiabilityKind cKind, BridgedArrayRef cParams, BridgedNullableTrailingWhereClause cGenericWhereClause) { SmallVector params; for (auto &elem : cParams.unbridged()) params.push_back(elem.unbridged()); return DifferentiableAttr::create(cContext.unbridged(), /*implicit=*/false, cAtLoc.unbridged(), cRange.unbridged(), unbridged(cKind), params, cGenericWhereClause.unbridged()); } BridgedDynamicReplacementAttr BridgedDynamicReplacementAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceLoc cAttrNameLoc, BridgedSourceLoc cLParenLoc, BridgedDeclNameRef cReplacedFunction, BridgedSourceLoc cRParenLoc) { return DynamicReplacementAttr::create( cContext.unbridged(), cAtLoc.unbridged(), cAttrNameLoc.unbridged(), cLParenLoc.unbridged(), cReplacedFunction.unbridged(), cRParenLoc.unbridged()); } BridgedDocumentationAttr BridgedDocumentationAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedStringRef cMetadata, BridgedAccessLevel cAccessLevel) { return new (cContext.unbridged()) DocumentationAttr( cAtLoc.unbridged(), cRange.unbridged(), cMetadata.unbridged(), unbridge(cAccessLevel), /*implicit=*/false); } static EffectsKind unbridged(BridgedEffectsKind kind) { switch (kind) { case BridgedEffectsKindReadNone: return EffectsKind::ReadNone; case BridgedEffectsKindReadOnly: return EffectsKind::ReadOnly; case BridgedEffectsKindReleaseNone: return EffectsKind::ReleaseNone; case BridgedEffectsKindReadWrite: return EffectsKind::ReadWrite; case BridgedEffectsKindUnspecified: return EffectsKind::Unspecified; case BridgedEffectsKindCustom: return EffectsKind::Custom; } llvm_unreachable("unhandled kind"); } BridgedEffectsAttr BridgedEffectsAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedEffectsKind cEffectKind) { return new (cContext.unbridged()) EffectsAttr( cAtLoc.unbridged(), cRange.unbridged(), unbridged(cEffectKind)); } BridgedEffectsAttr BridgedEffectsAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedStringRef cCustomString, BridgedSourceLoc cCustomStringLoc) { return new (cContext.unbridged()) EffectsAttr(cAtLoc.unbridged(), cRange.unbridged(), cCustomString.unbridged(), cCustomStringLoc.unbridged()); } static ExclusivityAttr::Mode unbridged(BridgedExclusivityAttrMode mode) { switch (mode) { case BridgedExclusivityAttrModeChecked: return ExclusivityAttr::Checked; case BridgedExclusivityAttrModeUnchecked: return ExclusivityAttr::Unchecked; } llvm_unreachable("unhandled enum value"); } BridgedExclusivityAttr BridgedExclusivityAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedExclusivityAttrMode cMode) { return new (cContext.unbridged()) ExclusivityAttr(cAtLoc.unbridged(), cRange.unbridged(), unbridged(cMode)); } static ExposureKind unbridged(BridgedExposureKind kind) { switch (kind) { case BridgedExposureKindCxx: return ExposureKind::Cxx; case BridgedExposureKindWasm: return ExposureKind::Wasm; } llvm_unreachable("unhandled enum value"); } BridgedExposeAttr BridgedExposeAttr_createParsed(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedStringRef cName, BridgedExposureKind cKind) { return new (cContext.unbridged()) ExposeAttr(cName.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), unbridged(cKind), /*Implicit=*/false); } static ExternKind unbridged(BridgedExternKind kind) { switch (kind) { case BridgedExternKindC: return ExternKind::C; case BridgedExternKindWasm: return ExternKind::Wasm; } llvm_unreachable("unhandled enum value"); } BridgedExternAttr BridgedExternAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedSourceLoc cLParenLoc, BridgedSourceLoc cRParenLoc, BridgedExternKind cKind, BridgedStringRef cModuleName, BridgedStringRef cName) { std::optional moduleName = cModuleName.unbridged(); if (moduleName->empty()) moduleName = std::nullopt; std::optional name = cName.unbridged(); if (name->empty()) name = std::nullopt; return new (cContext.unbridged()) ExternAttr(moduleName, name, cAtLoc.unbridged(), cLParenLoc.unbridged(), cRParenLoc.unbridged(), cRange.unbridged(), unbridged(cKind), /*Implicit=*/false); } BridgedImplementsAttr BridgedImplementsAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedTypeRepr cProtocolType, BridgedDeclNameRef cMemberName, BridgedDeclNameLoc cMemberNameLoc) { return ImplementsAttr::create(cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), cProtocolType.unbridged(), cMemberName.unbridged().getFullName(), cMemberNameLoc.unbridged()); } static InlineKind unbridged(BridgedInlineKind kind) { switch (kind) { case BridgedInlineKindNever: return InlineKind::Never; case BridgedInlineKindAlways: return InlineKind::Always; } llvm_unreachable("unhandled enum value"); } BridgedInlineAttr BridgedInlineAttr_createParsed(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedInlineKind cKind) { return new (cContext.unbridged()) InlineAttr(cAtLoc.unbridged(), cRange.unbridged(), unbridged(cKind)); } static swift::ParsedLifetimeDependenceKind unbridged(BridgedParsedLifetimeDependenceKind kind) { switch (kind) { case BridgedParsedLifetimeDependenceKindDefault: return swift::ParsedLifetimeDependenceKind::Default; case BridgedParsedLifetimeDependenceKindBorrow: return swift::ParsedLifetimeDependenceKind::Borrow; case BridgedParsedLifetimeDependenceKindInherit: return swift::ParsedLifetimeDependenceKind::Inherit; case BridgedParsedLifetimeDependenceKindInout: return swift::ParsedLifetimeDependenceKind::Inout; } llvm_unreachable("unhandled enum value"); } swift::LifetimeDescriptor BridgedLifetimeDescriptor::unbridged() { switch (kind) { case DescriptorKind::Named: return LifetimeDescriptor::forNamed( value.name.unbridged(), ::unbridged(dependenceKind), loc.unbridged()); case DescriptorKind::Ordered: return LifetimeDescriptor::forOrdered( value.index, ::unbridged(dependenceKind), loc.unbridged()); case DescriptorKind::Self: return LifetimeDescriptor::forSelf(::unbridged(dependenceKind), loc.unbridged()); } llvm_unreachable("unhandled enum value"); } static BridgedLifetimeEntry BridgedLifetimeEntry_createParsedImpl( BridgedASTContext cContext, BridgedSourceRange cRange, BridgedArrayRef cSources, std::optional cTarget) { SmallVector sources; for (auto cSource : cSources.unbridged()) sources.push_back(cSource.unbridged()); std::optional target; if (cTarget) target = cTarget->unbridged(); return LifetimeEntry::create(cContext.unbridged(), cRange.Start.unbridged(), cRange.End.unbridged(), sources, target); } BridgedLifetimeEntry BridgedLifetimeEntry_createParsed(BridgedASTContext cContext, BridgedSourceRange cRange, BridgedArrayRef cSources) { return BridgedLifetimeEntry_createParsedImpl(cContext, cRange, cSources, std::nullopt); } BridgedLifetimeEntry BridgedLifetimeEntry_createParsed( BridgedASTContext cContext, BridgedSourceRange cRange, BridgedArrayRef cSources, BridgedLifetimeDescriptor cTarget) { return BridgedLifetimeEntry_createParsedImpl(cContext, cRange, cSources, cTarget); } BridgedLifetimeAttr BridgedLifetimeAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedLifetimeEntry cEntry) { return LifetimeAttr::create(cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), /*implicit=*/false, cEntry.unbridged()); } BridgedMacroRole BridgedMacroRole_fromString(BridgedStringRef str) { // Match the role string to the known set of roles. auto role = llvm::StringSwitch>(str.unbridged()) #define MACRO_ROLE(Name, Description) .Case(Description, BridgedMacroRole##Name) #include "swift/Basic/MacroRoles.def" .Default(std::nullopt); return role.has_value() ? *role : BridgedMacroRoleNone; } MacroSyntax unbridge(BridgedMacroSyntax cSyntax) { switch (cSyntax) { case BridgedMacroSyntaxAttached: return MacroSyntax::Attached; case BridgedMacroSyntaxFreestanding: return MacroSyntax::Freestanding; } } BridgedMacroRoleAttr BridgedMacroRoleAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedMacroSyntax cSyntax, BridgedSourceLoc cLParenLoc, BridgedMacroRole cRole, BridgedArrayRef cNames, BridgedArrayRef cConformances, BridgedSourceLoc cRParenLoc) { SmallVector names; for (auto &n : cNames.unbridged()) names.push_back(n.unbridged()); SmallVector conformances; for (auto &t : cConformances.unbridged()) conformances.push_back(t.unbridged()); return MacroRoleAttr::create( cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), unbridge(cSyntax), cLParenLoc.unbridged(), unbridge(cRole), names, conformances, cRParenLoc.unbridged(), /*implicit=*/false); } BridgedOriginallyDefinedInAttr BridgedOriginallyDefinedInAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedStringRef cModuleName, BridgedPlatformKind cPlatform, BridgedVersionTuple cVersion) { return new (cContext.unbridged()) OriginallyDefinedInAttr( cAtLoc.unbridged(), cRange.unbridged(), cModuleName.unbridged(), unbridge(cPlatform), cVersion.unbridged(), /*Implicit=*/false); } BridgedStorageRestrictionsAttr BridgedStorageRestrictionsAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedArrayRef cInitializes, BridgedArrayRef cAccesses) { ASTContext &context = cContext.unbridged(); ArrayRef initializes = cContext.unbridged().AllocateTransform( cInitializes.unbridged(), [](auto &e) { return e.unbridged(); }); ArrayRef accesses = cContext.unbridged().AllocateTransform( cAccesses.unbridged(), [](auto &e) { return e.unbridged(); }); return StorageRestrictionsAttr::create( context, cAtLoc.unbridged(), cRange.unbridged(), initializes, accesses); } BridgedSwiftNativeObjCRuntimeBaseAttr BridgedSwiftNativeObjCRuntimeBaseAttr_createParsed(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedIdentifier cName) { return new (cContext.unbridged()) SwiftNativeObjCRuntimeBaseAttr(cName.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), /*Implicit=*/false); } static NonSendableKind unbridged(BridgedNonSendableKind kind) { switch (kind) { case BridgedNonSendableKindSpecific: return NonSendableKind::Specific; case BridgedNonSendableKindAssumed: return NonSendableKind::Assumed; } llvm_unreachable("unhandled enum value"); } BridgedNonSendableAttr BridgedNonSendableAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedNonSendableKind cKind) { return new (cContext.unbridged()) NonSendableAttr(cAtLoc.unbridged(), cRange.unbridged(), unbridged(cKind)); } static NonIsolatedModifier unbridged(BridgedNonIsolatedModifier modifier) { switch (modifier) { case BridgedNonIsolatedModifierNone: return NonIsolatedModifier::None; case BridgedNonIsolatedModifierUnsafe: return NonIsolatedModifier::Unsafe; case BridgedNonIsolatedModifierNonSending: return NonIsolatedModifier::NonSending; } llvm_unreachable("unhandled enum value"); } BridgedNonisolatedAttr BridgedNonisolatedAttr_createParsed(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedNonIsolatedModifier modifier) { return new (cContext.unbridged()) NonisolatedAttr( cAtLoc.unbridged(), cRange.unbridged(), unbridged(modifier), /*implicit=*/false); } static InheritActorContextModifier unbridged(BridgedInheritActorContextModifier modifier) { switch (modifier) { case BridgedInheritActorContextModifierNone: return InheritActorContextModifier::None; case BridgedInheritActorContextModifierAlways: return InheritActorContextModifier::Always; } llvm_unreachable("unhandled enum value"); } BridgedInheritActorContextAttr BridgedInheritActorContextAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedInheritActorContextModifier modifier) { return new (cContext.unbridged()) InheritActorContextAttr( cAtLoc.unbridged(), cRange.unbridged(), unbridged(modifier), /*implicit=*/false); } BridgedObjCAttr BridgedObjCAttr_createParsedUnnamed(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceLoc cAttrNameLoc) { return ObjCAttr::createUnnamed(cContext.unbridged(), cAtLoc.unbridged(), cAttrNameLoc.unbridged()); } BridgedObjCAttr BridgedObjCAttr_createParsedNullary( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceLoc cAttrNameLoc, BridgedSourceLoc cLParenLoc, BridgedSourceLoc cNameLoc, BridgedIdentifier cName, BridgedSourceLoc cRParenLoc) { return ObjCAttr::createNullary(cContext.unbridged(), cAtLoc.unbridged(), cAttrNameLoc.unbridged(), cLParenLoc.unbridged(), cNameLoc.unbridged(), cName.unbridged(), cRParenLoc.unbridged()); } BridgedObjCAttr BridgedObjCAttr_createParsedSelector( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceLoc cAttrNameLoc, BridgedSourceLoc cLParenLoc, BridgedArrayRef cNameLocs, BridgedArrayRef cNames, BridgedSourceLoc cRParenLoc) { SmallVector nameLocs; for (auto elem : cNameLocs.unbridged()) nameLocs.push_back(elem.unbridged()); SmallVector names; for (auto elem : cNames.unbridged()) names.push_back(elem.unbridged()); return ObjCAttr::createSelector( cContext.unbridged(), cAtLoc.unbridged(), cAttrNameLoc.unbridged(), cLParenLoc.unbridged(), nameLocs, names, cRParenLoc.unbridged()); } BridgedObjCImplementationAttr BridgedObjCImplementationAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedIdentifier cName, bool isEarlyAdopter) { return new (cContext.unbridged()) ObjCImplementationAttr(cName.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), isEarlyAdopter); } BridgedObjCRuntimeNameAttr BridgedObjCRuntimeNameAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedIdentifier cName) { return new (cContext.unbridged()) ObjCRuntimeNameAttr(cName.unbridged().str(), cAtLoc.unbridged(), cRange.unbridged(), /*Implicit=*/false); } static OptimizationMode unbridged(BridgedOptimizationMode mode) { switch (mode) { case BridgedOptimizationModeForSpeed: return OptimizationMode::ForSpeed; case BridgedOptimizationModeForSize: return OptimizationMode::ForSize; case BridgedOptimizationModeNoOptimization: return OptimizationMode::NoOptimization; } llvm_unreachable("unhandled enum value"); } BridgedOptimizeAttr BridgedOptimizeAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedOptimizationMode cMode) { return new (cContext.unbridged()) OptimizeAttr(cAtLoc.unbridged(), cRange.unbridged(), unbridged(cMode)); } BridgedPrivateImportAttr BridgedPrivateImportAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceLoc cAttrNameLoc, BridgedSourceLoc cLParenLoc, BridgedStringRef cFileName, BridgedSourceLoc cRParenLoc) { return PrivateImportAttr::create( cContext.unbridged(), cAtLoc.unbridged(), cAttrNameLoc.unbridged(), cLParenLoc.unbridged(), cFileName.unbridged(), cRParenLoc.unbridged()); } BridgedProjectedValuePropertyAttr BridgedProjectedValuePropertyAttr_createParsed(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedIdentifier cName) { return new (cContext.unbridged()) ProjectedValuePropertyAttr(cName.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), /*Implicit=*/false); } BridgedRawDocCommentAttr BridgedRawDocCommentAttr_createParsed(BridgedASTContext cContext, BridgedCharSourceRange cRange) { return new (cContext.unbridged()) RawDocCommentAttr(cRange.unbridged()); } BridgedRawLayoutAttr BridgedStorageRestrictionsAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, size_t size, size_t alignment) { return new (cContext.unbridged()) RawLayoutAttr(size, alignment, cAtLoc.unbridged(), cRange.unbridged()); } SWIFT_NAME("BridgedRawLayoutAttr.createParsed(_:atLoc:range:like:moveAsLike:)") BridgedRawLayoutAttr BridgedStorageRestrictionsAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedTypeRepr cLikeType, bool moveAsLike) { return new (cContext.unbridged()) RawLayoutAttr(cLikeType.unbridged(), moveAsLike, cAtLoc.unbridged(), cRange.unbridged()); } SWIFT_NAME("BridgedRawLayoutAttr.createParsed(_:atLoc:range:likeArrayOf:count:" "moveAsLike:)") BridgedRawLayoutAttr BridgedStorageRestrictionsAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedTypeRepr cLikeType, BridgedTypeRepr cCountType, bool moveAsLike) { return new (cContext.unbridged()) RawLayoutAttr(cLikeType.unbridged(), cCountType.unbridged(), moveAsLike, cAtLoc.unbridged(), cRange.unbridged()); } ReferenceOwnership unbridged(BridgedReferenceOwnership kind) { switch (kind) { case BridgedReferenceOwnershipStrong: return ReferenceOwnership::Strong; case BridgedReferenceOwnershipWeak: return ReferenceOwnership::Weak; case BridgedReferenceOwnershipUnowned: return ReferenceOwnership::Unowned; case BridgedReferenceOwnershipUnmanaged: return ReferenceOwnership::Unmanaged; } llvm_unreachable("unhandled enum value"); } BridgedReferenceOwnershipAttr BridgedReferenceOwnershipAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedReferenceOwnership cKind) { return new (cContext.unbridged()) ReferenceOwnershipAttr(cRange.unbridged(), unbridged(cKind)); } BridgedSectionAttr BridgedSectionAttr_createParsed(BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedStringRef cName) { return new (cContext.unbridged()) SectionAttr(cName.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), /*Implicit=*/false); } BridgedSemanticsAttr BridgedSemanticsAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedStringRef cValue) { return new (cContext.unbridged()) SemanticsAttr(cValue.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), /*Implicit=*/false); } BridgedSetterAccessAttr BridgedSetterAccessAttr_createParsed(BridgedASTContext cContext, BridgedSourceRange cRange, BridgedAccessLevel cAccessLevel) { return new (cContext.unbridged()) SetterAccessAttr( /*atLoc=*/{}, cRange.unbridged(), unbridge(cAccessLevel).value()); } static SpecializeAttr::SpecializationKind unbridge(BridgedSpecializationKind kind) { switch (kind) { case BridgedSpecializationKindFull: return AbstractSpecializeAttr::SpecializationKind::Full; case BridgedSpecializationKindPartial: return AbstractSpecializeAttr::SpecializationKind::Partial; } llvm_unreachable("unhandled kind"); } BridgedSpecializeAttr BridgedSpecializeAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedNullableTrailingWhereClause cWhereClause, bool exported, BridgedSpecializationKind cKind, BridgedDeclNameRef cTargetFunction, BridgedArrayRef cSPIGroups, BridgedArrayRef cAvailableAttrs) { SmallVector spiGroups; for (auto bridging : cSPIGroups.unbridged()) spiGroups.push_back(bridging.unbridged()); SmallVector availableAttrs; for (auto bridging : cAvailableAttrs.unbridged()) availableAttrs.push_back(bridging.unbridged()); return SpecializeAttr::create( cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), cWhereClause.unbridged(), exported, unbridge(cKind), cTargetFunction.unbridged(), spiGroups, availableAttrs); } BridgedSpecializedAttr BridgedSpecializedAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedNullableTrailingWhereClause cWhereClause, bool exported, BridgedSpecializationKind cKind, BridgedDeclNameRef cTargetFunction, BridgedArrayRef cSPIGroups, BridgedArrayRef cAvailableAttrs) { SmallVector spiGroups; for (auto bridging : cSPIGroups.unbridged()) spiGroups.push_back(bridging.unbridged()); SmallVector availableAttrs; for (auto bridging : cAvailableAttrs.unbridged()) availableAttrs.push_back(bridging.unbridged()); return SpecializedAttr::create( cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), cWhereClause.unbridged(), exported, unbridge(cKind), cTargetFunction.unbridged(), spiGroups, availableAttrs); } BridgedSPIAccessControlAttr BridgedSPIAccessControlAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedIdentifier cSPIGroupName) { return SPIAccessControlAttr::create(cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), cSPIGroupName.unbridged()); } BridgedSILGenNameAttr BridgedSILGenNameAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedStringRef cName, bool isRaw) { return new (cContext.unbridged()) SILGenNameAttr(cName.unbridged(), isRaw, cAtLoc.unbridged(), cRange.unbridged(), /*Implicit=*/false); } BridgedTransposeAttr BridgedTransposeAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedNullableTypeRepr cBaseType, BridgedDeclNameRef cOriginalName, BridgedDeclNameLoc cOriginalNameLoc, BridgedArrayRef cParams) { SmallVector params; for (auto &elem : cParams.unbridged()) params.push_back(elem.unbridged()); return TransposeAttr::create( cContext.unbridged(), /*implicit=*/false, cAtLoc.unbridged(), cRange.unbridged(), cBaseType.unbridged(), DeclNameRefWithLoc{cOriginalName.unbridged(), cOriginalNameLoc.unbridged(), /*AccessorKind=*/std::nullopt}, params); } BridgedTypeEraserAttr BridgedTypeEraserAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedTypeExpr cTypeExpr ) { return TypeEraserAttr::create(cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), cTypeExpr.unbridged()); } BridgedUnavailableFromAsyncAttr BridgedUnavailableFromAsyncAttr_createParsed( BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedSourceRange cRange, BridgedStringRef cMessage) { return new (cContext.unbridged()) UnavailableFromAsyncAttr(cMessage.unbridged(), cAtLoc.unbridged(), cRange.unbridged(), /*implicit=*/false); }