/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.jjs.impl; import com.google.gwt.dev.jjs.ast.Context; import com.google.gwt.dev.jjs.ast.JConstructor; import com.google.gwt.dev.jjs.ast.JExpressionStatement; import com.google.gwt.dev.jjs.ast.JMethodCall; import com.google.gwt.dev.jjs.ast.JModVisitor; import com.google.gwt.dev.jjs.ast.JNewInstance; import com.google.gwt.dev.jjs.ast.JProgram; import com.google.gwt.dev.jjs.ast.js.JMultiExpression; /** * Removes calls to no-op super constructors. */ public class RemoveEmptySuperCalls { /** * Removes calls to no-op super constructors. */ public static class EmptySuperCallVisitor extends JModVisitor { @Override public void endVisit(JExpressionStatement x, Context ctx) { if (x.getExpr() instanceof JMethodCall && !(x.getExpr() instanceof JNewInstance)) { JMethodCall call = (JMethodCall) x.getExpr(); if (call.getTarget() instanceof JConstructor) { JConstructor ctor = (JConstructor) call.getTarget(); if (ctor.isEmpty()) { // TODO: move this 3-way into Simplifier. if (call.getArgs().isEmpty()) { ctx.removeMe(); } else if (call.getArgs().size() == 1) { ctx.replaceMe(call.getArgs().get(0).makeStatement()); } else { JMultiExpression multi = new JMultiExpression(call.getSourceInfo()); multi.exprs.addAll(call.getArgs()); ctx.replaceMe(multi.makeStatement()); } } } } } } public static boolean exec(JProgram program) { EmptySuperCallVisitor v = new EmptySuperCallVisitor(); v.accept(program); return v.didChange(); } }