/*
 * Copyright 2007 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.js;

import com.google.gwt.dev.js.ast.JsStatement;
import com.google.gwt.dev.js.ast.JsVisitable;
import com.google.gwt.dev.js.ast.JsVisitor;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

class FlatteningVisitor extends JsVisitor {

  public static TreeNode exec(List<JsStatement> statements) {
    FlatteningVisitor visitor = new FlatteningVisitor();
    visitor.acceptList(statements);
    return visitor.root;
  }

  public static class TreeNode {
    public final JsVisitable node;
    public final List<TreeNode> children = new ArrayList<TreeNode>();

    public TreeNode(JsVisitable node) {
      this.node = node;
    }
  }

  private TreeNode root;

  private FlatteningVisitor() {
    root = new TreeNode(null);
  }

  @Override
  protected <T extends JsVisitable> T doAccept(T node) {
    TreeNode oldRoot = root;
    root = new TreeNode(node);
    oldRoot.children.add(root);
    super.doAccept(node);
    root = oldRoot;
    return node;
  }

  @Override
  protected <T extends JsVisitable> void doAcceptList(List<T> collection) {
    for (Iterator<T> it = collection.iterator(); it.hasNext();) {
      doAccept(it.next());
    }
  }
}
