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,9 @@ class YAMLConverter {
730731 }
731732 }
732733
733- void convertParams (const ParamsSeq &Params, FunctionInfo &OutInfo) {
734+ std::optional<ParamInfo> convertParams (const ParamsSeq &Params,
735+ FunctionInfo &OutInfo) {
736+ std::optional<ParamInfo> thisOrSelf;
734737 for (const auto &P : Params) {
735738 ParamInfo PI;
736739 if (P.Nullability )
@@ -739,10 +742,16 @@ class YAMLConverter {
739742 PI.setLifetimebound (P.Lifetimebound );
740743 PI.setType (std::string (P.Type ));
741744 PI.setRetainCountConvention (P.RetainCountConvention );
742- if (OutInfo.Params .size () <= P.Position )
745+ if (static_cast < int >( OutInfo.Params .size () ) <= P.Position )
743746 OutInfo.Params .resize (P.Position + 1 );
744- OutInfo.Params [P.Position ] |= PI;
747+ if (P.Position < -1 )
748+ emitError (" parameter position smaller than -1 is not valid" );
749+ else if (P.Position == -1 )
750+ thisOrSelf = PI;
751+ else
752+ OutInfo.Params [P.Position ] |= PI;
745753 }
754+ return thisOrSelf;
746755 }
747756
748757 void convertNullability (const NullabilitySeq &Nullability,
@@ -818,7 +827,7 @@ class YAMLConverter {
818827 MI.ResultType = std::string (M.ResultType );
819828
820829 // Translate parameter information.
821- convertParams (M.Params , MI);
830+ MI. Self = convertParams (M.Params , MI);
822831
823832 // Translate nullability info.
824833 convertNullability (M.Nullability , M.NullabilityOfRet , MI, M.Selector );
@@ -926,11 +935,17 @@ class YAMLConverter {
926935 TheNamespace.Items , SwiftVersion);
927936 }
928937
929- void convertFunction (const Function &Function, FunctionInfo &FI) {
938+ template <typename FuncOrMethodInfo>
939+ void convertFunction (const Function &Function, FuncOrMethodInfo &FI) {
930940 convertAvailability (Function.Availability , FI, Function.Name );
931941 FI.setSwiftPrivate (Function.SwiftPrivate );
932942 FI.SwiftName = std::string (Function.SwiftName );
933- convertParams (Function.Params , FI);
943+ if constexpr (std::is_same_v<FuncOrMethodInfo, CXXMethodInfo>) {
944+ FI.This = convertParams (Function.Params , FI);
945+ } else {
946+ if (convertParams (Function.Params , FI))
947+ emitError (" position -1 is only valid for C++ and Objective-C methods" );
948+ }
934949 convertNullability (Function.Nullability , Function.NullabilityOfRet , FI,
935950 Function.Name );
936951 FI.ResultType = std::string (Function.ResultType );
0 commit comments