1 package spoon.examples.factory.processing; 2 3 import java.util.ArrayList ; 4 import java.util.List ; 5 6 import spoon.examples.factory.src.Factory; 7 import spoon.processing.AbstractProcessor; 8 import spoon.processing.Severity; 9 import spoon.reflect.code.CtNewClass; 10 import spoon.reflect.declaration.CtMethod; 11 import spoon.reflect.declaration.CtSimpleType; 12 import spoon.reflect.declaration.CtType; 13 import spoon.reflect.reference.CtTypeReference; 14 15 public class FactoryProcessor extends AbstractProcessor<CtNewClass<?>> { 16 17 public void process(CtNewClass<?> newClass) { 18 if (getFactoryType().isAssignableFrom( 20 newClass.getExecutable().getDeclaringType())) 21 return; 22 if (getFactoryType().isAssignableFrom( 24 ((CtSimpleType<?>) newClass.getParent(CtSimpleType.class)) 25 .getReference())) 26 return; 27 for (CtTypeReference<?> t : getCreatedTypes()) { 29 if (t.isAssignableFrom(newClass.getType())) { 30 getFactory().getEnvironment().report(this, Severity.WARNING, 31 newClass, "wrong use of factory pattern"); 32 } 33 } 34 35 } 36 37 CtTypeReference<?> factoryType = null; 38 39 protected CtTypeReference<?> getFactoryType() { 40 if (factoryType == null) { 41 factoryType = getFactory().Type().createReference(Factory.class); 42 } 43 return factoryType; 44 } 45 46 List <CtTypeReference<?>> createdTypes; 47 48 private List <CtTypeReference<?>> getCreatedTypes() { 49 if (createdTypes == null) { 50 createdTypes = new ArrayList <CtTypeReference<?>>(); 51 for (CtMethod<?> m : ((CtType<?>) getFactoryType().getDeclaration()) 52 .getMethods()) { 53 createdTypes.add(m.getType()); 54 } 55 } 56 return createdTypes; 57 } 58 59 } 60 | Popular Tags |