1 package spoon.jdiet; 2 3 import java.util.ArrayList ; 4 import java.util.Collection ; 5 import java.util.List ; 6 import java.util.Map ; 7 import java.util.Set ; 8 import java.util.Vector ; 9 10 import spoon.jdiet.rt.Helper; 11 import spoon.processing.AbstractProcessor; 12 import spoon.processing.TraversalStrategy; 13 import spoon.reflect.code.CtExpression; 14 import spoon.reflect.code.CtInvocation; 15 import spoon.reflect.code.CtNewClass; 16 import spoon.reflect.declaration.CtClass; 17 import spoon.reflect.factory.CodeFactory; 18 import spoon.reflect.factory.ExecutableFactory; 19 import spoon.reflect.factory.TypeFactory; 20 import spoon.reflect.reference.CtExecutableReference; 21 import spoon.reflect.reference.CtTypeReference; 22 23 29 public class NewClassProcessor extends AbstractProcessor<CtNewClass> { 30 31 public TraversalStrategy getTraversalStrategy() { 32 return TraversalStrategy.POST_ORDER; 34 } 35 36 public void process(CtNewClass nc) { 37 38 TypeFactory tf = getFactory().Type(); 39 ExecutableFactory ef = getFactory().Executable(); 40 CodeFactory cf = getFactory().Code(); 41 42 CtTypeReference ctr = getType(nc); 43 44 if( !ctr.isPrimitif() ) { 45 46 if( ctr.isSubtypeOf(tf.createReference(ArrayList .class)) ) { 49 List <CtExpression<?>> args = nc.getArguments(); 50 if( args.size() == 1 ) { 51 CtExpression<?> arg = args.get(0); 52 if( arg.getType().isSubtypeOf(tf.createReference(Collection .class)) ) { 53 CtExecutableReference replmeth = 54 ef.createReference( 55 tf.createReference(Helper.class), 56 true,"newList", 57 tf.createReference(Vector .class)); 58 CtInvocation repl = 59 cf.createInvocation(null,replmeth,args); 60 nc.replace(repl); 61 return; 62 } 63 } 64 } 65 66 if( ctr.isSubtypeOf(tf.createReference(Set .class)) ) { 68 List <CtExpression<?>> args = nc.getArguments(); 69 if( args.size() == 1 ) { 70 CtExpression<?> arg = args.get(0); 71 72 if( arg.getType().isSubtypeOf(tf.createReference(Collection .class)) ) { 73 CtExecutableReference replmeth = 74 ef.createReference( 75 tf.createReference(Helper.class), 76 true,"newSet", 77 tf.createReference(Vector .class)); 78 CtInvocation repl = 79 cf.createInvocation(null,replmeth,args); 80 nc.replace(repl); 81 return; 82 } 83 } 84 } 85 86 92 93 if( ctr.isSubtypeOf(tf.createReference(Collection .class)) ) { 95 ctr.setSimpleName("Vector"); 96 } 97 98 else if( ctr.isSubtypeOf(tf.createReference(Map .class)) ) { 100 ctr.setSimpleName("Hashtable"); 101 } 102 103 else if( ctr.isSubtypeOf(tf.createReference(Throwable .class)) ) { 105 List <CtExpression<?>> args = nc.getArguments(); 106 if( args.size() == 1 ) { 107 CtExpression<?> arg = args.get(0); 108 if( arg.getType().isSubtypeOf(tf.createReference(Throwable .class)) ) { 109 CtExecutableReference getmessage = 110 ef.createReference( 111 tf.createReference(Throwable .class), 112 "getMessage" ); 113 CtInvocation repl = cf.createInvocation(arg,getmessage); 114 arg.replace(repl); 115 } 116 } 117 } 118 } 119 } 120 121 131 static CtTypeReference getType( CtNewClass nc ) { 132 133 CtClass c = nc.getAnonymousClass(); 134 if( c == null ) { 135 return nc.getType(); 137 } 138 139 CtTypeReference ctr = c.getSuperclass(); 140 if( ctr != null ) { 141 return ctr; 142 } 143 144 Set <CtTypeReference> sups = c.getSuperinterfaces(); 146 ctr = sups.iterator().next(); 147 return ctr; 148 } 149 150 } 151 | Popular Tags |