001 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 002 // for details. All rights reserved. Use of this source code is governed by a 003 // BSD-style license that can be found in the LICENSE file. 004 005 package com.google.dart.compiler.util; 006 007 import com.google.dart.compiler.backend.js.ast.*; 008 import com.intellij.util.SmartList; 009 import org.jetbrains.annotations.NotNull; 010 import org.jetbrains.annotations.Nullable; 011 012 import java.util.ArrayList; 013 import java.util.List; 014 015 public final class AstUtil { 016 private AstUtil() { 017 } 018 019 /** 020 * Returns a sequence of expressions (using the binary sequence operator). 021 * 022 * @param exprs - expressions to add to sequence 023 * @return a sequence of expressions. 024 */ 025 public static JsBinaryOperation newSequence(JsExpression... exprs) { 026 if (exprs.length < 2) { 027 throw new RuntimeException("newSequence expects at least two arguments"); 028 } 029 JsExpression result = exprs[exprs.length - 1]; 030 for (int i = exprs.length - 2; i >= 0; i--) { 031 result = new JsBinaryOperation(JsBinaryOperator.COMMA, exprs[i], result); 032 } 033 return (JsBinaryOperation) result; 034 } 035 036 @Nullable 037 public static <T extends JsNode> T deepCopy(@Nullable T node) { 038 if (node == null) return null; 039 040 //noinspection unchecked 041 return (T) node.deepCopy(); 042 } 043 044 @NotNull 045 public static <T extends JsNode> List<T> deepCopy(@Nullable List<T> nodes) { 046 if (nodes == null) return new SmartList<T>(); 047 048 List<T> nodesCopy = new ArrayList<T>(nodes.size()); 049 for (T node : nodes) { 050 nodesCopy.add(deepCopy(node)); 051 } 052 053 return nodesCopy; 054 } 055 056 @NotNull 057 public static JsFunctionScope toFunctionScope(JsScope scope) { 058 assert scope instanceof JsFunctionScope: "JsFunctionScope type is expected, but " 059 + scope.getClass().getSimpleName() + " is found"; 060 061 return (JsFunctionScope) scope; 062 } 063 }