Skip to content

Commit d62cb5f

Browse files
committed
Process the variants into a dictionary and then mark them as used as they are applied.
Loop over all variants at the end and display an error if the variant was unused.
1 parent 8be7644 commit d62cb5f

File tree

1 file changed

+56
-5
lines changed

1 file changed

+56
-5
lines changed

src/CodeGenerator/Program.cs

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)