@ -140,6 +140,17 @@ namespace CodeGenerator
}
}
Dictionary < string , MethodVariant > variants = new Dictionary < string , MethodVariant > ( ) ;
foreach ( var jt in variantsJson . Children ( ) )
{
JProperty jp = ( JProperty ) jt ;
ParameterVariant [ ] methodVariants = jp . Values ( ) . Select ( jv = >
{
return new ParameterVariant ( jv [ "name" ] . ToString ( ) , jv [ "type" ] . ToString ( ) , jv [ "variants" ] . Select ( s = > s . ToString ( ) ) . ToArray ( ) ) ;
} ) . ToArray ( ) ;
variants . Add ( jp . Name , new MethodVariant ( jp . Name , methodVariants ) ) ;
}
EnumDefinition [ ] enums = typesJson [ "enums" ] . Select ( jt = >
{
JProperty jp = ( JProperty ) jt ;
@ -206,7 +217,8 @@ namespace CodeGenerator
List < TypeReference > parameters = new List < TypeReference > ( ) ;
// find any variants that can be applied to the parameters of this method based on the method name
JToken variants = variantsJson ? . Children ( ) . Where ( variant = > ( ( JProperty ) variant ) . Name = = cimguiname ) . FirstOrDefault ( ) ? ? null ;
MethodVariant methodVariants = null ;
variants . TryGetValue ( jp . Name , out methodVariants ) ;
foreach ( JToken p in val [ "argsT" ] )
{
@ -214,11 +226,10 @@ namespace CodeGenerator
string pName = p [ "name" ] . ToString ( ) ;
// if there are possible variants for this method then try to match them based on the parameter name and expected type
var matchingVariant = variants ? . Values ( ) . Where ( v = > v [ "name" ] . ToString ( ) = = pName & & v [ "type" ] . ToString ( ) = = pType ) . FirstOrDefault ( ) ? ? null ;
// if there was a match to this name and type then apply those variants to this parameter
string [ ] pVariants = matchingVariant ? [ "variants" ] . Values ( ) . Select ( variant = > variant . ToString ( ) ) . ToArray ( ) ? ? null ;
ParameterVariant matchingVariant = methodVariants ? . Parameters . Where ( pv = > pv . Name = = pName & & pv . OriginalType = = pType ) . FirstOrDefault ( ) ? ? null ;
if ( matchingVariant ! = null ) matchingVariant . Used = true ;
parameters . Add ( new TypeReference ( pName , pType , enums , p Variants) ) ;
parameters . Add ( new TypeReference ( pName , pType , enums , matchingVariant ? . VariantType s ) ) ;
}
Dictionary < string , string > defaultValues = new Dictionary < string , string > ( ) ;
@ -564,6 +575,14 @@ namespace CodeGenerator
writer . PopBlock ( ) ;
writer . PopBlock ( ) ;
}
foreach ( var method in variants )
{
foreach ( var variant in method . Value . Parameters )
{
if ( ! variant . Used ) Console . WriteLine ( $"Error: Variants targetting parameter {variant.Name} with type {variant.OriginalType} could not be applied to method {method.Key}." ) ;
}
}
}
private static bool IsStringFieldName ( string name )
@ -982,6 +1001,38 @@ namespace CodeGenerator
}
}
class MethodVariant
{
public string Name { get ; }
public ParameterVariant [ ] Parameters { get ; }
public MethodVariant ( string name , ParameterVariant [ ] parameters )
{
Name = name ;
Parameters = parameters ;
}
}
class ParameterVariant
{
public string Name { get ; }
public string OriginalType { get ; }
public string [ ] VariantTypes { get ; }
public bool Used { get ; set ; }
public ParameterVariant ( string name , string originalType , string [ ] variantTypes )
{
Name = name ;
OriginalType = originalType ;
VariantTypes = variantTypes ;
Used = false ;
}
}
class EnumDefinition
{
private readonly Dictionary < string , string > _ sanitizedNames ;