1 package spoon.examples.visitor.processing; 2 3 import spoon.examples.visitor.template.VisitorTemplate; 4 import spoon.processing.AbstractProcessor; 5 import spoon.reflect.declaration.CtClass; 6 import spoon.reflect.declaration.CtType; 7 import spoon.reflect.declaration.ModifierKind; 8 import spoon.reflect.reference.CtTypeReference; 9 import spoon.template.Substitution; 10 import spoon.template.Template; 11 12 33 public abstract class AbstractVisitorProcessor extends 34 AbstractProcessor<CtType<?>> { 35 36 39 public abstract CtTypeReference<?> getVisitedRootType(); 40 41 45 public abstract CtTypeReference<?> getVisitorType(); 46 47 50 public abstract CtTypeReference<?> getVisitedInterface(); 51 52 public boolean isToBeProcessed(CtType<?> candidate) { 53 return getVisitedRootType().isAssignableFrom( 54 getFactory().Type().createReference(candidate)); 55 } 56 57 public void process(CtType<?> target) { 58 if (target == getVisitedRootType().getDeclaration()) { 60 target.getSuperInterfaces().add(getVisitedInterface()); 61 } 62 if (target instanceof CtClass 64 && !target.hasModifier(ModifierKind.ABSTRACT)) { 65 Template t = new VisitorTemplate(target.getSimpleName(), 66 getVisitorType().getActualClass()); 67 Substitution.insertAll(target, t); 68 } 69 } 70 71 } 72 | Popular Tags |