2323#include " llvm/Support/VersionTuple.h"
2424#include " llvm/Support/YAMLTraits.h"
2525#include < optional>
26+ #include < type_traits>
2627#include < vector>
2728
2829using namespace clang ;
@@ -181,7 +182,7 @@ template <> struct ScalarEnumerationTraits<MethodKind> {
181182
182183namespace {
183184struct Param {
184- unsigned Position;
185+ int Position;
185186 std::optional<bool > NoEscape = false ;
186187 std::optional<bool > Lifetimebound = false ;
187188 std::optional<NullabilityKind> Nullability;
@@ -843,7 +844,8 @@ class YAMLConverter {
843844 }
844845 }
845846
846- void convertParams (const ParamsSeq &Params, FunctionInfo &OutInfo) {
847+ void convertParams (const ParamsSeq &Params, FunctionInfo &OutInfo,
848+ std::optional<ParamInfo> &thisOrSelf) {
847849 for (const auto &P : Params) {
848850 ParamInfo PI;
849851 if (P.Nullability )
@@ -852,9 +854,14 @@ class YAMLConverter {
852854 PI.setLifetimebound (P.Lifetimebound );
853855 PI.setType (std::string (P.Type ));
854856 PI.setRetainCountConvention (P.RetainCountConvention );
855- if (OutInfo.Params .size () <= P.Position )
857+ if (static_cast < int >( OutInfo.Params .size () ) <= P.Position )
856858 OutInfo.Params .resize (P.Position + 1 );
857- OutInfo.Params [P.Position ] |= PI;
859+ if (P.Position == -1 )
860+ thisOrSelf = PI;
861+ else if (P.Position >= 0 )
862+ OutInfo.Params [P.Position ] |= PI;
863+ else
864+ emitError (" invalid parameter position " + llvm::itostr (P.Position ));
858865 }
859866 }
860867
@@ -931,7 +938,7 @@ class YAMLConverter {
931938 MI.ResultType = std::string (M.ResultType );
932939
933940 // Translate parameter information.
934- convertParams (M.Params , MI);
941+ convertParams (M.Params , MI, MI. Self );
935942
936943 // Translate nullability info.
937944 convertNullability (M.Nullability , M.NullabilityOfRet , MI, M.Selector );
@@ -1039,11 +1046,18 @@ class YAMLConverter {
10391046 TheNamespace.Items , SwiftVersion);
10401047 }
10411048
1042- void convertFunction (const Function &Function, FunctionInfo &FI) {
1049+ template <typename FuncOrMethodInfo>
1050+ void convertFunction (const Function &Function, FuncOrMethodInfo &FI) {
10431051 convertAvailability (Function.Availability , FI, Function.Name );
10441052 FI.setSwiftPrivate (Function.SwiftPrivate );
10451053 FI.SwiftName = std::string (Function.SwiftName );
1046- convertParams (Function.Params , FI);
1054+ std::optional<ParamInfo> This;
1055+ convertParams (Function.Params , FI, This);
1056+ if constexpr (std::is_same_v<FuncOrMethodInfo, CXXMethodInfo>)
1057+ FI.This = This;
1058+ else if (This)
1059+ emitError (" implicit instance parameter is only permitted on C++ and "
1060+ " Objective-C methods" );
10471061 convertNullability (Function.Nullability , Function.NullabilityOfRet , FI,
10481062 Function.Name );
10491063 FI.ResultType = std::string (Function.ResultType );
0 commit comments