Adding AbcTraitsVisitor and AsTraitsVisitor

This commit is contained in:
Vladimir Panteleev
2010-03-18 21:17:29 +02:00
parent 9a9ef13775
commit 31492d0e2f
2 changed files with 78 additions and 0 deletions
+30
View File
@@ -1788,3 +1788,33 @@ final:
writeU30(v.varName);
}
}
class ABCTraitsVisitor
{
ABCFile abc;
this(ABCFile abc)
{
this.abc = abc;
}
final void run()
{
foreach (ref v; abc.instances)
visitTraits(v.traits);
foreach (ref v; abc.classes)
visitTraits(v.traits);
foreach (ref v; abc.scripts)
visitTraits(v.traits);
foreach (ref v; abc.bodies)
visitTraits(v.traits);
}
final void visitTraits(ABCFile.TraitsInfo[] traits)
{
foreach (ref trait; traits)
visitTrait(trait);
}
abstract void visitTrait(ref ABCFile.TraitsInfo trait);
}
+48
View File
@@ -1255,3 +1255,51 @@ final:
return r;
}
}
class ASTraitsVisitor
{
ASProgram as;
this(ASProgram as)
{
this.as = as;
}
void run()
{
foreach (ref v; as.scripts)
visitTraits(v.traits);
}
final void visitTraits(ASProgram.Trait[] traits)
{
foreach (ref trait; traits)
visitTrait(trait);
}
void visitTrait(ref ASProgram.Trait trait)
{
switch (trait.kind)
{
case TraitKind.Slot:
case TraitKind.Const:
break;
case TraitKind.Class:
visitTraits(trait.vClass.vclass.traits);
visitTraits(trait.vClass.vclass.instance.traits);
break;
case TraitKind.Function:
if (trait.vFunction.vfunction.vbody)
visitTraits(trait.vFunction.vfunction.vbody.traits);
break;
case TraitKind.Method:
case TraitKind.Getter:
case TraitKind.Setter:
if (trait.vMethod.vmethod.vbody)
visitTraits(trait.vMethod.vmethod.vbody.traits);
break;
default:
throw new Exception("Unknown trait kind");
}
}
}