Adding AbcTraitsVisitor and AsTraitsVisitor
This commit is contained in:
@@ -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
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user