29
29
using namespace clang ;
30
30
using namespace api_notes ;
31
31
32
+ namespace llvm {
33
+ namespace yaml {
34
+ template <> struct ScalarEnumerationTraits <SwiftSafetyKind> {
35
+ static void enumeration (IO &IO, SwiftSafetyKind &SK) {
36
+ IO.enumCase (SK, " unspecified" , SwiftSafetyKind::Unspecified);
37
+ IO.enumCase (SK, " safe" , SwiftSafetyKind::Safe);
38
+ IO.enumCase (SK, " unsafe" , SwiftSafetyKind::Unsafe);
39
+ }
40
+ };
41
+ } // namespace yaml
42
+ } // namespace llvm
43
+
32
44
namespace {
33
45
enum class APIAvailability {
34
46
Available = 0 ,
@@ -163,6 +175,7 @@ struct Method {
163
175
bool Required = false ;
164
176
StringRef ResultType;
165
177
StringRef SwiftReturnOwnership;
178
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
166
179
};
167
180
168
181
typedef std::vector<Method> MethodsSeq;
@@ -199,6 +212,7 @@ template <> struct MappingTraits<Method> {
199
212
IO.mapOptional (" ResultType" , M.ResultType , StringRef (" " ));
200
213
IO.mapOptional (" SwiftReturnOwnership" , M.SwiftReturnOwnership ,
201
214
StringRef (" " ));
215
+ IO.mapOptional (" SwiftSafety" , M.SafetyKind , SwiftSafetyKind::None);
202
216
}
203
217
};
204
218
} // namespace yaml
@@ -214,6 +228,7 @@ struct Property {
214
228
StringRef SwiftName;
215
229
std::optional<bool > SwiftImportAsAccessors;
216
230
StringRef Type;
231
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
217
232
};
218
233
219
234
typedef std::vector<Property> PropertiesSeq;
@@ -235,6 +250,7 @@ template <> struct MappingTraits<Property> {
235
250
IO.mapOptional (" SwiftName" , P.SwiftName , StringRef (" " ));
236
251
IO.mapOptional (" SwiftImportAsAccessors" , P.SwiftImportAsAccessors );
237
252
IO.mapOptional (" Type" , P.Type , StringRef (" " ));
253
+ IO.mapOptional (" SwiftSafety" , P.SafetyKind , SwiftSafetyKind::None);
238
254
}
239
255
};
240
256
} // namespace yaml
@@ -254,6 +270,7 @@ struct Class {
254
270
std::optional<std::string> SwiftConformance;
255
271
MethodsSeq Methods;
256
272
PropertiesSeq Properties;
273
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
257
274
};
258
275
259
276
typedef std::vector<Class> ClassesSeq;
@@ -279,6 +296,7 @@ template <> struct MappingTraits<Class> {
279
296
IO.mapOptional (" SwiftConformsTo" , C.SwiftConformance );
280
297
IO.mapOptional (" Methods" , C.Methods );
281
298
IO.mapOptional (" Properties" , C.Properties );
299
+ IO.mapOptional (" SwiftSafety" , C.SafetyKind , SwiftSafetyKind::None);
282
300
}
283
301
};
284
302
} // namespace yaml
@@ -297,6 +315,7 @@ struct Function {
297
315
StringRef Type;
298
316
StringRef ResultType;
299
317
StringRef SwiftReturnOwnership;
318
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
300
319
};
301
320
302
321
typedef std::vector<Function> FunctionsSeq;
@@ -321,6 +340,7 @@ template <> struct MappingTraits<Function> {
321
340
IO.mapOptional (" ResultType" , F.ResultType , StringRef (" " ));
322
341
IO.mapOptional (" SwiftReturnOwnership" , F.SwiftReturnOwnership ,
323
342
StringRef (" " ));
343
+ IO.mapOptional (" SwiftSafety" , F.SafetyKind , SwiftSafetyKind::None);
324
344
}
325
345
};
326
346
} // namespace yaml
@@ -334,6 +354,7 @@ struct GlobalVariable {
334
354
std::optional<bool > SwiftPrivate;
335
355
StringRef SwiftName;
336
356
StringRef Type;
357
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
337
358
};
338
359
339
360
typedef std::vector<GlobalVariable> GlobalVariablesSeq;
@@ -353,6 +374,7 @@ template <> struct MappingTraits<GlobalVariable> {
353
374
IO.mapOptional (" SwiftPrivate" , GV.SwiftPrivate );
354
375
IO.mapOptional (" SwiftName" , GV.SwiftName , StringRef (" " ));
355
376
IO.mapOptional (" Type" , GV.Type , StringRef (" " ));
377
+ IO.mapOptional (" SwiftSafety" , GV.SafetyKind , SwiftSafetyKind::None);
356
378
}
357
379
};
358
380
} // namespace yaml
@@ -364,6 +386,7 @@ struct EnumConstant {
364
386
AvailabilityItem Availability;
365
387
std::optional<bool > SwiftPrivate;
366
388
StringRef SwiftName;
389
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
367
390
};
368
391
369
392
typedef std::vector<EnumConstant> EnumConstantsSeq;
@@ -381,6 +404,7 @@ template <> struct MappingTraits<EnumConstant> {
381
404
IO.mapOptional (" AvailabilityMsg" , EC.Availability .Msg , StringRef (" " ));
382
405
IO.mapOptional (" SwiftPrivate" , EC.SwiftPrivate );
383
406
IO.mapOptional (" SwiftName" , EC.SwiftName , StringRef (" " ));
407
+ IO.mapOptional (" SwiftSafety" , EC.SafetyKind , SwiftSafetyKind::None);
384
408
}
385
409
};
386
410
} // namespace yaml
@@ -424,6 +448,7 @@ struct Field {
424
448
std::optional<bool > SwiftPrivate;
425
449
StringRef SwiftName;
426
450
StringRef Type;
451
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
427
452
};
428
453
429
454
typedef std::vector<Field> FieldsSeq;
@@ -443,6 +468,7 @@ template <> struct MappingTraits<Field> {
443
468
IO.mapOptional (" SwiftPrivate" , F.SwiftPrivate );
444
469
IO.mapOptional (" SwiftName" , F.SwiftName , StringRef (" " ));
445
470
IO.mapOptional (" Type" , F.Type , StringRef (" " ));
471
+ IO.mapOptional (" SwiftSafety" , F.SafetyKind , SwiftSafetyKind::None);
446
472
}
447
473
};
448
474
} // namespace yaml
@@ -470,6 +496,7 @@ struct Tag {
470
496
std::optional<EnumConvenienceAliasKind> EnumConvenienceKind;
471
497
std::optional<bool > SwiftCopyable;
472
498
std::optional<bool > SwiftEscapable;
499
+ SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
473
500
FunctionsSeq Methods;
474
501
FieldsSeq Fields;
475
502
@@ -515,6 +542,7 @@ template <> struct MappingTraits<Tag> {
515
542
IO.mapOptional (" Methods" , T.Methods );
516
543
IO.mapOptional (" Fields" , T.Fields );
517
544
IO.mapOptional (" Tags" , T.Tags );
545
+ IO.mapOptional (" SwiftSafety" , T.SafetyKind , SwiftSafetyKind::None);
518
546
}
519
547
};
520
548
} // namespace yaml
@@ -530,6 +558,7 @@ struct Typedef {
530
558
std::optional<StringRef> NSErrorDomain;
531
559
std::optional<SwiftNewTypeKind> SwiftType;
532
560
std::optional<std::string> SwiftConformance;
561
+ const SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
533
562
};
534
563
535
564
typedef std::vector<Typedef> TypedefsSeq;
@@ -602,6 +631,7 @@ struct Namespace {
602
631
StringRef SwiftName;
603
632
std::optional<bool > SwiftPrivate;
604
633
TopLevelItems Items;
634
+ const SwiftSafetyKind SafetyKind = SwiftSafetyKind::None;
605
635
};
606
636
} // namespace
607
637
@@ -797,6 +827,8 @@ class YAMLConverter {
797
827
StringRef APIName) {
798
828
convertAvailability (Common.Availability , Info, APIName);
799
829
Info.setSwiftPrivate (Common.SwiftPrivate );
830
+ if (Common.SafetyKind != SwiftSafetyKind::None)
831
+ Info.setSwiftSafety (Common.SafetyKind );
800
832
Info.SwiftName = std::string (Common.SwiftName );
801
833
}
802
834
@@ -956,6 +988,8 @@ class YAMLConverter {
956
988
void convertFunction (const Function &Function, FuncOrMethodInfo &FI) {
957
989
convertAvailability (Function.Availability , FI, Function.Name );
958
990
FI.setSwiftPrivate (Function.SwiftPrivate );
991
+ if (Function.SafetyKind != SwiftSafetyKind::None)
992
+ FI.setSwiftSafety (Function.SafetyKind );
959
993
FI.SwiftName = std::string (Function.SwiftName );
960
994
std::optional<ParamInfo> This;
961
995
convertParams (Function.Params , FI, This);
0 commit comments