1 16 package com.google.gwt.dev.jjs.impl; 17 18 import com.google.gwt.dev.jjs.ast.Context; 19 import com.google.gwt.dev.jjs.ast.JClassLiteral; 20 import com.google.gwt.dev.jjs.ast.JClassType; 21 import com.google.gwt.dev.jjs.ast.JExpression; 22 import com.google.gwt.dev.jjs.ast.JMethod; 23 import com.google.gwt.dev.jjs.ast.JMethodCall; 24 import com.google.gwt.dev.jjs.ast.JModVisitor; 25 import com.google.gwt.dev.jjs.ast.JNewInstance; 26 import com.google.gwt.dev.jjs.ast.JProgram; 27 28 32 public class ReplaceRebinds { 33 34 private class RebindVisitor extends JModVisitor { 35 36 public void endVisit(JMethodCall x, Context ctx) { 38 JMethod method = x.getTarget(); 39 if (method == program.getRebindCreateMethod()) { 40 assert (x.getArgs().size() == 1); 41 JExpression arg = (JExpression) x.getArgs().get(0); 42 assert (arg instanceof JClassLiteral); 43 JClassLiteral classLiteral = (JClassLiteral) arg; 44 JClassType classType = program.rebind(classLiteral.getRefType()); 45 46 50 JMethod noArgCtor = null; 51 for (int i = 0; i < classType.methods.size(); ++i) { 52 JMethod ctor = (JMethod) classType.methods.get(i); 53 if (ctor.getName().equals(classType.getShortName())) { 54 if (ctor.params.size() == 0) { 55 noArgCtor = ctor; 56 } 57 } 58 } 59 assert (noArgCtor != null); 60 JNewInstance newInstance = new JNewInstance(program, x.getSourceInfo(), 62 classType); 63 JMethodCall call = new JMethodCall(program, x.getSourceInfo(), 64 newInstance, noArgCtor); 65 ctx.replaceMe(call); 66 } 67 } 68 } 69 70 public static boolean exec(JProgram program) { 71 return new ReplaceRebinds(program).execImpl(); 72 } 73 74 private final JProgram program; 75 76 private ReplaceRebinds(JProgram program) { 77 this.program = program; 78 } 79 80 private boolean execImpl() { 81 RebindVisitor rebinder = new RebindVisitor(); 82 rebinder.accept(program); 83 return rebinder.didChange(); 84 } 85 86 } 87 | Popular Tags |