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 ;
@@ -68,7 +69,7 @@ template <> struct ScalarEnumerationTraits<MethodKind> {
6869
6970namespace {
7071struct Param {
71- unsigned Position;
72+ int Position;
7273 std::optional<bool > NoEscape = false ;
7374 std::optional<bool > Lifetimebound = false ;
7475 std::optional<NullabilityKind> Nullability;
@@ -730,7 +731,8 @@ class YAMLConverter {
730731 }
731732 }
732733
733- void convertParams (const ParamsSeq &Params, FunctionInfo &OutInfo) {
734+ void convertParams (const ParamsSeq &Params, FunctionInfo &OutInfo,
735+ std::optional<ParamInfo> &thisOrSelf) {
734736 for (const auto &P : Params) {
735737 ParamInfo PI;
736738 if (P.Nullability )
@@ -739,9 +741,14 @@ class YAMLConverter {
739741 PI.setLifetimebound (P.Lifetimebound );
740742 PI.setType (std::string (P.Type ));
741743 PI.setRetainCountConvention (P.RetainCountConvention );
742- if (OutInfo.Params .size () <= P.Position )
744+ if (static_cast < int >( OutInfo.Params .size () ) <= P.Position )
743745 OutInfo.Params .resize (P.Position + 1 );
744- OutInfo.Params [P.Position ] |= PI;
746+ if (P.Position == -1 )
747+ thisOrSelf = PI;
748+ else if (P.Position >= 0 )
749+ OutInfo.Params [P.Position ] |= PI;
750+ else
751+ emitError (" invalid parameter position " + llvm::itostr (P.Position ));
745752 }
746753 }
747754
@@ -818,7 +825,7 @@ class YAMLConverter {
818825 MI.ResultType = std::string (M.ResultType );
819826
820827 // Translate parameter information.
821- convertParams (M.Params , MI);
828+ convertParams (M.Params , MI, MI. Self );
822829
823830 // Translate nullability info.
824831 convertNullability (M.Nullability , M.NullabilityOfRet , MI, M.Selector );
@@ -926,11 +933,18 @@ class YAMLConverter {
926933 TheNamespace.Items , SwiftVersion);
927934 }
928935
929- void convertFunction (const Function &Function, FunctionInfo &FI) {
936+ template <typename FuncOrMethodInfo>
937+ void convertFunction (const Function &Function, FuncOrMethodInfo &FI) {
930938 convertAvailability (Function.Availability , FI, Function.Name );
931939 FI.setSwiftPrivate (Function.SwiftPrivate );
932940 FI.SwiftName = std::string (Function.SwiftName );
933- convertParams (Function.Params , FI);
941+ std::optional<ParamInfo> This;
942+ convertParams (Function.Params , FI, This);
943+ if constexpr (std::is_same_v<FuncOrMethodInfo, CXXMethodInfo>)
944+ FI.This = This;
945+ else if (This)
946+ emitError (" implicit instance parameter is only permitted on C++ and "
947+ " Objective-C methods" );
934948 convertNullability (Function.Nullability , Function.NullabilityOfRet , FI,
935949 Function.Name );
936950 FI.ResultType = std::string (Function.ResultType );
0 commit comments