@@ -140,6 +140,17 @@ static void Main(string[] args)
140140 }
141141 }
142142
143+ Dictionary < string , MethodVariant > variants = new Dictionary < string , MethodVariant > ( ) ;
144+ foreach ( var jt in variantsJson . Children ( ) )
145+ {
146+ JProperty jp = ( JProperty ) jt ;
147+ ParameterVariant [ ] methodVariants = jp . Values ( ) . Select ( jv =>
148+ {
149+ return new ParameterVariant ( jv [ "name" ] . ToString ( ) , jv [ "type" ] . ToString ( ) , jv [ "variants" ] . Select ( s => s . ToString ( ) ) . ToArray ( ) ) ;
150+ } ) . ToArray ( ) ;
151+ variants . Add ( jp . Name , new MethodVariant ( jp . Name , methodVariants ) ) ;
152+ }
153+
143154 EnumDefinition [ ] enums = typesJson [ "enums" ] . Select ( jt =>
144155 {
145156 JProperty jp = ( JProperty ) jt ;
@@ -206,19 +217,19 @@ static void Main(string[] args)
206217 List < TypeReference > parameters = new List < TypeReference > ( ) ;
207218
208219 // find any variants that can be applied to the parameters of this method based on the method name
209- JToken variants = variantsJson ? . Children ( ) . Where ( variant => ( ( JProperty ) variant ) . Name == cimguiname ) . FirstOrDefault ( ) ?? null ;
220+ MethodVariant methodVariants = null ;
221+ variants . TryGetValue ( jp . Name , out methodVariants ) ;
210222
211223 foreach ( JToken p in val [ "argsT" ] )
212224 {
213225 string pType = p [ "type" ] . ToString ( ) ;
214226 string pName = p [ "name" ] . ToString ( ) ;
215227
216228 // if there are possible variants for this method then try to match them based on the parameter name and expected type
217- var matchingVariant = variants ? . Values ( ) . Where ( v => v [ "name" ] . ToString ( ) == pName && v [ "type" ] . ToString ( ) == pType ) . FirstOrDefault ( ) ?? null ;
218- // if there was a match to this name and type then apply those variants to this parameter
219- string [ ] pVariants = matchingVariant ? [ "variants" ] . Values ( ) . Select ( variant => variant . ToString ( ) ) . ToArray ( ) ?? null ;
229+ ParameterVariant matchingVariant = methodVariants ? . Parameters . Where ( pv => pv . Name == pName && pv . OriginalType == pType ) . FirstOrDefault ( ) ?? null ;
230+ if ( matchingVariant != null ) matchingVariant . Used = true ;
220231
221- parameters . Add ( new TypeReference ( pName , pType , enums , pVariants ) ) ;
232+ parameters . Add ( new TypeReference ( pName , pType , enums , matchingVariant ? . VariantTypes ) ) ;
222233 }
223234
224235 Dictionary < string , string > defaultValues = new Dictionary < string , string > ( ) ;
@@ -564,6 +575,14 @@ static void Main(string[] args)
564575 writer . PopBlock ( ) ;
565576 writer . PopBlock ( ) ;
566577 }
578+
579+ foreach ( var method in variants )
580+ {
581+ foreach ( var variant in method . Value . Parameters )
582+ {
583+ if ( ! variant . Used ) Console . WriteLine ( $ "Error: Variants targetting parameter { variant . Name } with type { variant . OriginalType } could not be applied to method { method . Key } .") ;
584+ }
585+ }
567586 }
568587
569588 private static bool IsStringFieldName ( string name )
@@ -982,6 +1001,38 @@ private static string CorrectIdentifier(string identifier)
9821001 }
9831002 }
9841003
1004+ class MethodVariant
1005+ {
1006+ public string Name { get ; }
1007+
1008+ public ParameterVariant [ ] Parameters { get ; }
1009+
1010+ public MethodVariant ( string name , ParameterVariant [ ] parameters )
1011+ {
1012+ Name = name ;
1013+ Parameters = parameters ;
1014+ }
1015+ }
1016+
1017+ class ParameterVariant
1018+ {
1019+ public string Name { get ; }
1020+
1021+ public string OriginalType { get ; }
1022+
1023+ public string [ ] VariantTypes { get ; }
1024+
1025+ public bool Used { get ; set ; }
1026+
1027+ public ParameterVariant ( string name , string originalType , string [ ] variantTypes )
1028+ {
1029+ Name = name ;
1030+ OriginalType = originalType ;
1031+ VariantTypes = variantTypes ;
1032+ Used = false ;
1033+ }
1034+ }
1035+
9851036 class EnumDefinition
9861037 {
9871038 private readonly Dictionary < string , string > _sanitizedNames ;
0 commit comments