1 package spoon.examples.distcalc.processing; 2 3 import java.util.ArrayList ; 4 5 import spoon.examples.distcalc.annotation.Service; 6 import spoon.examples.distcalc.template.ServicesImplTemplate; 7 import spoon.examples.distcalc.template._MemoryCellType_; 8 import spoon.processing.AbstractAnnotationProcessor; 9 import spoon.reflect.Factory; 10 import spoon.reflect.declaration.CtClass; 11 import spoon.reflect.declaration.CtInterface; 12 import spoon.reflect.declaration.CtMethod; 13 import spoon.reflect.declaration.CtPackage; 14 import spoon.reflect.declaration.CtParameter; 15 import spoon.reflect.declaration.CtSimpleType; 16 import spoon.reflect.declaration.ModifierKind; 17 import spoon.reflect.reference.CtTypeReference; 18 import spoon.template.Substitution; 19 20 public class ServiceProcessor extends 21 AbstractAnnotationProcessor<Service, CtMethod<?>> { 22 23 public static String getMemoryCellTypeName(String funName) { 24 return "Node_" + funName + "_mem"; 25 } 26 27 public static CtClass<?> getFunsImpl(Factory f, CtInterface<?> services) { 28 CtTypeReference<?> i = f.Interface().createReference(services); 29 for (CtSimpleType<?> t : f.Type().getAll()) { 30 if ((t instanceof CtClass) 31 && !t.getModifiers().contains(ModifierKind.ABSTRACT) 32 && ((CtClass<?>) t).getSuperInterfaces().contains(i)) { 33 return (CtClass<?>) t; 34 } 35 } 36 CtClass<?> c = f.Class().create(services.getQualifiedName() + "Impl"); 37 c.getSuperInterfaces().add(i); 38 c.getModifiers().add(ModifierKind.PUBLIC); 39 return c; 40 } 41 42 public void process(Service service, CtMethod<?> method) { 43 Factory f = method.getFactory(); 44 CtPackage p = method.getParent(CtPackage.class); 45 CtInterface<?> i = method.getParent(CtInterface.class); 46 CtClass<?> c = getFunsImpl(f, i); 47 ServicesImplTemplate t = new ServicesImplTemplate(f.Type() 48 .createReference( 49 p.getQualifiedName() + "." + "Node_" 50 + method.getSimpleName()), null, 51 f.Type() 52 .createReference( 53 p.getQualifiedName() 54 + "." 55 + getMemoryCellTypeName(method 56 .getSimpleName())), method 57 .getType().getActualClass(), method.getSimpleName(), 58 new ArrayList <CtParameter>(method.getParameters())); 59 Substitution.insertAll(c, t); 60 _MemoryCellType_ memType = new _MemoryCellType_(f, f.Type() 61 .createReference( 62 p.getQualifiedName() + "." + "Node_" 63 + method.getSimpleName()), method.getType() 64 .getActualClass(), method.getSimpleName(), 65 new ArrayList <CtParameter<?>>(method.getParameters())); 66 CtClass memClass = Substitution.substitute(memType, f.Template().get( 67 _MemoryCellType_.class)); 68 p.getTypes().add(memClass); 69 memClass.setParent(p); 70 } 71 72 } 73 | Popular Tags |