Skip to content

Commit ac45026

Browse files
committed
avoid generating redundent node class for the same rule
sometimes the CST node class for the same rule is generated more than twice. avoid doing this by keep tracking on which node is already generated.
1 parent 57f4437 commit ac45026

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

Parakeet/CstCodeBuilder.cs

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Runtime.CompilerServices;
44
using Ara3D.Utils;
@@ -100,13 +100,19 @@ public static HashSet<string> GatherFields(Rule r, HashSet<string> fields = null
100100
throw new NotImplementedException($"Unhandled type {r}");
101101
}
102102

103-
public static CodeBuilder OutputNodeClass(CodeBuilder cb, Grammar g, Rule r)
103+
public static CodeBuilder OutputNodeClass(CodeBuilder cb, Grammar g, Rule r, HashSet<Rule> generated = default)
104104
{
105+
if (generated is null)
106+
generated = new HashSet<Rule>();
107+
if (generated.Contains(r))
108+
return cb;
109+
generated.Add(r);
110+
105111
if (r is SequenceRule seq)
106112
{
107113
foreach (var child in seq.Rules)
108114
if (child is NodeRule nr2)
109-
OutputNodeClass(cb, g, nr2);
115+
OutputNodeClass(cb, g, nr2, generated);
110116
}
111117

112118
if (!(r is NodeRule nr))
@@ -171,9 +177,10 @@ public static CodeBuilder OutputNodeClass(CodeBuilder cb, Grammar g, Rule r)
171177
public static void OutputCstClasses(CodeBuilder cb, Grammar g)
172178
{
173179
var rules = g.GetRules();
180+
var generated = new HashSet<Rule>();
174181
foreach (var r in rules)
175182
{
176-
OutputNodeClass(cb, g,r);
183+
OutputNodeClass(cb, g, r, generated);
177184
}
178185
}
179186

0 commit comments

Comments
 (0)