@@ -527,6 +527,9 @@ struct Tag {
527527 std::optional<bool > SwiftPrivate;
528528 std::optional<StringRef> SwiftBridge;
529529 std::optional<StringRef> NSErrorDomain;
530+ std::optional<std::string> SwiftImportAs;
531+ std::optional<std::string> SwiftRetainOp;
532+ std::optional<std::string> SwiftReleaseOp;
530533 std::optional<EnumExtensibilityKind> EnumExtensibility;
531534 std::optional<bool > FlagEnum;
532535 std::optional<EnumConvenienceAliasKind> EnumConvenienceKind;
@@ -557,6 +560,9 @@ template <> struct MappingTraits<Tag> {
557560 IO.mapOptional (" SwiftName" , T.SwiftName , StringRef (" " ));
558561 IO.mapOptional (" SwiftBridge" , T.SwiftBridge );
559562 IO.mapOptional (" NSErrorDomain" , T.NSErrorDomain );
563+ IO.mapOptional (" SwiftImportAs" , T.SwiftImportAs );
564+ IO.mapOptional (" SwiftReleaseOp" , T.SwiftReleaseOp );
565+ IO.mapOptional (" SwiftRetainOp" , T.SwiftRetainOp );
560566 IO.mapOptional (" EnumExtensibility" , T.EnumExtensibility );
561567 IO.mapOptional (" FlagEnum" , T.FlagEnum );
562568 IO.mapOptional (" EnumKind" , T.EnumConvenienceKind );
@@ -1129,6 +1135,27 @@ namespace {
11291135 if (convertCommonType (t, tagInfo, t.Name ))
11301136 continue ;
11311137
1138+ if ((t.SwiftRetainOp .has_value () || t.SwiftReleaseOp .has_value ()) &&
1139+ !t.SwiftImportAs ) {
1140+ emitError (llvm::Twine (" should declare SwiftImportAs to use "
1141+ " SwiftRetainOp and SwiftReleaseOp (for " ) +
1142+ t.Name + " )" );
1143+ continue ;
1144+ }
1145+ if (t.SwiftReleaseOp .has_value () != t.SwiftRetainOp .has_value ()) {
1146+ emitError (llvm::Twine (" should declare both SwiftReleaseOp and "
1147+ " SwiftRetainOp (for " ) +
1148+ t.Name + " )" );
1149+ continue ;
1150+ }
1151+
1152+ if (t.SwiftImportAs )
1153+ tagInfo.SwiftImportAs = t.SwiftImportAs ;
1154+ if (t.SwiftRetainOp )
1155+ tagInfo.SwiftRetainOp = t.SwiftRetainOp ;
1156+ if (t.SwiftReleaseOp )
1157+ tagInfo.SwiftReleaseOp = t.SwiftReleaseOp ;
1158+
11321159 if (t.EnumConvenienceKind ) {
11331160 if (t.EnumExtensibility ) {
11341161 emitError (llvm::Twine (
0 commit comments