1 package spoon.examples.fieldaccess.processing; 2 3 import spoon.examples.fieldaccess.annotation.Getter; 4 import spoon.examples.fieldaccess.annotation.Setter; 5 import spoon.examples.fieldaccess.template.FieldAccessTemplate; 6 import spoon.processing.AbstractProcessor; 7 import spoon.reflect.code.CtBlock; 8 import spoon.reflect.code.CtFieldAccess; 9 import spoon.reflect.declaration.CtClass; 10 import spoon.reflect.declaration.CtMethod; 11 import spoon.reflect.reference.CtFieldReference; 12 import spoon.template.Substitution; 13 import spoon.template.Template; 14 import spoon.template.TemplateMatcher; 15 16 23 public class ReadAccessProcessor<_FieldType_> extends 24 AbstractProcessor<CtFieldAccess<_FieldType_>> { 25 26 public boolean isToBeProcessed(CtFieldAccess<_FieldType_> candidate) { 27 return true; 28 } 29 30 public void process(CtFieldAccess<_FieldType_> access) { 31 CtFieldReference<_FieldType_> field = access.getVariable(); 32 if (ServerAccessProcessor.fields.contains(field)) { 33 CtClass<FieldAccessTemplate> templateType = getFactory().Template() 34 .get(FieldAccessTemplate.class); 35 TemplateMatcher matcher = new TemplateMatcher(templateType); 36 CtMethod setter = (CtMethod) templateType.getAnnotatedChildren( 37 Setter.class).get(0); 38 CtMethod getter = (CtMethod) templateType.getAnnotatedChildren( 39 Getter.class).get(0); 40 if (!matcher.match(access.getParent(CtMethod.class), setter) 41 && !matcher.match(access.getParent(CtMethod.class), getter)) { 42 Template t = new FieldAccessTemplate<_FieldType_>(field 43 .getType(), field.getSimpleName(), access, null); 44 CtBlock<?> b = Substitution.substituteMethodBody(access 45 .getParent(CtClass.class), t, "getterInvocation"); 46 access.replace(b.getStatements().get(0)); 47 } 48 } 49 } 50 } 51 | Popular Tags |