@@ -527,6 +527,9 @@ struct Tag {
527527 Optional<bool > SwiftPrivate;
528528 Optional<StringRef> SwiftBridge;
529529 Optional<StringRef> NSErrorDomain;
530+ Optional<std::string> SwiftImportAs;
531+ Optional<std::string> SwiftRetainOp;
532+ Optional<std::string> SwiftReleaseOp;
530533 Optional<EnumExtensibilityKind> EnumExtensibility;
531534 Optional<bool > FlagEnum;
532535 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 );
@@ -1130,6 +1136,27 @@ namespace {
11301136 if (convertCommonType (t, tagInfo, t.Name ))
11311137 continue ;
11321138
1139+ if ((t.SwiftRetainOp .has_value () || t.SwiftReleaseOp .has_value ()) &&
1140+ !t.SwiftImportAs ) {
1141+ emitError (llvm::Twine (" should declare SwiftImportAs to use "
1142+ " SwiftRetainOp and SwiftReleaseOp (for " ) +
1143+ t.Name + " )" );
1144+ continue ;
1145+ }
1146+ if (t.SwiftReleaseOp .has_value () != t.SwiftRetainOp .has_value ()) {
1147+ emitError (llvm::Twine (" should declare both SwiftReleaseOp and "
1148+ " SwiftRetainOp (for " ) +
1149+ t.Name + " )" );
1150+ continue ;
1151+ }
1152+
1153+ if (t.SwiftImportAs )
1154+ tagInfo.SwiftImportAs = t.SwiftImportAs ;
1155+ if (t.SwiftRetainOp )
1156+ tagInfo.SwiftRetainOp = t.SwiftRetainOp ;
1157+ if (t.SwiftReleaseOp )
1158+ tagInfo.SwiftReleaseOp = t.SwiftReleaseOp ;
1159+
11331160 if (t.EnumConvenienceKind ) {
11341161 if (t.EnumExtensibility ) {
11351162 emitError (llvm::Twine (
0 commit comments