@@ -166,9 +166,17 @@ namespace {
166166 NullabilityKind::NonNull;
167167 typedef std::vector<clang::NullabilityKind> NullabilitySeq;
168168
169+ struct Param {
170+ unsigned Position;
171+ bool NoEscape = false ;
172+ llvm::Optional<NullabilityKind> Nullability;
173+ };
174+ typedef std::vector<Param> ParamsSeq;
175+
169176 struct Method {
170177 StringRef Selector;
171178 MethodKind Kind;
179+ ParamsSeq Params;
172180 NullabilitySeq Nullability;
173181 llvm::Optional<NullabilityKind> NullabilityOfRet;
174182 AvailabilityItem Availability;
@@ -205,6 +213,7 @@ namespace {
205213
206214 struct Function {
207215 StringRef Name;
216+ ParamsSeq Params;
208217 NullabilitySeq Nullability;
209218 llvm::Optional<NullabilityKind> NullabilityOfRet;
210219 AvailabilityItem Availability;
@@ -272,6 +281,7 @@ namespace {
272281LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR (clang::NullabilityKind)
273282LLVM_YAML_IS_SEQUENCE_VECTOR(Method)
274283LLVM_YAML_IS_SEQUENCE_VECTOR(Property)
284+ LLVM_YAML_IS_SEQUENCE_VECTOR(Param)
275285LLVM_YAML_IS_SEQUENCE_VECTOR(Class)
276286LLVM_YAML_IS_SEQUENCE_VECTOR(Function)
277287LLVM_YAML_IS_SEQUENCE_VECTOR(GlobalVariable)
@@ -322,6 +332,16 @@ namespace llvm {
322332 }
323333 };
324334
335+ template <>
336+ struct MappingTraits <Param> {
337+ static void mapping (IO &io, Param& p) {
338+ io.mapRequired (" Position" , p.Position );
339+ io.mapOptional (" Nullability" , p.Nullability ,
340+ AbsentNullability);
341+ io.mapOptional (" NoEscape" , p.NoEscape );
342+ }
343+ };
344+
325345 template <>
326346 struct MappingTraits <Property> {
327347 static void mapping (IO &io, Property& p) {
@@ -340,6 +360,7 @@ namespace llvm {
340360 static void mapping (IO &io, Method& m) {
341361 io.mapRequired (" Selector" , m.Selector );
342362 io.mapRequired (" MethodKind" , m.Kind );
363+ io.mapOptional (" Parameters" , m.Params );
343364 io.mapOptional (" Nullability" , m.Nullability );
344365 io.mapOptional (" NullabilityOfRet" , m.NullabilityOfRet ,
345366 AbsentNullability);
@@ -374,6 +395,7 @@ namespace llvm {
374395 struct MappingTraits <Function> {
375396 static void mapping (IO &io, Function& f) {
376397 io.mapRequired (" Name" , f.Name );
398+ io.mapOptional (" Parameters" , f.Params );
377399 io.mapOptional (" Nullability" , f.Nullability );
378400 io.mapOptional (" NullabilityOfRet" , f.NullabilityOfRet ,
379401 AbsentNullability);
@@ -527,6 +549,20 @@ namespace {
527549 return false ;
528550 }
529551
552+ void convertParams (const ParamsSeq ¶ms, FunctionInfo &outInfo) {
553+ for (const auto &p : params) {
554+ ParamInfo pi;
555+ if (p.Nullability )
556+ pi.setNullabilityAudited (*p.Nullability );
557+ pi.setNoEscape (p.NoEscape );
558+
559+ while (outInfo.Params .size () <= p.Position ) {
560+ outInfo.Params .push_back (ParamInfo ());
561+ }
562+ outInfo.Params [p.Position ] |= pi;
563+ }
564+ }
565+
530566 void convertNullability (const NullabilitySeq &nullability,
531567 Optional<NullabilityKind> nullabilityOfRet,
532568 FunctionInfo &outInfo,
@@ -610,6 +646,9 @@ namespace {
610646 if (meth.FactoryAsInit != FactoryAsInitKind::Infer)
611647 mInfo .setFactoryAsInitKind (meth.FactoryAsInit );
612648
649+ // Translate parameter information.
650+ convertParams (meth.Params , mInfo );
651+
613652 // Translate nullability info.
614653 convertNullability (meth.Nullability , meth.NullabilityOfRet ,
615654 mInfo , meth.Selector );
@@ -744,6 +783,7 @@ namespace {
744783 convertAvailability (function.Availability , info, function.Name );
745784 info.SwiftPrivate = function.SwiftPrivate ;
746785 info.SwiftName = function.SwiftName ;
786+ convertParams (function.Params , info);
747787 convertNullability (function.Nullability ,
748788 function.NullabilityOfRet ,
749789 info, function.Name );
@@ -924,6 +964,19 @@ namespace {
924964 }
925965 }
926966
967+ // / Map parameter information for a function.
968+ void handleParameters (ParamsSeq ¶ms,
969+ const FunctionInfo &info) {
970+ unsigned position = 0 ;
971+ for (const auto &pi: info.Params ) {
972+ Param p;
973+ p.Position = position++;
974+ p.Nullability = pi.getNullability ();
975+ p.NoEscape = pi.isNoEscape ();
976+ params.push_back (p);
977+ }
978+ }
979+
927980 // / Map nullability information for a function.
928981 void handleNullability (NullabilitySeq &nullability,
929982 llvm::Optional<NullabilityKind> &nullabilityOfRet,
@@ -967,6 +1020,7 @@ namespace {
9671020 method.Kind = isInstanceMethod ? MethodKind::Instance : MethodKind::Class;
9681021
9691022 handleCommon (method, info);
1023+ handleParameters (method.Params , info);
9701024 handleNullability (method.Nullability , method.NullabilityOfRet , info,
9711025 selector.count (' :' ));
9721026 method.FactoryAsInit = info.getFactoryAsInitKind ();
@@ -1003,6 +1057,7 @@ namespace {
10031057 Function function;
10041058 function.Name = name;
10051059 handleCommon (function, info);
1060+ handleParameters (function.Params , info);
10061061 if (info.NumAdjustedNullable > 0 )
10071062 handleNullability (function.Nullability , function.NullabilityOfRet ,
10081063 info, info.NumAdjustedNullable -1 );
0 commit comments