@@ -141,6 +141,18 @@ Each global variable definition is of the following form:
141
141
AvailabilityMsg: ""
142
142
143
143
*/
144
+ namespace llvm {
145
+
146
+ namespace yaml {
147
+ template <> struct ScalarEnumerationTraits <SwiftSafetyKind> {
148
+ static void enumeration (IO &IO, SwiftSafetyKind &SK) {
149
+ IO.enumCase (SK, " unspecified" , SwiftSafetyKind::Unspecified);
150
+ IO.enumCase (SK, " safe" , SwiftSafetyKind::Safe);
151
+ IO.enumCase (SK, " unsafe" , SwiftSafetyKind::Unsafe);
152
+ }
153
+ };
154
+ } // namespace yaml
155
+ } // namespace llvm
144
156
145
157
namespace {
146
158
enum class APIAvailability {
@@ -322,6 +334,7 @@ struct Method {
322
334
/* TO_UPSTREAM(BoundsSafety) ON */
323
335
std::optional<BoundsSafetyNotes> ReturnBoundsSafety;
324
336
/* TO_UPSTREAM(BoundsSafety) OFF */
337
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
325
338
};
326
339
327
340
typedef std::vector<Method> MethodsSeq;
@@ -361,6 +374,7 @@ template <> struct MappingTraits<Method> {
361
374
/* TO_UPSTREAM(BoundsSafety) ON */
362
375
IO.mapOptional (" BoundsSafety" , M.ReturnBoundsSafety );
363
376
/* TO_UPSTREAM(BoundsSafety) OFF */
377
+ IO.mapOptional (" SwiftSafety" , M.SafetyKind , SwiftSafetyKind::None);
364
378
}
365
379
};
366
380
} // namespace yaml
@@ -376,6 +390,7 @@ struct Property {
376
390
StringRef SwiftName;
377
391
std::optional<bool > SwiftImportAsAccessors;
378
392
StringRef Type;
393
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
379
394
};
380
395
381
396
typedef std::vector<Property> PropertiesSeq;
@@ -397,6 +412,7 @@ template <> struct MappingTraits<Property> {
397
412
IO.mapOptional (" SwiftName" , P.SwiftName , StringRef (" " ));
398
413
IO.mapOptional (" SwiftImportAsAccessors" , P.SwiftImportAsAccessors );
399
414
IO.mapOptional (" Type" , P.Type , StringRef (" " ));
415
+ IO.mapOptional (" SwiftSafety" , P.SafetyKind , SwiftSafetyKind::None);
400
416
}
401
417
};
402
418
} // namespace yaml
@@ -416,6 +432,7 @@ struct Class {
416
432
std::optional<std::string> SwiftConformance;
417
433
MethodsSeq Methods;
418
434
PropertiesSeq Properties;
435
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
419
436
};
420
437
421
438
typedef std::vector<Class> ClassesSeq;
@@ -441,6 +458,7 @@ template <> struct MappingTraits<Class> {
441
458
IO.mapOptional (" SwiftConformsTo" , C.SwiftConformance );
442
459
IO.mapOptional (" Methods" , C.Methods );
443
460
IO.mapOptional (" Properties" , C.Properties );
461
+ IO.mapOptional (" SwiftSafety" , C.SafetyKind , SwiftSafetyKind::None);
444
462
}
445
463
};
446
464
} // namespace yaml
@@ -462,6 +480,7 @@ struct Function {
462
480
/* TO_UPSTREAM(BoundsSafety) ON */
463
481
std::optional<BoundsSafetyNotes> ReturnBoundsSafety;
464
482
/* TO_UPSTREAM(BoundsSafety) OFF */
483
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
465
484
};
466
485
467
486
typedef std::vector<Function> FunctionsSeq;
@@ -489,6 +508,7 @@ template <> struct MappingTraits<Function> {
489
508
/* TO_UPSTREAM(BoundsSafety) ON */
490
509
IO.mapOptional (" BoundsSafety" , F.ReturnBoundsSafety );
491
510
/* TO_UPSTREAM(BoundsSafety) OFF */
511
+ IO.mapOptional (" SwiftSafety" , F.SafetyKind , SwiftSafetyKind::None);
492
512
}
493
513
};
494
514
} // namespace yaml
@@ -502,6 +522,7 @@ struct GlobalVariable {
502
522
std::optional<bool > SwiftPrivate;
503
523
StringRef SwiftName;
504
524
StringRef Type;
525
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
505
526
};
506
527
507
528
typedef std::vector<GlobalVariable> GlobalVariablesSeq;
@@ -521,6 +542,7 @@ template <> struct MappingTraits<GlobalVariable> {
521
542
IO.mapOptional (" SwiftPrivate" , GV.SwiftPrivate );
522
543
IO.mapOptional (" SwiftName" , GV.SwiftName , StringRef (" " ));
523
544
IO.mapOptional (" Type" , GV.Type , StringRef (" " ));
545
+ IO.mapOptional (" SwiftSafety" , GV.SafetyKind , SwiftSafetyKind::None);
524
546
}
525
547
};
526
548
} // namespace yaml
@@ -532,6 +554,7 @@ struct EnumConstant {
532
554
AvailabilityItem Availability;
533
555
std::optional<bool > SwiftPrivate;
534
556
StringRef SwiftName;
557
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
535
558
};
536
559
537
560
typedef std::vector<EnumConstant> EnumConstantsSeq;
@@ -549,6 +572,7 @@ template <> struct MappingTraits<EnumConstant> {
549
572
IO.mapOptional (" AvailabilityMsg" , EC.Availability .Msg , StringRef (" " ));
550
573
IO.mapOptional (" SwiftPrivate" , EC.SwiftPrivate );
551
574
IO.mapOptional (" SwiftName" , EC.SwiftName , StringRef (" " ));
575
+ IO.mapOptional (" SwiftSafety" , EC.SafetyKind , SwiftSafetyKind::None);
552
576
}
553
577
};
554
578
} // namespace yaml
@@ -592,6 +616,7 @@ struct Field {
592
616
std::optional<bool > SwiftPrivate;
593
617
StringRef SwiftName;
594
618
StringRef Type;
619
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
595
620
};
596
621
597
622
typedef std::vector<Field> FieldsSeq;
@@ -611,6 +636,7 @@ template <> struct MappingTraits<Field> {
611
636
IO.mapOptional (" SwiftPrivate" , F.SwiftPrivate );
612
637
IO.mapOptional (" SwiftName" , F.SwiftName , StringRef (" " ));
613
638
IO.mapOptional (" Type" , F.Type , StringRef (" " ));
639
+ IO.mapOptional (" SwiftSafety" , F.SafetyKind , SwiftSafetyKind::None);
614
640
}
615
641
};
616
642
} // namespace yaml
@@ -637,6 +663,7 @@ struct Tag {
637
663
std::optional<EnumConvenienceAliasKind> EnumConvenienceKind;
638
664
std::optional<bool > SwiftCopyable;
639
665
std::optional<bool > SwiftEscapable;
666
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
640
667
FunctionsSeq Methods;
641
668
FieldsSeq Fields;
642
669
@@ -681,6 +708,7 @@ template <> struct MappingTraits<Tag> {
681
708
IO.mapOptional (" Methods" , T.Methods );
682
709
IO.mapOptional (" Fields" , T.Fields );
683
710
IO.mapOptional (" Tags" , T.Tags );
711
+ IO.mapOptional (" SwiftSafety" , T.SafetyKind , SwiftSafetyKind::None);
684
712
}
685
713
};
686
714
} // namespace yaml
@@ -696,6 +724,7 @@ struct Typedef {
696
724
std::optional<StringRef> NSErrorDomain;
697
725
std::optional<SwiftNewTypeKind> SwiftType;
698
726
std::optional<std::string> SwiftConformance;
727
+ const SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
699
728
};
700
729
701
730
typedef std::vector<Typedef> TypedefsSeq;
@@ -768,6 +797,7 @@ struct Namespace {
768
797
StringRef SwiftName;
769
798
std::optional<bool > SwiftPrivate;
770
799
TopLevelItems Items;
800
+ const SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
771
801
};
772
802
} // namespace
773
803
@@ -972,6 +1002,8 @@ class YAMLConverter {
972
1002
StringRef APIName) {
973
1003
convertAvailability (Common.Availability , Info, APIName);
974
1004
Info.setSwiftPrivate (Common.SwiftPrivate );
1005
+ if (Common.SafetyKind != SwiftSafetyKind::None)
1006
+ Info.setSwiftSafety (Common.SafetyKind );
975
1007
Info.SwiftName = std::string (Common.SwiftName );
976
1008
}
977
1009
@@ -1131,6 +1163,8 @@ class YAMLConverter {
1131
1163
void convertFunction (const Function &Function, FuncOrMethodInfo &FI) {
1132
1164
convertAvailability (Function.Availability , FI, Function.Name );
1133
1165
FI.setSwiftPrivate (Function.SwiftPrivate );
1166
+ if (Function.SafetyKind != SwiftSafetyKind::None)
1167
+ FI.setSwiftSafety (Function.SafetyKind );
1134
1168
FI.SwiftName = std::string (Function.SwiftName );
1135
1169
/* TO_UPSTREAM(BoundsSafety) ON */
1136
1170
if (Function.ReturnBoundsSafety ) {
0 commit comments