/*
 * 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();
  }
}
