From 8bfa313ad426c99e5857653c02360ed705ddf193 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Mon, 27 Feb 2012 18:49:54 +0400 Subject: [PATCH] switched to using dartc.jar deleted module js.ast --- js/js.ast/AUTHORS | 8 - js/js.ast/LICENSE | 48 - js/js.ast/PATENTS | 23 - js/js.ast/js.ast.iml | 14 - js/js.ast/js.iml | 13 - .../compiler/InternalCompilerException.java | 15 - .../src/com/google/dart/compiler/Source.java | 44 - .../dart/compiler/backend/js/Cloner.java | 232 --- .../js/JsConstructExpressionVisitor.java | 104 -- .../backend/js/JsFirstExpressionVisitor.java | 119 -- .../dart/compiler/backend/js/JsNamer.java | 23 - .../compiler/backend/js/JsNormalizer.java | 103 -- .../backend/js/JsParserException.java | 92 -- .../backend/js/JsPrecedenceVisitor.java | 274 ---- .../compiler/backend/js/JsPrettyNamer.java | 122 -- .../backend/js/JsRequiresSemiVisitor.java | 140 -- .../backend/js/JsReservedIdentifiers.java | 223 --- .../backend/js/JsSourceGenerationVisitor.java | 39 - .../js/JsToStringGenerationVisitor.java | 1331 ----------------- .../js/UncheckedJsParserException.java | 21 - .../backend/js/ast/CanBooleanEval.java | 15 - .../compiler/backend/js/ast/HasArguments.java | 14 - .../compiler/backend/js/ast/HasCondition.java | 15 - .../dart/compiler/backend/js/ast/HasName.java | 12 - .../backend/js/ast/JsArrayAccess.java | 68 - .../backend/js/ast/JsArrayLiteral.java | 67 - .../backend/js/ast/JsBinaryOperation.java | 107 -- .../backend/js/ast/JsBinaryOperator.java | 120 -- .../dart/compiler/backend/js/ast/JsBlock.java | 60 - .../backend/js/ast/JsBooleanLiteral.java | 53 - .../dart/compiler/backend/js/ast/JsBreak.java | 46 - .../dart/compiler/backend/js/ast/JsCase.java | 39 - .../dart/compiler/backend/js/ast/JsCatch.java | 66 - .../compiler/backend/js/ast/JsCatchScope.java | 75 - .../backend/js/ast/JsConditional.java | 78 - .../compiler/backend/js/ast/JsContext.java | 27 - .../compiler/backend/js/ast/JsContinue.java | 46 - .../compiler/backend/js/ast/JsDebugger.java | 25 - .../compiler/backend/js/ast/JsDefault.java | 28 - .../compiler/backend/js/ast/JsDoWhile.java | 54 - .../dart/compiler/backend/js/ast/JsEmpty.java | 26 - .../compiler/backend/js/ast/JsExprStmt.java | 36 - .../compiler/backend/js/ast/JsExpression.java | 52 - .../dart/compiler/backend/js/ast/JsFor.java | 105 -- .../dart/compiler/backend/js/ast/JsForIn.java | 71 - .../compiler/backend/js/ast/JsFunction.java | 238 --- .../backend/js/ast/JsGlobalBlock.java | 19 - .../dart/compiler/backend/js/ast/JsIf.java | 65 - .../compiler/backend/js/ast/JsInvocation.java | 73 - .../dart/compiler/backend/js/ast/JsLabel.java | 45 - .../compiler/backend/js/ast/JsLiteral.java | 14 - .../compiler/backend/js/ast/JsModVisitor.java | 189 --- .../dart/compiler/backend/js/ast/JsName.java | 102 -- .../compiler/backend/js/ast/JsNameRef.java | 113 -- .../dart/compiler/backend/js/ast/JsNew.java | 66 - .../dart/compiler/backend/js/ast/JsNode.java | 50 - .../backend/js/ast/JsNullLiteral.java | 46 - .../backend/js/ast/JsNumberLiteral.java | 53 - .../backend/js/ast/JsObjectLiteral.java | 72 - .../compiler/backend/js/ast/JsOperator.java | 32 - .../compiler/backend/js/ast/JsParameter.java | 34 - .../backend/js/ast/JsPostfixOperation.java | 42 - .../backend/js/ast/JsPrefixOperation.java | 69 - .../compiler/backend/js/ast/JsProgram.java | 174 --- .../backend/js/ast/JsProgramFragment.java | 34 - .../backend/js/ast/JsPropertyInitializer.java | 56 - .../compiler/backend/js/ast/JsRegExp.java | 64 - .../compiler/backend/js/ast/JsReturn.java | 48 - .../compiler/backend/js/ast/JsRootScope.java | 50 - .../dart/compiler/backend/js/ast/JsScope.java | 308 ---- .../compiler/backend/js/ast/JsStatement.java | 22 - .../backend/js/ast/JsStringLiteral.java | 53 - .../compiler/backend/js/ast/JsSwitch.java | 47 - .../backend/js/ast/JsSwitchMember.java | 24 - .../compiler/backend/js/ast/JsThisRef.java | 51 - .../dart/compiler/backend/js/ast/JsThrow.java | 48 - .../dart/compiler/backend/js/ast/JsTry.java | 59 - .../backend/js/ast/JsUnaryOperation.java | 53 - .../backend/js/ast/JsUnaryOperator.java | 78 - .../backend/js/ast/JsValueLiteral.java | 24 - .../dart/compiler/backend/js/ast/JsVars.java | 109 -- .../compiler/backend/js/ast/JsVisitable.java | 19 - .../compiler/backend/js/ast/JsVisitor.java | 430 ------ .../dart/compiler/backend/js/ast/JsWhile.java | 52 - .../compiler/backend/js/ast/NodeKind.java | 50 - .../dart/compiler/common/AbstractNode.java | 81 - .../dart/compiler/common/HasSourceInfo.java | 55 - .../com/google/dart/compiler/common/Name.java | 121 -- .../dart/compiler/common/NameFactory.java | 226 --- .../dart/compiler/common/SourceInfo.java | 58 - .../compiler/util/AbstractTextOutput.java | 132 -- .../google/dart/compiler/util/AstUtil.java | 404 ----- .../dart/compiler/util/DefaultTextOutput.java | 32 - .../com/google/dart/compiler/util/Hack.java | 16 - .../com/google/dart/compiler/util/Lists.java | 291 ---- .../com/google/dart/compiler/util/Maps.java | 160 -- .../com/google/dart/compiler/util/Paths.java | 100 -- .../google/dart/compiler/util/TextOutput.java | 37 - .../translate/context/DynamicContext.java | 8 +- .../k2js/translate/context/Namer.java | 11 +- .../k2js/translate/context/NamingScope.java | 20 +- .../k2js/translate/context/StaticContext.java | 45 +- .../translate/context/TranslationContext.java | 12 +- .../ClassDeclarationTranslator.java | 16 +- .../declaration/ClassTranslator.java | 11 +- .../declaration/NamespaceTranslator.java | 12 +- .../declaration/PropertyTranslator.java | 30 +- .../expression/ExpressionVisitor.java | 37 +- .../expression/FunctionTranslator.java | 26 +- .../expression/PatternTranslator.java | 19 +- .../expression/StringTemplateTranslator.java | 6 +- .../translate/expression/TryTranslator.java | 2 +- .../translate/expression/WhenTranslator.java | 34 +- .../foreach/ArrayForTranslator.java | 11 +- .../foreach/IteratorForTranslator.java | 8 +- .../foreach/RangeForTranslator.java | 14 +- .../foreach/RangeLiteralForTranslator.java | 9 +- .../k2js/translate/general/Translation.java | 11 +- .../ClassInitializerTranslator.java | 13 +- .../NamespaceInitializerTranslator.java | 7 +- .../ArrayFunctionConstructorIntrinsic.java | 4 +- .../array/ArrayNullConstructorIntrinsic.java | 4 +- .../intrinsic/array/ArraySizeIntrinsic.java | 4 +- .../primitive/PrimitiveEqualsIntrinsic.java | 12 +- .../primitive/PrimitiveRangeToIntrinsic.java | 9 +- .../intrinsic/string/CharAtIntrinsic.java | 7 +- .../intrinsic/string/LengthIntrinsic.java | 4 +- .../operation/BinaryOperationTranslator.java | 8 +- .../OverloadedAssignmentTranslator.java | 3 +- .../OverloadedIncrementTranslator.java | 5 +- .../translate/reference/CallTranslator.java | 17 +- .../k2js/translate/reference/CallType.java | 4 +- .../NativePropertyAccessTranslator.java | 10 +- .../reference/ReferenceTranslator.java | 7 +- .../k2js/translate/utils/JsAstUtils.java | 288 ++++ js/k2js.iml | 15 - 136 files changed, 574 insertions(+), 9370 deletions(-) delete mode 100644 js/js.ast/AUTHORS delete mode 100644 js/js.ast/LICENSE delete mode 100644 js/js.ast/PATENTS delete mode 100644 js/js.ast/js.ast.iml delete mode 100644 js/js.ast/js.iml delete mode 100644 js/js.ast/src/com/google/dart/compiler/InternalCompilerException.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/Source.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/Cloner.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsConstructExpressionVisitor.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsFirstExpressionVisitor.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsNamer.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsNormalizer.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsParserException.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsPrecedenceVisitor.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsPrettyNamer.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsRequiresSemiVisitor.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsReservedIdentifiers.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsSourceGenerationVisitor.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/UncheckedJsParserException.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/CanBooleanEval.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasArguments.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasCondition.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasName.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsArrayAccess.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsArrayLiteral.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBinaryOperation.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBinaryOperator.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBlock.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBooleanLiteral.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBreak.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCase.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCatch.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCatchScope.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsConditional.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsContext.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsContinue.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDebugger.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDefault.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDoWhile.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsEmpty.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsExprStmt.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsExpression.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsFor.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsForIn.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsFunction.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsGlobalBlock.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsIf.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsInvocation.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsLabel.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsLiteral.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsModVisitor.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsName.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNameRef.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNew.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNode.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNullLiteral.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNumberLiteral.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsObjectLiteral.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsOperator.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsParameter.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPostfixOperation.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPrefixOperation.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsProgram.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsProgramFragment.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPropertyInitializer.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsRegExp.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsReturn.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsRootScope.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsScope.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsStatement.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsStringLiteral.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsSwitch.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsSwitchMember.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsThisRef.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsThrow.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsTry.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsUnaryOperation.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsUnaryOperator.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsValueLiteral.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVars.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVisitable.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVisitor.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsWhile.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/backend/js/ast/NodeKind.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/common/AbstractNode.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/common/HasSourceInfo.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/common/Name.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/common/NameFactory.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/common/SourceInfo.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/util/AbstractTextOutput.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/util/AstUtil.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/util/DefaultTextOutput.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/util/Hack.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/util/Lists.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/util/Maps.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/util/Paths.java delete mode 100644 js/js.ast/src/com/google/dart/compiler/util/TextOutput.java create mode 100644 js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java delete mode 100644 js/k2js.iml diff --git a/js/js.ast/AUTHORS b/js/js.ast/AUTHORS deleted file mode 100644 index fea9b245e9a..00000000000 --- a/js/js.ast/AUTHORS +++ /dev/null @@ -1,8 +0,0 @@ -# Below is a list of people and organizations that have contributed -# to the Dart project. Names should be added to the list like so: -# -# Name/Organization - -Google Inc. - -Ola Martin Bini diff --git a/js/js.ast/LICENSE b/js/js.ast/LICENSE deleted file mode 100644 index 64ed1a49724..00000000000 --- a/js/js.ast/LICENSE +++ /dev/null @@ -1,48 +0,0 @@ -This license applies to all parts of Dart that are not externally -maintained libraries. The external maintained libraries used by -Dart are: - -JSCRE - in runtime/third_party/jscre -Ant - in third_party/apache_ant -Google App Engine for Java SDK - in third_party/appengine-java-sdk -args4j - in third_party/args4j -Chrome SDK - in third_party/chromesdk -Eclipse - in third_party/eclipse -gsutil = in third_party/gsutil -Guava - in third_party/guava -hamcrest - in third_party/hamcrest -Httplib2 - in third_party/httplib2 -Jetty - in third_party/jetty -JSON - in third_party/json -JUnit - in third_party/junit -Ouath - in third_party/oauth2client -Python-scss - in third_party/pyscss -Rhino - in third_party/rhino - -The libraries may have their own licenses; we recommend you read them, -as their terms may differ from the terms below. - -Copyright 2011, the Dart project authors. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/js/js.ast/PATENTS b/js/js.ast/PATENTS deleted file mode 100644 index 69541968b91..00000000000 --- a/js/js.ast/PATENTS +++ /dev/null @@ -1,23 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Dart Project. - -Google hereby grants to you a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this -section) patent license to make, have made, use, offer to sell, sell, -import, transfer, and otherwise run, modify and propagate the contents -of this implementation of Dart, where such license applies only to -those patent claims, both currently owned by Google and acquired in -the future, licensable by Google that are necessarily infringed by -this implementation of Dart. This grant does not include claims that -would be infringed only as a consequence of further modification of -this implementation. If you or your agent or exclusive licensee -institute or order or agree to the institution of patent litigation -against any entity (including a cross-claim or counterclaim in a -lawsuit) alleging that this implementation of Dart or any code -incorporated within this implementation of Dart constitutes direct or -contributory patent infringement, or inducement of patent -infringement, then any patent rights granted to you under this License -for this implementation of Dart shall terminate as of the date such -litigation is filed. diff --git a/js/js.ast/js.ast.iml b/js/js.ast/js.ast.iml deleted file mode 100644 index ae7a0c83664..00000000000 --- a/js/js.ast/js.ast.iml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/js/js.ast/js.iml b/js/js.ast/js.iml deleted file mode 100644 index 1e3480a2bfb..00000000000 --- a/js/js.ast/js.iml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/js/js.ast/src/com/google/dart/compiler/InternalCompilerException.java b/js/js.ast/src/com/google/dart/compiler/InternalCompilerException.java deleted file mode 100644 index 5db265e920a..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/InternalCompilerException.java +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler; - -/** - * Exception thrown when the compiler encounters an unexpected internal error. - */ -public class InternalCompilerException extends RuntimeException { - - public InternalCompilerException(String message) { - super(message); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/Source.java b/js/js.ast/src/com/google/dart/compiler/Source.java deleted file mode 100644 index 13e6e16cbdd..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/Source.java +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler; - -import java.io.IOException; -import java.io.Reader; -import java.net.URI; - -/** - * Abstract interface to a source file. - */ -public interface Source { - - /** - * Determines whether the given source exists. - */ - boolean exists(); - - /** - * Returns the last-modified timestamp for this source, using the same units as - * {@link java.util.Date#getTime()}. - */ - long getLastModified(); - - /** - * Gets the name of this source. - */ - String getName(); - - /** - * Gets a reader for the dart file's source code. The caller is responsible for closing the - * returned reader. - */ - Reader getSourceReader() throws IOException; - - /** - * Gets the identifier for this source. This is used to uniquely identify the - * source, but should not be used to obtain the source content. Use - * {@link #getSourceReader()} to obtain the source content. - */ - URI getUri(); -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/Cloner.java b/js/js.ast/src/com/google/dart/compiler/backend/js/Cloner.java deleted file mode 100644 index fa3447fe168..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/Cloner.java +++ /dev/null @@ -1,232 +0,0 @@ -// Copyright 2011, the Dart project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -package com.google.dart.compiler.backend.js; - -import com.google.dart.compiler.InternalCompilerException; -import com.google.dart.compiler.backend.js.ast.*; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -/** - * Implements actual cloning logic. We rely on the JsExpressions to provide - * traversal logic. The {@link #stack} field is used to accumulate - * already-cloned JsExpression instances. One gotcha that falls out of this is - * that argument lists are on the stack in reverse order, so lists should be - * constructed via inserts, rather than appends. - */ -public class Cloner extends JsVisitor { - protected final Stack stack = new Stack(); - private boolean successful = true; - - /** - * @param expression - * @return Return a clone of the expression tree - */ - public static JsExpression clone(JsExpression expression) { - Cloner c = new Cloner(); - c.accept(expression); - return c.getExpression(); - } - - @Override - public void endVisit(JsArrayAccess x, JsContext ctx) { - JsArrayAccess newExpression = new JsArrayAccess(); - newExpression.setIndexExpr(stack.pop()); - newExpression.setArrayExpr(stack.pop()); - stack.push(newExpression); - } - - @Override - public void endVisit(JsArrayLiteral x, JsContext ctx) { - JsArrayLiteral toReturn = new JsArrayLiteral(); - List expressions = toReturn.getExpressions(); - int size = x.getExpressions().size(); - while (size-- > 0) { - expressions.add(0, stack.pop()); - } - stack.push(toReturn); - } - - @Override - public void endVisit(JsBinaryOperation x, JsContext ctx) { - JsBinaryOperation toReturn = new JsBinaryOperation(x.getOperator()); - toReturn.setArg2(stack.pop()); - toReturn.setArg1(stack.pop()); - stack.push(toReturn); - } - - @Override - public void endVisit(JsBooleanLiteral x, JsContext ctx) { - stack.push(x); - } - - @Override - public void endVisit(JsConditional x, JsContext ctx) { - JsConditional toReturn = new JsConditional(); - toReturn.setElseExpression(stack.pop()); - toReturn.setThenExpression(stack.pop()); - toReturn.setTestExpression(stack.pop()); - stack.push(toReturn); - } - - /** - * The only functions that would get be visited are those being used as - * first-class objects. - */ - @Override - public void endVisit(JsFunction x, JsContext ctx) { - // Set a flag to indicate that we cannot continue, and push a null so - // we don't run out of elements on the stack. - successful = false; - stack.push(null); - } - - /** - * Cloning the invocation allows us to modify it without damaging other call - * sites. - */ - @Override - public void endVisit(JsInvocation x, JsContext ctx) { - JsInvocation toReturn = new JsInvocation(); - List params = toReturn.getArguments(); - int size = x.getArguments().size(); - while (size-- > 0) { - params.add(0, stack.pop()); - } - toReturn.setQualifier(stack.pop()); - stack.push(toReturn); - } - - /** - * Do a deep clone of a JsNameRef. Because JsNameRef chains are shared - * throughout the AST, you can't just go and change their qualifiers when - * re-writing an invocation. - */ - @Override - public void endVisit(JsNameRef x, JsContext ctx) { - JsNameRef toReturn; - JsName name = x.getName(); - if (name != null) { - toReturn = new JsNameRef(name); - } else { - toReturn = new JsNameRef(x.getIdent()); - } - - if (x.getQualifier() != null) { - toReturn.setQualifier(stack.pop()); - } - stack.push(toReturn); - } - - @Override - public void endVisit(JsNew x, JsContext ctx) { - int size = x.getArguments().size(); - List arguments = new ArrayList(size); - while (size-- > 0) { - arguments.add(0, stack.pop()); - } - JsNew toReturn = new JsNew(stack.pop()); - toReturn.getArguments().addAll(arguments); - stack.push(toReturn); - } - - @Override - public void endVisit(JsNullLiteral x, JsContext ctx) { - stack.push(x); - } - - @Override - public void endVisit(JsNumberLiteral x, JsContext ctx) { - stack.push(x); - } - - @Override - public void endVisit(JsObjectLiteral x, JsContext ctx) { - JsObjectLiteral toReturn = new JsObjectLiteral(); - List inits = toReturn.getPropertyInitializers(); - - int size = x.getPropertyInitializers().size(); - while (size-- > 0) { - /* - * JsPropertyInitializers are the only non-JsExpression objects that we - * care about, so we just go ahead and create the objects in the loop, - * rather than expecting it to be on the stack and having to perform - * narrowing casts at all stack.pop() invocations. - */ - JsPropertyInitializer newInit = new JsPropertyInitializer(); - newInit.setValueExpr(stack.pop()); - newInit.setLabelExpr(stack.pop()); - - inits.add(0, newInit); - } - stack.push(toReturn); - } - - @Override - public void endVisit(JsPostfixOperation x, JsContext ctx) { - JsPostfixOperation toReturn = new JsPostfixOperation(x.getOperator()); - toReturn.setArg(stack.pop()); - stack.push(toReturn); - } - - @Override - public void endVisit(JsPrefixOperation x, JsContext ctx) { - JsPrefixOperation toReturn = new JsPrefixOperation(x.getOperator()); - toReturn.setArg(stack.pop()); - stack.push(toReturn); - } - - @Override - public void endVisit(JsRegExp x, JsContext ctx) { - stack.push(x); - } - - @Override - public void endVisit(JsStringLiteral x, JsContext ctx) { - stack.push(x); - } - - @Override - public void endVisit(JsThisRef x, JsContext ctx) { - stack.push(new JsThisRef()); - } - - public JsExpression getExpression() { - return (successful && checkStack()) ? stack.peek() : null; - } - - private boolean checkStack() { - if (stack.size() > 1) { - throw new InternalCompilerException("Too many expressions on stack"); - } - - return stack.size() == 1; - } -} - diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsConstructExpressionVisitor.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsConstructExpressionVisitor.java deleted file mode 100644 index a15af6b44ed..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsConstructExpressionVisitor.java +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -import com.google.dart.compiler.backend.js.ast.*; - -/** - * Searches for method invocations in constructor expressions that would not - * normally be surrounded by parentheses. - */ -public class JsConstructExpressionVisitor extends JsVisitor { - - public static boolean exec(JsExpression expression) { - if (JsPrecedenceVisitor.exec(expression) < JsPrecedenceVisitor.PRECEDENCE_NEW) { - return true; - } - JsConstructExpressionVisitor visitor = new JsConstructExpressionVisitor(); - visitor.accept(expression); - return visitor.containsInvocation; - } - - private boolean containsInvocation = false; - - private JsConstructExpressionVisitor() { - } - - /** - * We only look at the array expression since the index has its own scope. - */ - @Override - public boolean visit(JsArrayAccess x, JsContext ctx) { - accept(x.getArrayExpr()); - return false; - } - - /** - * Array literals have their own scoping. - */ - @Override - public boolean visit(JsArrayLiteral x, JsContext ctx) { - return false; - } - - /** - * Functions have their own scoping. - */ - @Override - public boolean visit(JsFunction x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsInvocation x, JsContext ctx) { - containsInvocation = true; - return false; - } - - @Override - public boolean visit(JsNameRef x, JsContext ctx) { - if (!x.isLeaf()) { - accept(x.getQualifier()); - } - return false; - } - - /** - * New constructs bind to the nearest set of parentheses. - */ - @Override - public boolean visit(JsNew x, JsContext ctx) { - return false; - } - - /** - * Object literals have their own scope. - */ - @Override - public boolean visit(JsObjectLiteral x, JsContext ctx) { - return false; - } - - /** - * We only look at nodes that would not normally be surrounded by parentheses. - */ - @Override - protected T doAccept(T node) { - // Assign to Object to prevent 'inconvertible types' toJsAst errors due - // to http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6548436 - // reproducible in jdk1.6.0_02. - Object o = node; - if (o instanceof JsExpression) { - JsExpression expression = (JsExpression) o; - int precedence = JsPrecedenceVisitor.exec(expression); - // Only visit expressions that won't automatically be surrounded by - // parentheses - if (precedence < JsPrecedenceVisitor.PRECEDENCE_NEW) { - return node; - } - } - return super.doAccept(node); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsFirstExpressionVisitor.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsFirstExpressionVisitor.java deleted file mode 100644 index 0fdb8a5032b..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsFirstExpressionVisitor.java +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -import com.google.dart.compiler.backend.js.ast.*; - -/** - * Determines if an expression statement needs to be surrounded by parentheses. - * - * The statement or the left-most expression needs to be surrounded by - * parentheses if the left-most expression is an object literal or a function - * object. Function declarations do not need parentheses. - * - * For example the following require parentheses:
- *
    - *
  • { key : 'value'}
  • - *
  • { key : 'value'}.key
  • - *
  • function () {return 1;}()
  • - *
  • function () {return 1;}.prototype
  • - *
- * - * The following do not require parentheses:
- *
    - *
  • var x = { key : 'value'}
  • - *
  • "string" + { key : 'value'}.key
  • - *
  • function func() {}
  • - *
  • function() {}
  • - *
- */ -public class JsFirstExpressionVisitor extends JsVisitor { - - public static boolean exec(JsExprStmt statement) { - JsFirstExpressionVisitor visitor = new JsFirstExpressionVisitor(); - JsExpression expression = statement.getExpression(); - // Pure function declarations do not need parentheses - if (expression instanceof JsFunction) { - return false; - } - visitor.accept(statement.getExpression()); - return visitor.needsParentheses; - } - - private boolean needsParentheses = false; - - private JsFirstExpressionVisitor() { - } - - @Override - public boolean visit(JsArrayAccess x, JsContext ctx) { - accept(x.getArrayExpr()); - return false; - } - - @Override - public boolean visit(JsArrayLiteral x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsBinaryOperation x, JsContext ctx) { - accept(x.getArg1()); - return false; - } - - @Override - public boolean visit(JsConditional x, JsContext ctx) { - accept(x.getTestExpression()); - return false; - } - - @Override - public boolean visit(JsFunction x, JsContext ctx) { - needsParentheses = true; - return false; - } - - @Override - public boolean visit(JsInvocation x, JsContext ctx) { - accept(x.getQualifier()); - return false; - } - - @Override - public boolean visit(JsNameRef x, JsContext ctx) { - if (!x.isLeaf()) { - accept(x.getQualifier()); - } - return false; - } - - @Override - public boolean visit(JsNew x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsObjectLiteral x, JsContext ctx) { - needsParentheses = true; - return false; - } - - @Override - public boolean visit(JsPostfixOperation x, JsContext ctx) { - accept(x.getArg()); - return false; - } - - @Override - public boolean visit(JsPrefixOperation x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsRegExp x, JsContext ctx) { - return false; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsNamer.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsNamer.java deleted file mode 100644 index 0c49ad05750..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsNamer.java +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -import com.google.dart.compiler.backend.js.ast.JsProgram; - -/** - * A namer runs through a program and renames the short names of JsNames. - * Namers must assign short names that don't clash and that are valid - * JS-identifiers. Nested JsScopes must not shadow JsNames from outer - * scopes. - * If a JsName is marked as non-obfuscatable then it must retain its short - * name. - */ -public interface JsNamer { - /** - * GlobalNames the shortNames of all JsNames of the program so that they are valid - * JS-identifiers and that there are no clashes and no shadowing. - */ - public void exec(JsProgram program); -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsNormalizer.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsNormalizer.java deleted file mode 100644 index 04c5530cd42..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsNormalizer.java +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -import com.google.dart.compiler.backend.js.ast.*; - -/** - * Fixes any semantic errors introduced by JS AST gen. - * - *
    - *
  • Creating clinit calls can put comma expressions as lvalues; the modifying - * operation must be moved inside the comma expression to the last argument.
  • - *
- */ -public class JsNormalizer { - - /** - * Resolves any unresolved JsNameRefs. - */ - private static class JsNormalizing extends JsModVisitor { - - @Override - public void endVisit(JsBinaryOperation x, JsContext ctx) { - maybeShuffleModifyingBinary(x, ctx); - } - - @Override - public void endVisit(JsPostfixOperation x, JsContext ctx) { - maybeShuffleModifyingUnary(x, ctx); - } - - @Override - public void endVisit(JsPrefixOperation x, JsContext ctx) { - maybeShuffleModifyingUnary(x, ctx); - } - - /** - * Due to the way clinits are constructed, you can end up with a comma - * operation as the argument to a modifying operation, which is illegal. - * Juggle things to put the operator inside of the comma expression. - */ - private void maybeShuffleModifyingBinary(JsBinaryOperation x, JsContext ctx) { - JsBinaryOperator myOp = x.getOperator(); - JsExpression lhs = x.getArg1(); - - if (myOp.isAssignment() && (lhs instanceof JsBinaryOperation)) { - // Find the rightmost comma operation - JsBinaryOperation curLhs = (JsBinaryOperation) lhs; - assert (curLhs.getOperator() == JsBinaryOperator.COMMA); - while (curLhs.getArg2() instanceof JsBinaryOperation) { - curLhs = (JsBinaryOperation) curLhs.getArg2(); - assert (curLhs.getOperator() == JsBinaryOperator.COMMA); - } - // curLhs is now the rightmost comma operation; slide our operation in - x.setArg1(curLhs.getArg2()); - curLhs.setArg2(x); - // replace myself with the comma expression - ctx.replaceMe(lhs); - } - } - - /** - * Due to the way clinits are constructed, you can end up with a comma - * operation as the argument to a modifying operation, which is illegal. - * Juggle things to put the operator inside of the comma expression. - */ - private void maybeShuffleModifyingUnary(JsUnaryOperation x, JsContext ctx) { - JsUnaryOperator myOp = x.getOperator(); - JsExpression arg = x.getArg(); - if (myOp.isModifying() && (arg instanceof JsBinaryOperation)) { - // Find the rightmost comma operation - JsBinaryOperation curArg = (JsBinaryOperation) arg; - assert (curArg.getOperator() == JsBinaryOperator.COMMA); - while (curArg.getArg2() instanceof JsBinaryOperation) { - curArg = (JsBinaryOperation) curArg.getArg2(); - assert (curArg.getOperator() == JsBinaryOperator.COMMA); - } - // curArg is now the rightmost comma operation; slide our operation in - x.setArg(curArg.getArg2()); - curArg.setArg2(x); - // replace myself with the comma expression - ctx.replaceMe(arg); - } - } - } - - public static void exec(JsProgram program) { - new JsNormalizer(program).execImpl(); - } - - private final JsProgram program; - - private JsNormalizer(JsProgram program) { - this.program = program; - } - - private void execImpl() { - JsNormalizing normalizer = new JsNormalizing(); - normalizer.accept(program); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsParserException.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsParserException.java deleted file mode 100644 index 79b53c1d69e..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsParserException.java +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -/** - * Indicates inability to parse JavaScript source. - */ -public class JsParserException extends Exception { - - /** - * Represents the location of a parser exception. - */ - public static class SourceDetail { - private final String fileName; - private final int line; - private final int lineOffset; - private final String lineSource; - - public SourceDetail(int line, String lineSource, int lineOffset, String fileName) { - this.line = line; - this.lineSource = lineSource; - this.lineOffset = lineOffset; - this.fileName = fileName; - } - - public String getFileName() { - return fileName; - } - - public int getLine() { - return line; - } - - public int getLineOffset() { - return lineOffset; - } - - public String getLineSource() { - return lineSource; - } - } - - private static String createMessageWithDetail(String msg, SourceDetail sourceDetail) { - if (sourceDetail == null) { - return msg; - } - StringBuffer sb = new StringBuffer(); - sb.append(sourceDetail.getFileName()); - sb.append('('); - sb.append(sourceDetail.getLine()); - sb.append(')'); - sb.append(": "); - sb.append(msg); - if (sourceDetail.getLineSource() != null) { - sb.append("\n> "); - sb.append(sourceDetail.getLineSource()); - sb.append("\n> "); - for (int i = 0, n = sourceDetail.getLineOffset(); i < n; ++i) { - sb.append('-'); - } - sb.append('^'); - } - return sb.toString(); - } - - private final SourceDetail sourceDetail; - - public JsParserException(String msg) { - this(msg, null); - } - - public JsParserException(String msg, int line, String lineSource, int lineOffset, String fileName) { - this(msg, new SourceDetail(line, lineSource, lineOffset, fileName)); - } - - public JsParserException(String msg, SourceDetail sourceDetail) { - super(createMessageWithDetail(msg, sourceDetail)); - this.sourceDetail = sourceDetail; - } - - /** - * Provides additional source detail in some cases. - * - * @return additional detail regarding the error, or null if no - * additional detail is available - */ - public SourceDetail getSourceDetail() { - return sourceDetail; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsPrecedenceVisitor.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsPrecedenceVisitor.java deleted file mode 100644 index c3a58b64e22..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsPrecedenceVisitor.java +++ /dev/null @@ -1,274 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -import com.google.dart.compiler.backend.js.ast.*; - -/** - * Precedence indices from "JavaScript - The Definitive Guide" 4th Edition (page - * 57) - * - * Precedence 17 is for indivisible primaries that either don't have children, - * or provide their own delimiters. - * - * Precedence 16 is for really important things that have their own AST classes. - * - * Precedence 15 is for the new construct. - * - * Precedence 14 is for unary operators. - * - * Precedences 12 through 4 are for non-assigning binary operators. - * - * Precedence 3 is for the tertiary conditional. - * - * Precedence 2 is for assignments. - * - * Precedence 1 is for comma operations. - */ -class JsPrecedenceVisitor extends JsVisitor { - - static final int PRECEDENCE_NEW = 15; - - public static int exec(JsExpression expression) { - JsPrecedenceVisitor visitor = new JsPrecedenceVisitor(); - visitor.accept(expression); - if (visitor.answer < 0) { - throw new RuntimeException("Precedence must be >= 0!"); - } - return visitor.answer; - } - - private int answer = -1; - - private JsPrecedenceVisitor() { - } - - @Override - public boolean visit(JsArrayAccess x, JsContext ctx) { - answer = 16; - return false; - } - - @Override - public boolean visit(JsArrayLiteral x, JsContext ctx) { - answer = 17; // primary - return false; - } - - @Override - public boolean visit(JsBinaryOperation x, JsContext ctx) { - answer = x.getOperator().getPrecedence(); - return false; - } - - @Override - public boolean visit(JsBlock x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsBooleanLiteral x, JsContext ctx) { - answer = 17; // primary - return false; - } - - @Override - public boolean visit(JsBreak x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsCase x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsCatch x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsConditional x, JsContext ctx) { - answer = 3; - return false; - } - - @Override - public boolean visit(JsContinue x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsDebugger x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsDefault x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsDoWhile x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsEmpty x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsExprStmt x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsFor x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsForIn x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsFunction x, JsContext ctx) { - answer = 17; // primary - return false; - } - - @Override - public boolean visit(JsIf x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsInvocation x, JsContext ctx) { - answer = 16; - return false; - } - - @Override - public boolean visit(JsLabel x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsNameRef x, JsContext ctx) { - if (x.isLeaf()) { - answer = 17; // primary - } else { - answer = 16; // property access - } - return false; - } - - @Override - public boolean visit(JsNew x, JsContext ctx) { - answer = PRECEDENCE_NEW; - return false; - } - - @Override - public boolean visit(JsNullLiteral x, JsContext ctx) { - answer = 17; // primary - return false; - } - - @Override - public boolean visit(JsNumberLiteral x, JsContext ctx) { - answer = 17; // primary - return false; - } - - @Override - public boolean visit(JsObjectLiteral x, JsContext ctx) { - answer = 17; // primary - return false; - } - - @Override - public boolean visit(JsParameter x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsPostfixOperation x, JsContext ctx) { - answer = x.getOperator().getPrecedence(); - return false; - } - - @Override - public boolean visit(JsPrefixOperation x, JsContext ctx) { - answer = x.getOperator().getPrecedence(); - return false; - } - - @Override - public boolean visit(JsProgram x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsPropertyInitializer x, JsContext ctx) { - answer = 17; // primary - return false; - } - - @Override - public boolean visit(JsRegExp x, JsContext ctx) { - answer = 17; // primary - return false; - } - - @Override - public boolean visit(JsReturn x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsStringLiteral x, JsContext ctx) { - answer = 17; // primary - return false; - } - - @Override - public boolean visit(JsSwitch x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsThisRef x, JsContext ctx) { - answer = 17; // primary - return false; - } - - @Override - public boolean visit(JsThrow x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsTry x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsVars.JsVar x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsVars x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } - - @Override - public boolean visit(JsWhile x, JsContext ctx) { - throw new RuntimeException("Only expressions have precedence."); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsPrettyNamer.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsPrettyNamer.java deleted file mode 100644 index 2c61e01f6b3..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsPrettyNamer.java +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -import com.google.dart.compiler.backend.js.ast.JsName; -import com.google.dart.compiler.backend.js.ast.JsProgram; -import com.google.dart.compiler.backend.js.ast.JsRootScope; -import com.google.dart.compiler.backend.js.ast.JsScope; - -import java.util.*; - -/** - * A namer that uses short, readable idents to maximize reability. - */ -public class JsPrettyNamer implements JsNamer { - - public JsPrettyNamer() { - this.program = null; - } - - @Override - public void exec(JsProgram program) { - new JsPrettyNamer(program).execImpl(); - } - - /** - * Communicates to a parent scope all the idents used by all child scopes. - */ - private Set childIdents = null; - - private final JsProgram program; - - /** - * A map containing the next integer to try as an identifier suffix for a - * given JsScope. - */ - private IdentityHashMap> startIdentForScope = - new IdentityHashMap>(); - - protected JsPrettyNamer(JsProgram program) { - this.program = program; - } - - private void execImpl() { - visit(program.getRootScope()); - } - - private boolean isLegal(JsScope scope, Set childIdents, String newIdent) { - if (JsReservedIdentifiers.isKeyword(newIdent)) { - return false; - } - if (childIdents.contains(newIdent)) { - // one of my children already claimed this ident - return false; - } - /* - * Never obfuscate a name into an identifier that conflicts with an existing - * unobfuscatable name! It's okay if it conflicts with an existing - * obfuscatable name; that name will get obfuscated out of the way. - */ - return (scope.findExistingUnobfuscatableName(newIdent) == null); - } - - private void visit(JsScope scope) { - HashMap startIdent = startIdentForScope.get(scope); - if (startIdent == null) { - startIdent = new HashMap(); - startIdentForScope.put(scope, startIdent); - } - - // Save off the childIdents which is currently being computed for my parent. - Set myChildIdents = childIdents; - - /* - * Visit my children first. Reset childIdents so that my children will get a - * clean slate: I do not communicate to my children. - */ - childIdents = new HashSet(); - List children = scope.getChildren(); - for (Iterator it = children.iterator(); it.hasNext();) { - visit(it.next()); - } - - JsRootScope rootScope = program.getRootScope(); - if (scope == rootScope) { - return; - } - - // Visit all my idents. - for (Iterator it = scope.getAllNames(); it.hasNext();) { - JsName name = it.next(); - if (!name.isObfuscatable()) { - // Unobfuscatable names become themselves. - name.setShortIdent(name.getIdent()); - continue; - } - - String newIdent = name.getShortIdent(); - if (!isLegal(scope, childIdents, newIdent)) { - String checkIdent; - - // Start searching using a suffix hint stored in the scope. - // We still do a search in case there is a collision with - // a user-provided identifier - Integer s = startIdent.get(newIdent); - int suffix = (s == null) ? 0 : s.intValue(); - do { - checkIdent = newIdent + "_" + suffix++; - } while (!isLegal(scope, childIdents, checkIdent)); - startIdent.put(newIdent, suffix); - name.setShortIdent(checkIdent); - } else { - // nothing to do; the short name is already good - } - childIdents.add(name.getShortIdent()); - } - myChildIdents.addAll(childIdents); - childIdents = myChildIdents; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsRequiresSemiVisitor.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsRequiresSemiVisitor.java deleted file mode 100644 index f4095c5c822..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsRequiresSemiVisitor.java +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -import com.google.dart.compiler.backend.js.ast.*; - -/** - * Determines if a statement at the end of a block requires a semicolon. - * - * For example, the following statements require semicolons:
- *
    - *
  • if (cond);
  • - *
  • while (cond);
  • - *
- * - * The following do not require semicolons:
- *
    - *
  • return 1
  • - *
  • do {} while(true)
  • - *
- */ -public class JsRequiresSemiVisitor extends JsVisitor { - - public static boolean exec(JsStatement lastStatement) { - JsRequiresSemiVisitor visitor = new JsRequiresSemiVisitor(); - visitor.accept(lastStatement); - return visitor.needsSemicolon; - } - - private boolean needsSemicolon = false; - - private JsRequiresSemiVisitor() { - } - - @Override - public boolean visit(JsBlock x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsBreak x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsDebugger x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsDoWhile x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsEmpty x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsExprStmt x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsFor x, JsContext ctx) { - if (x.getBody() instanceof JsEmpty) { - needsSemicolon = true; - } - return false; - } - - @Override - public boolean visit(JsForIn x, JsContext ctx) { - if (x.getBody() instanceof JsEmpty) { - needsSemicolon = true; - } - return false; - } - - @Override - public boolean visit(JsIf x, JsContext ctx) { - JsStatement thenStmt = x.getThenStmt(); - JsStatement elseStmt = x.getElseStmt(); - JsStatement toCheck = thenStmt; - if (elseStmt != null) { - toCheck = elseStmt; - } - if (toCheck instanceof JsEmpty) { - needsSemicolon = true; - } else { - // Must recurse to determine last statement (possible if-else chain). - accept(toCheck); - } - return false; - } - - @Override - public boolean visit(JsLabel x, JsContext ctx) { - if (x.getStmt() instanceof JsEmpty) { - needsSemicolon = true; - } - return false; - } - - @Override - public boolean visit(JsReturn x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsSwitch x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsThrow x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsTry x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsVars x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsWhile x, JsContext ctx) { - if (x.getBody() instanceof JsEmpty) { - needsSemicolon = true; - } - return false; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsReservedIdentifiers.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsReservedIdentifiers.java deleted file mode 100644 index 56ae5428a3d..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsReservedIdentifiers.java +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -import java.util.HashSet; -import java.util.Set; - -/** - * Determines whether or not a particular string is a JavaScript keyword or not. - */ -public class JsReservedIdentifiers { - - private static Set javaScriptKeywords; - private static Set reservedGlobalSymbols; - private static Set reservedPropertySymbols; - - static { - javaScriptKeywords = new HashSet(); - reservedGlobalSymbols = new HashSet(); - reservedPropertySymbols = new HashSet(); - initJavaScriptKeywords(); - initReservedGlobalSymbols(); - initReservedPropertySymbols(); - } - - public static boolean isKeyword(String s) { - return javaScriptKeywords.contains(s); - } - - private static void initJavaScriptKeywords() { - String[] keywords = new String[] { - // These are current keywords - "break", "delete", "function", "return", "typeof", "case", "do", "if", "switch", "var", - "catch", "else", "in", "this", "void", "continue", "false", "instanceof", "throw", - "while", "debugger", "finally", "new", "true", "with", "default", "for", - "null", "try", - - // These are future keywords - "abstract", "double", "goto", "native", "static", "boolean", "enum", "implements", - "package", "super", "byte", "export", "import", "private", "synchronized", "char", - "extends", "int", "protected", "throws", "class", "final", "interface", "public", - "transient", "const", "float", "long", "short", "volatile" - }; - - for (int i = 0; i < keywords.length; i++) { - javaScriptKeywords.add(keywords[i]); - } - } - - /** - * @return a set containing all known reserved global identifiers. This set must not be modified. - */ - public static Set getReservedGlobalSymbols() { - return reservedGlobalSymbols; - } - - /** - * Returns true if the string s can not be used as a global identifier. The check includes - * JavaScript keywords (as they must not be used either). - * @param s - * @return true if the given String must not be used as a global identifier. - */ - public static boolean isReservedGlobalSymbol(String s) { - return isKeyword(s) || reservedGlobalSymbols.contains(s); - } - - private static void initReservedGlobalSymbols() { - // Section references are from Ecma-262 - // (http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf) - String[] commonBuiltins = new String[] { - // 15.1.1 Value Properties of the Global Object - "NaN", "Infinity", "undefined", - - // 15.1.2 Function Properties of the Global Object - "eval", "parseInt", "parseFloat", "isNan", "isFinite", - - // 15.1.3 URI Handling Function Properties - "decodeURI", "decodeURIComponent", - "encodeURI", - "encodeURIComponent", - - // 15.1.4 Constructor Properties of the Global Object - "Object", "Function", "Array", "String", "Boolean", "Number", "Date", - "RegExp", "Error", "EvalError", "RangeError", "ReferenceError", - "SyntaxError", "TypeError", "URIError", - - // 15.1.5 Other Properties of the Global Object - "Math", - - // 10.1.6 Activation Object - "arguments", - - // B.2 Additional Properties (non-normative) - "escape", "unescape", - - // Window props (https://developer.mozilla.org/en/DOM/window) - "applicationCache", "closed", "Components", "content", "controllers", - "crypto", "defaultStatus", "dialogArguments", "directories", - "document", "frameElement", "frames", "fullScreen", "globalStorage", - "history", "innerHeight", "innerWidth", "length", - "location", "locationbar", "localStorage", "menubar", - "mozInnerScreenX", "mozInnerScreenY", "mozScreenPixelsPerCssPixel", - "name", "navigator", "opener", "outerHeight", "outerWidth", - "pageXOffset", "pageYOffset", "parent", "personalbar", "pkcs11", - "returnValue", "screen", "scrollbars", "scrollMaxX", "scrollMaxY", - "self", "sessionStorage", "sidebar", "status", "statusbar", "toolbar", - "top", "window", - - // Window methods (https://developer.mozilla.org/en/DOM/window) - "alert", "addEventListener", "atob", "back", "blur", "btoa", - "captureEvents", "clearInterval", "clearTimeout", "close", "confirm", - "disableExternalCapture", "dispatchEvent", "dump", - "enableExternalCapture", "escape", "find", "focus", "forward", - "GeckoActiveXObject", "getAttention", "getAttentionWithCycleCount", - "getComputedStyle", "getSelection", "home", "maximize", "minimize", - "moveBy", "moveTo", "open", "openDialog", "postMessage", "print", - "prompt", "QueryInterface", "releaseEvents", "removeEventListener", - "resizeBy", "resizeTo", "restore", "routeEvent", "scroll", "scrollBy", - "scrollByLines", "scrollByPages", "scrollTo", "setInterval", - "setResizeable", "setTimeout", "showModalDialog", "sizeToContent", - "stop", "uuescape", "updateCommands", "XPCNativeWrapper", - "XPCSafeJSOjbectWrapper", - - // Mozilla Window event handlers, same cite - "onabort", "onbeforeunload", "onchange", "onclick", "onclose", - "oncontextmenu", "ondragdrop", "onerror", "onfocus", "onhashchange", - "onkeydown", "onkeypress", "onkeyup", "onload", "onmousedown", - "onmousemove", "onmouseout", "onmouseover", "onmouseup", - "onmozorientation", "onpaint", "onreset", "onresize", "onscroll", - "onselect", "onsubmit", "onunload", - - // Safari Web Content Guide - // http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/SafariWebContent.pdf - // WebKit Window member data, from WebKit DOM Reference - // (http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/WebKitDOMRef/DOMWindow_idl/Classes/DOMWindow/index.html) - // TODO(fredsa) Many, many more functions and member data to add - "ontouchcancel", "ontouchend", "ontouchmove", "ontouchstart", - "ongesturestart", "ongesturechange", "ongestureend", - - // extra window methods - "uneval", - - // keywords https://developer.mozilla.org/en/New_in_JavaScript_1.7, - // https://developer.mozilla.org/en/New_in_JavaScript_1.8.1 - "getPrototypeOf", "let", "yield", - - // "future reserved words" - "abstract", "int", "short", "boolean", "interface", "static", "byte", - "long", "char", "final", "native", "synchronized", "float", "package", - "throws", "goto", "private", "transient", "implements", "protected", - "volatile", "double", "public", - - // IE methods - // (http://msdn.microsoft.com/en-us/library/ms535873(VS.85).aspx#) - "attachEvent", "clientInformation", "clipboardData", "createPopup", - "dialogHeight", "dialogLeft", "dialogTop", "dialogWidth", - "onafterprint", "onbeforedeactivate", "onbeforeprint", - "oncontrolselect", "ondeactivate", "onhelp", "onresizeend", - - // Common browser-defined identifiers not defined in ECMAScript - "event", "external", "Debug", "Enumerator", "Global", "Image", - "ActiveXObject", "VBArray", "Components", - - // Functions commonly defined on Object - "toString", "getClass", "constructor", "prototype", "valueOf", - - // Client-side JavaScript identifiers, which are needed for linkers - // that don't ensure GWT's window != $wnd, document != $doc, etc. - // Taken from the Rhino book, pg 715 - "Anchor", "Applet", "Attr", "Canvas", "CanvasGradient", - "CanvasPattern", "CanvasRenderingContext2D", "CDATASection", - "CharacterData", "Comment", "CSS2Properties", "CSSRule", - "CSSStyleSheet", "Document", "DocumentFragment", "DocumentType", - "DOMException", "DOMImplementation", "DOMParser", "Element", "Event", - "ExternalInterface", "FlashPlayer", "Form", "Frame", "History", - "HTMLCollection", "HTMLDocument", "HTMLElement", "IFrame", "Image", - "Input", "JSObject", "KeyEvent", "Link", "Location", "MimeType", - "MouseEvent", "Navigator", "Node", "NodeList", "Option", "Plugin", - "ProcessingInstruction", "Range", "RangeException", "Screen", "Select", - "Table", "TableCell", "TableRow", "TableSelection", "Text", "TextArea", - "UIEvent", "Window", "XMLHttpRequest", "XMLSerializer", - "XPathException", "XPathResult", "XSLTProcessor", - - // These keywords trigger the loading of the java-plugin. For the - // next-generation plugin, this results in starting a new Java process. - "java", "Packages", "netscape", "sun", "JavaObject", "JavaClass", - "JavaArray", "JavaMember", - - // GWT-defined identifiers - "$wnd", "$doc", "$entry", "$moduleName", "$moduleBase", "$gwt_version", "$sessionId", - - // Identifiers used by JsStackEmulator; later set to obfuscatable - "$stack", "$stackDepth", "$location", - - // TODO: prove why this is necessary or remove it - "call" - }; - for (int i = 0; i < commonBuiltins.length; i++) { - reservedGlobalSymbols.add(commonBuiltins[i]); - } - } - - /** - * Returns true if the given string can not be used as property symbol. The check excludes - * keywords as JavaScript allow keywords as properties. - * @param s - * @return true if the given string must not be used as a property. - */ - public static boolean isReservedPropertySymbol(String s) { - return reservedPropertySymbols.contains(s); - } - - private static void initReservedPropertySymbols() { - // TODO(floitsch): fill in reserved property symbols. - reservedPropertySymbols.add("__PROTO__"); - reservedPropertySymbols.add("prototype"); - } - - private JsReservedIdentifiers() { - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsSourceGenerationVisitor.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsSourceGenerationVisitor.java deleted file mode 100644 index 3a2689f65da..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsSourceGenerationVisitor.java +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -import com.google.dart.compiler.util.TextOutput; -import com.google.dart.compiler.backend.js.ast.JsContext; -import com.google.dart.compiler.backend.js.ast.JsProgramFragment; -import com.google.dart.compiler.backend.js.ast.JsBlock; -import com.google.dart.compiler.backend.js.ast.JsProgram; - -/** - * Generates JavaScript source from an AST. - */ -public class JsSourceGenerationVisitor extends JsToStringGenerationVisitor { - - public JsSourceGenerationVisitor(TextOutput out) { - super(out); - } - - @Override - public boolean visit(JsProgram x, JsContext ctx) { - // Descend naturally. - return true; - } - - @Override - public boolean visit(JsProgramFragment x, JsContext ctx) { - // Descend naturally. - return true; - } - - @Override - public boolean visit(JsBlock x, JsContext ctx) { - printJsBlock(x, false, true); - return false; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java b/js/js.ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java deleted file mode 100644 index a078eca30ac..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java +++ /dev/null @@ -1,1331 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.util.TextOutput; - -import java.util.*; -import java.util.regex.Pattern; - -//import com.google.debugging.sourcemap.FilePosition; - -/** - * Produces text output from a JavaScript AST. - */ -public class JsToStringGenerationVisitor extends JsVisitor { - - private static final char[] CHARS_BREAK = "break".toCharArray(); - private static final char[] CHARS_CASE = "case".toCharArray(); - private static final char[] CHARS_CATCH = "catch".toCharArray(); - private static final char[] CHARS_CONTINUE = "continue".toCharArray(); - private static final char[] CHARS_DEBUGGER = "debugger".toCharArray(); - private static final char[] CHARS_DEFAULT = "default".toCharArray(); - private static final char[] CHARS_DO = "do".toCharArray(); - private static final char[] CHARS_ELSE = "else".toCharArray(); - private static final char[] CHARS_FALSE = "false".toCharArray(); - private static final char[] CHARS_FINALLY = "finally".toCharArray(); - private static final char[] CHARS_FOR = "for".toCharArray(); - private static final char[] CHARS_FUNCTION = "function".toCharArray(); - private static final char[] CHARS_IF = "if".toCharArray(); - private static final char[] CHARS_IN = "in".toCharArray(); - private static final char[] CHARS_NEW = "new".toCharArray(); - private static final char[] CHARS_NULL = "null".toCharArray(); - private static final char[] CHARS_RETURN = "return".toCharArray(); - private static final char[] CHARS_SWITCH = "switch".toCharArray(); - private static final char[] CHARS_THIS = "this".toCharArray(); - private static final char[] CHARS_THROW = "throw".toCharArray(); - private static final char[] CHARS_TRUE = "true".toCharArray(); - private static final char[] CHARS_TRY = "try".toCharArray(); - private static final char[] CHARS_VAR = "var".toCharArray(); - private static final char[] CHARS_WHILE = "while".toCharArray(); - private static final char[] HEX_DIGITS = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - /** - * How many lines of code to print inside of a JsBlock when printing terse. - */ - private static final int JSBLOCK_LINES_TO_PRINT = 3; - - /** - * A variable name is valid if it contains only letters, numbers, _, $ and - * does not begin with a number. There are actually other valid variable - * names, such as ones that contain escaped Unicode characters, but we - * surround those names with quotes in property initializers to be safe. - */ - private static final Pattern VALID_NAME_PATTERN = Pattern.compile("[a-zA-Z_$][\\w$]*"); - - public static String javaScriptString(String value) { - return javaScriptString(value, false); - } - - /** - * Generate JavaScript code that evaluates to the supplied string. Adapted - * from - * . The difference is that we quote with either " or ' depending on - * which one is used less inside the string. - */ - public static String javaScriptString(String value, boolean forceDoubleQuote) { - char[] chars = value.toCharArray(); - final int n = chars.length; - int quoteCount = 0; - int aposCount = 0; - for (int i = 0; i < n; ++i) { - switch (chars[i]) { - case '"': - ++quoteCount; - break; - case '\'': - ++aposCount; - break; - } - } - - StringBuffer result = new StringBuffer(value.length() + 16); - - char quoteChar = (quoteCount < aposCount || forceDoubleQuote) ? '"' : '\''; - result.append(quoteChar); - - for (int i = 0; i < n; ++i) { - char c = chars[i]; - - if (' ' <= c && c <= '~' && c != quoteChar && c != '\\') { - // an ordinary print character (like C isprint()) - result.append(c); - continue; - } - - int escape = -1; - switch (c) { - case '\b': - escape = 'b'; - break; - case '\f': - escape = 'f'; - break; - case '\n': - escape = 'n'; - break; - case '\r': - escape = 'r'; - break; - case '\t': - escape = 't'; - break; - case '"': - escape = '"'; - break; // only reach here if == quoteChar - case '\'': - escape = '\''; - break; // only reach here if == quoteChar - case '\\': - escape = '\\'; - break; - } - - if (escape >= 0) { - // an \escaped sort of character - result.append('\\'); - result.append((char) escape); - } else { - /* - * Emit characters from 0 to 31 that don't have a single character - * escape sequence in octal where possible. This saves one or two - * characters compared to the hexadecimal format '\xXX'. - * - * These short octal sequences may only be used at the end of the string - * or where the following character is a non-digit. Otherwise, the - * following character would be incorrectly interpreted as belonging to - * the sequence. - */ - if (c < ' ' && (i == n - 1 || chars[i + 1] < '0' || chars[i + 1] > '9')) { - result.append('\\'); - if (c > 0x7) { - result.append((char) ('0' + (0x7 & (c >> 3)))); - } - result.append((char) ('0' + (0x7 & c))); - } else { - int hexSize; - if (c < 256) { - // 2-digit hex - result.append("\\x"); - hexSize = 2; - } else { - // Unicode. - result.append("\\u"); - hexSize = 4; - } - // append hexadecimal form of ch left-padded with 0 - for (int shift = (hexSize - 1) * 4; shift >= 0; shift -= 4) { - int digit = 0xf & (c >> shift); - result.append(HEX_DIGITS[digit]); - } - } - } - } - result.append(quoteChar); - escapeClosingTags(result); - String resultString = result.toString(); - return resultString; - } - - /** - * Escapes any closing XML tags embedded in str, which could - * potentially cause a parse failure in a browser, for example, embedding a - * closing <script> tag. - * - * @param str an unescaped literal; May be null - */ - private static void escapeClosingTags(StringBuffer str) { - if (str == null) { - return; - } - - int index = 0; - - while ((index = str.indexOf(" globalBlocks = new HashSet(); - private final TextOutput p; - private ArrayList statementEnds = new ArrayList(); - private ArrayList statementStarts = new ArrayList(); - private boolean buildMappings; - //private List mappings = Lists.newArrayList(); - - public JsToStringGenerationVisitor(TextOutput out) { - this.p = out; - } - - /** - * @param generate Whether to translate the source map. - */ - public void generateSourceMap(boolean generate) { - this.buildMappings = generate; - } - -// public void writeSourceMap(Appendable out, String name) throws IOException { -// GenerateSourceMap generator = new GenerateSourceMap(); -// for (SourceMapping m : mappings) { -// generator.addMapping(m.getNode(), m.getStart(), m.getEnd()); -// } -// generator.appendTo(out, name); -// } - - @Override - public void doTraverse(JsVisitable x, JsContext ctx) { - //SourceMapping m = null; - // TODO(johnlenz): filter out uninteresting node types - if (buildMappings) { - // m = new SourceMapping((HasSourceInfo) x, new FilePosition(p.getLine(), p.getColumn())); - // mappings.add(m); - } - - super.doTraverse(x, ctx); - - if (buildMappings) { - // m.setEnd(new FilePosition(p.getLine(), p.getColumn())); - } - } - - @Override - public boolean visit(JsArrayAccess x, JsContext ctx) { - JsExpression arrayExpr = x.getArrayExpr(); - _parenPush(x, arrayExpr, false); - accept(arrayExpr); - _parenPop(x, arrayExpr, false); - _lsquare(); - accept(x.getIndexExpr()); - _rsquare(); - return false; - } - - @Override - public boolean visit(JsArrayLiteral x, JsContext ctx) { - _lsquare(); - boolean sep = false; - for (Object element : x.getExpressions()) { - JsExpression arg = (JsExpression) element; - sep = _sepCommaOptSpace(sep); - _parenPushIfCommaExpr(arg); - accept(arg); - _parenPopIfCommaExpr(arg); - } - _rsquare(); - return false; - } - - @Override - public boolean visit(JsBinaryOperation x, JsContext ctx) { - JsBinaryOperator op = x.getOperator(); - JsExpression arg1 = x.getArg1(); - _parenPush(x, arg1, !op.isLeftAssociative()); - accept(arg1); - if (op.isKeyword()) { - _parenPopOrSpace(x, arg1, !op.isLeftAssociative()); - } else { - _parenPop(x, arg1, !op.isLeftAssociative()); - _spaceOpt(); - } - p.print(op.getSymbol()); - JsExpression arg2 = x.getArg2(); - if (_spaceCalc(op, arg2)) { - _parenPushOrSpace(x, arg2, op.isLeftAssociative()); - } else { - _spaceOpt(); - _parenPush(x, arg2, op.isLeftAssociative()); - } - accept(arg2); - _parenPop(x, arg2, op.isLeftAssociative()); - return false; - } - - @Override - public boolean visit(JsBlock x, JsContext ctx) { - printJsBlock(x, true, true); - return false; - } - - @Override - public boolean visit(JsBooleanLiteral x, JsContext ctx) { - if (x.getValue()) { - _true(); - } else { - _false(); - } - return false; - } - - @Override - public boolean visit(JsBreak x, JsContext ctx) { - _break(); - - JsNameRef label = x.getLabel(); - if (label != null) { - _space(); - _nameRef(label); - } - - return false; - } - - @Override - public boolean visit(JsCase x, JsContext ctx) { - _case(); - _space(); - accept(x.getCaseExpr()); - _colon(); - _newlineOpt(); - - indent(); - for (Object element : x.getStmts()) { - JsStatement stmt = (JsStatement) element; - needSemi = true; - accept(stmt); - if (needSemi) { - _semi(); - } - _newlineOpt(); - } - outdent(); - needSemi = false; - return false; - } - - @Override - public boolean visit(JsCatch x, JsContext ctx) { - _spaceOpt(); - _catch(); - _spaceOpt(); - _lparen(); - _nameDef(x.getParameter().getName()); - - // Optional catch condition. - // - JsExpression catchCond = x.getCondition(); - if (catchCond != null) { - _space(); - _if(); - _space(); - accept(catchCond); - } - - _rparen(); - _spaceOpt(); - accept(x.getBody()); - - return false; - } - - @Override - public boolean visit(JsConditional x, JsContext ctx) { - // Associativity: for the then and else branches, it is safe to insert - // another - // ternary expression, but if the test expression is a ternary, it should - // get parentheses around it. - { - JsExpression testExpression = x.getTestExpression(); - _parenPush(x, testExpression, true); - accept(testExpression); - _parenPop(x, testExpression, true); - } - _questionMark(); - { - JsExpression thenExpression = x.getThenExpression(); - _parenPush(x, thenExpression, false); - accept(thenExpression); - _parenPop(x, thenExpression, false); - } - _colon(); - { - JsExpression elseExpression = x.getElseExpression(); - _parenPush(x, elseExpression, false); - accept(elseExpression); - _parenPop(x, elseExpression, false); - } - return false; - } - - @Override - public boolean visit(JsContinue x, JsContext ctx) { - _continue(); - - JsNameRef label = x.getLabel(); - if (label != null) { - _space(); - _nameRef(label); - } - - return false; - } - - @Override - public boolean visit(JsDebugger x, JsContext ctx) { - _debugger(); - return false; - } - - @Override - public boolean visit(JsDefault x, JsContext ctx) { - _default(); - _colon(); - - indent(); - for (Object element : x.getStmts()) { - JsStatement stmt = (JsStatement) element; - needSemi = true; - accept(stmt); - if (needSemi) { - _semi(); - } - _newlineOpt(); - } - outdent(); - needSemi = false; - return false; - } - - @Override - public boolean visit(JsDoWhile x, JsContext ctx) { - _do(); - _nestedPush(x.getBody(), true); - accept(x.getBody()); - _nestedPop(x.getBody()); - if (needSemi) { - _semi(); - _newlineOpt(); - } else { - _spaceOpt(); - needSemi = true; - } - _while(); - _spaceOpt(); - _lparen(); - accept(x.getCondition()); - _rparen(); - return false; - } - - @Override - public boolean visit(JsEmpty x, JsContext ctx) { - return false; - } - - @Override - public boolean visit(JsExprStmt x, JsContext ctx) { - boolean surroundWithParentheses = JsFirstExpressionVisitor.exec(x); - if (surroundWithParentheses) { - _lparen(); - } - JsExpression expr = x.getExpression(); - accept(expr); - if (surroundWithParentheses) { - _rparen(); - } - return false; - } - - @Override - public boolean visit(JsFor x, JsContext ctx) { - _for(); - _spaceOpt(); - _lparen(); - - // The init expressions or var decl. - // - if (x.getInitExpr() != null) { - accept(x.getInitExpr()); - } else if (x.getInitVars() != null) { - accept(x.getInitVars()); - } - - _semi(); - - // The loop test. - // - if (x.getCondition() != null) { - _spaceOpt(); - accept(x.getCondition()); - } - - _semi(); - - // The incr expression. - // - if (x.getIncrExpr() != null) { - _spaceOpt(); - accept(x.getIncrExpr()); - } - - _rparen(); - _nestedPush(x.getBody(), false); - accept(x.getBody()); - _nestedPop(x.getBody()); - return false; - } - - @Override - public boolean visit(JsForIn x, JsContext ctx) { - _for(); - _spaceOpt(); - _lparen(); - - if (x.getIterVarName() != null) { - _var(); - _space(); - _nameDef(x.getIterVarName()); - - if (x.getIterExpr() != null) { - _spaceOpt(); - _assignment(); - _spaceOpt(); - accept(x.getIterExpr()); - } - } else { - // Just a name ref. - // - accept(x.getIterExpr()); - } - - _space(); - _in(); - _space(); - accept(x.getObjExpr()); - - _rparen(); - _nestedPush(x.getBody(), false); - accept(x.getBody()); - _nestedPop(x.getBody()); - return false; - } - - // function foo(a, b) { - // stmts... - // } - // - @Override - public boolean visit(JsFunction x, JsContext ctx) { - _function(); - - // Functions can be anonymous. - // - if (x.getName() != null) { - _space(); - _nameOf(x); - } - - _lparen(); - boolean sep = false; - for (Object element : x.getParameters()) { - JsParameter param = (JsParameter) element; - sep = _sepCommaOptSpace(sep); - accept(param); - } - _rparen(); - - accept(x.getBody()); - needSemi = true; - return false; - } - - @Override - public boolean visit(JsIf x, JsContext ctx) { - _if(); - _spaceOpt(); - _lparen(); - accept(x.getIfExpr()); - _rparen(); - JsStatement thenStmt = x.getThenStmt(); - _nestedPush(thenStmt, false); - accept(thenStmt); - _nestedPop(thenStmt); - JsStatement elseStmt = x.getElseStmt(); - if (elseStmt != null) { - if (needSemi) { - _semi(); - _newlineOpt(); - } else { - _spaceOpt(); - needSemi = true; - } - _else(); - boolean elseIf = elseStmt instanceof JsIf; - if (!elseIf) { - _nestedPush(elseStmt, true); - } else { - _space(); - } - accept(elseStmt); - if (!elseIf) { - _nestedPop(elseStmt); - } - } - return false; - } - - @Override - public boolean visit(JsInvocation x, JsContext ctx) { - JsExpression qualifier = x.getQualifier(); - _parenPush(x, qualifier, false); - accept(qualifier); - _parenPop(x, qualifier, false); - - _lparen(); - boolean sep = false; - for (Object element : x.getArguments()) { - JsExpression arg = (JsExpression) element; - sep = _sepCommaOptSpace(sep); - _parenPushIfCommaExpr(arg); - accept(arg); - _parenPopIfCommaExpr(arg); - } - _rparen(); - return false; - } - - @Override - public boolean visit(JsLabel x, JsContext ctx) { - _nameOf(x); - _colon(); - _spaceOpt(); - accept(x.getStmt()); - return false; - } - - @Override - public boolean visit(JsNameRef x, JsContext ctx) { - JsExpression q = x.getQualifier(); - if (q != null) { - _parenPush(x, q, false); - if (q instanceof JsNumberLiteral) { - /** - * Fix for Issue #3796. "42.foo" is not allowed, but "(42).foo" is. - */ - _lparen(); - } - accept(q); - if (q instanceof JsNumberLiteral) { - _rparen(); - } - _parenPop(x, q, false); - _dot(); - } - _nameRef(x); - return false; - } - - @Override - public boolean visit(JsNew x, JsContext ctx) { - _new(); - _space(); - - JsExpression ctorExpr = x.getConstructorExpression(); - boolean needsParens = JsConstructExpressionVisitor.exec(ctorExpr); - if (needsParens) { - _lparen(); - } - accept(ctorExpr); - if (needsParens) { - _rparen(); - } - - /* - * If a constructor call has no arguments, it may simply be replaced with - * "new Constructor" with no parentheses. - */ - List args = x.getArguments(); - if (args.size() > 0) { - _lparen(); - boolean sep = false; - for (JsExpression arg : args) { - sep = _sepCommaOptSpace(sep); - _parenPushIfCommaExpr(arg); - accept(arg); - _parenPopIfCommaExpr(arg); - } - _rparen(); - } - - return false; - } - - @Override - public boolean visit(JsNullLiteral x, JsContext ctx) { - _null(); - return false; - } - - @Override - public boolean visit(JsNumberLiteral x, JsContext ctx) { - double dvalue = x.getValue(); - long lvalue = (long) dvalue; - if (lvalue == dvalue) { - p.print(Long.toString(lvalue)); - } else { - p.print(Double.toString(dvalue)); - } - return false; - } - - @Override - public boolean visit(JsObjectLiteral x, JsContext ctx) { - _lbrace(); - boolean sep = false; - for (Object element : x.getPropertyInitializers()) { - sep = _sepCommaOptSpace(sep); - JsPropertyInitializer propInit = (JsPropertyInitializer) element; - printLabel : { - JsExpression labelExpr = propInit.getLabelExpr(); - // labels can be either string, integral, or decimal literals - if (labelExpr instanceof JsStringLiteral) { - String propName = ((JsStringLiteral) labelExpr).getValue(); - if (VALID_NAME_PATTERN.matcher(propName).matches() - && !JsReservedIdentifiers.isKeyword(propName)) { - p.print(propName); - break printLabel; - } - } - accept(labelExpr); - } - _colon(); - JsExpression valueExpr = propInit.getValueExpr(); - _parenPushIfCommaExpr(valueExpr); - accept(valueExpr); - _parenPopIfCommaExpr(valueExpr); - } - _rbrace(); - return false; - } - - @Override - public boolean visit(JsParameter x, JsContext ctx) { - _nameOf(x); - return false; - } - - @Override - public boolean visit(JsPostfixOperation x, JsContext ctx) { - JsUnaryOperator op = x.getOperator(); - JsExpression arg = x.getArg(); - // unary operators always associate correctly (I think) - _parenPush(x, arg, false); - accept(arg); - _parenPop(x, arg, false); - p.print(op.getSymbol()); - return false; - } - - @Override - public boolean visit(JsPrefixOperation x, JsContext ctx) { - JsUnaryOperator op = x.getOperator(); - p.print(op.getSymbol()); - JsExpression arg = x.getArg(); - if (_spaceCalc(op, arg)) { - _space(); - } - // unary operators always associate correctly (I think) - _parenPush(x, arg, false); - accept(arg); - _parenPop(x, arg, false); - return false; - } - - @Override - public boolean visit(JsProgram x, JsContext ctx) { - p.print(""); - return false; - } - - @Override - public boolean visit(JsProgramFragment x, JsContext ctx) { - p.print(""); - return false; - } - - @Override - public boolean visit(JsPropertyInitializer x, JsContext ctx) { - // Since there are separators, we actually print the property init - // in visit(JsObjectLiteral). - // - return false; - } - - @Override - public boolean visit(JsRegExp x, JsContext ctx) { - _slash(); - p.print(x.getPattern()); - _slash(); - String flags = x.getFlags(); - if (flags != null) { - p.print(flags); - } - return false; - } - - @Override - public boolean visit(JsReturn x, JsContext ctx) { - _return(); - JsExpression expr = x.getExpr(); - if (expr != null) { - _space(); - accept(expr); - } - return false; - } - - @Override - public boolean visit(JsStringLiteral x, JsContext ctx) { - printStringLiteral(x.getValue()); - return false; - } - - @Override - public boolean visit(JsSwitch x, JsContext ctx) { - _switch(); - _spaceOpt(); - _lparen(); - accept(x.getExpr()); - _rparen(); - _spaceOpt(); - _blockOpen(); - acceptList(x.getCases()); - _blockClose(); - return false; - } - - @Override - public boolean visit(JsThisRef x, JsContext ctx) { - _this(); - return false; - } - - @Override - public boolean visit(JsThrow x, JsContext ctx) { - _throw(); - _space(); - accept(x.getExpr()); - return false; - } - - @Override - public boolean visit(JsTry x, JsContext ctx) { - _try(); - _spaceOpt(); - accept(x.getTryBlock()); - - acceptList(x.getCatches()); - - JsBlock finallyBlock = x.getFinallyBlock(); - if (finallyBlock != null) { - _spaceOpt(); - _finally(); - _spaceOpt(); - accept(finallyBlock); - } - - return false; - } - - @Override - public boolean visit(JsVars.JsVar x, JsContext ctx) { - _nameOf(x); - JsExpression initExpr = x.getInitExpr(); - if (initExpr != null) { - _spaceOpt(); - _assignment(); - _spaceOpt(); - _parenPushIfCommaExpr(initExpr); - accept(initExpr); - _parenPopIfCommaExpr(initExpr); - } - return false; - } - - @Override - public boolean visit(JsVars x, JsContext ctx) { - _var(); - _space(); - boolean sep = false; - for (JsVars.JsVar var : x) { - sep = _sepCommaOptSpace(sep); - accept(var); - } - return false; - } - - @Override - public boolean visit(JsWhile x, JsContext ctx) { - _while(); - _spaceOpt(); - _lparen(); - accept(x.getCondition()); - _rparen(); - _nestedPush(x.getBody(), false); - accept(x.getBody()); - _nestedPop(x.getBody()); - return false; - } - - // CHECKSTYLE_NAMING_OFF - protected void _newline() { - p.newline(); - } - - protected void _newlineOpt() { - p.newlineOpt(); - } - - protected void printJsBlock(JsBlock x, boolean truncate, boolean finalNewline) { - boolean needBraces = !x.isGlobalBlock(); - - if (needBraces) { - // Open braces. - // - _blockOpen(); - } - - int count = 0; - for (Iterator iter = x.getStatements().iterator(); iter.hasNext(); ++count) { - boolean isGlobal = x.isGlobalBlock() || globalBlocks.contains(x); - - if (truncate && count > JSBLOCK_LINES_TO_PRINT) { - p.print("[...]"); - _newlineOpt(); - break; - } - JsStatement stmt = iter.next(); - needSemi = true; - boolean shouldRecordPositions = isGlobal && !(stmt instanceof JsBlock); - boolean stmtIsGlobalBlock = false; - if (isGlobal) { - if (stmt instanceof JsBlock) { - // A block inside a global block is still considered global - stmtIsGlobalBlock = true; - globalBlocks.add((JsBlock) stmt); - } - } - if (shouldRecordPositions) { - statementStarts.add(p.getPosition()); - } - accept(stmt); - if (stmtIsGlobalBlock) { - globalBlocks.remove(stmt); - } - if (needSemi) { - /* - * Special treatment of function decls: If they are the only item in a - * statement (i.e. not part of an assignment operation), just give them - * a newline instead of a semi. - */ - boolean functionStmt = - stmt instanceof JsExprStmt && ((JsExprStmt) stmt).getExpression() instanceof JsFunction; - /* - * Special treatment of the last statement in a block: only a few - * statements at the end of a block require semicolons. - */ - boolean lastStatement = !iter.hasNext() && needBraces && !JsRequiresSemiVisitor.exec(stmt); - if (functionStmt) { - if (lastStatement) { - _newlineOpt(); - } else { - _newline(); - } - } else { - if (lastStatement) { - _semiOpt(); - } else { - _semi(); - } - _newlineOpt(); - } - } - if (shouldRecordPositions) { - assert (statementStarts.size() == statementEnds.size() + 1); - statementEnds.add(p.getPosition()); - } - } - - if (needBraces) { - // _blockClose() modified - p.indentOut(); - p.print('}'); - if (finalNewline) { - _newlineOpt(); - } - } - needSemi = false; - } - - private void _assignment() { - p.print('='); - } - - private void _blockClose() { - p.indentOut(); - p.print('}'); - _newlineOpt(); - } - - private void _blockOpen() { - p.print('{'); - p.indentIn(); - _newlineOpt(); - } - - private void _break() { - p.print(CHARS_BREAK); - } - - private void _case() { - p.print(CHARS_CASE); - } - - private void _catch() { - p.print(CHARS_CATCH); - } - - private void _colon() { - p.print(':'); - } - - private void _continue() { - p.print(CHARS_CONTINUE); - } - - private void _debugger() { - p.print(CHARS_DEBUGGER); - } - - private void _default() { - p.print(CHARS_DEFAULT); - } - - private void _do() { - p.print(CHARS_DO); - } - - private void _dot() { - p.print('.'); - } - - private void _else() { - p.print(CHARS_ELSE); - } - - private void _false() { - p.print(CHARS_FALSE); - } - - private void _finally() { - p.print(CHARS_FINALLY); - } - - private void _for() { - p.print(CHARS_FOR); - } - - private void _function() { - p.print(CHARS_FUNCTION); - } - - private void _if() { - p.print(CHARS_IF); - } - - private void _in() { - p.print(CHARS_IN); - } - - private void _lbrace() { - p.print('{'); - } - - private void _lparen() { - p.print('('); - } - - private void _lsquare() { - p.print('['); - } - - private void _nameDef(JsName name) { - p.print(name.getShortIdent()); - } - - private void _nameOf(HasName hasName) { - _nameDef(hasName.getName()); - } - - private void _nameRef(JsNameRef nameRef) { - p.print(nameRef.getShortIdent()); - } - - private boolean _nestedPop(JsStatement statement) { - boolean pop = !(statement instanceof JsBlock); - if (pop) { - p.indentOut(); - } - return pop; - } - - private boolean _nestedPush(JsStatement statement, boolean needSpace) { - boolean push = !(statement instanceof JsBlock); - if (push) { - if (needSpace) { - _space(); - } - p.indentIn(); - _newlineOpt(); - } else { - _spaceOpt(); - } - return push; - } - - private void _new() { - p.print(CHARS_NEW); - } - - private void _null() { - p.print(CHARS_NULL); - } - - private boolean _parenCalc(JsExpression parent, JsExpression child, boolean wrongAssoc) { - int parentPrec = JsPrecedenceVisitor.exec(parent); - int childPrec = JsPrecedenceVisitor.exec(child); - return (parentPrec > childPrec || (parentPrec == childPrec && wrongAssoc)); - } - - private boolean _parenPop(JsExpression parent, JsExpression child, boolean wrongAssoc) { - boolean doPop = _parenCalc(parent, child, wrongAssoc); - if (doPop) { - _rparen(); - } - return doPop; - } - - private boolean _parenPopIfCommaExpr(JsExpression x) { - boolean doPop = - x instanceof JsBinaryOperation - && ((JsBinaryOperation) x).getOperator() == JsBinaryOperator.COMMA; - if (doPop) { - _rparen(); - } - return doPop; - } - - private boolean _parenPopOrSpace(JsExpression parent, JsExpression child, boolean wrongAssoc) { - boolean doPop = _parenCalc(parent, child, wrongAssoc); - if (doPop) { - _rparen(); - } else { - _space(); - } - return doPop; - } - - private boolean _parenPush(JsExpression parent, JsExpression child, boolean wrongAssoc) { - boolean doPush = _parenCalc(parent, child, wrongAssoc); - if (doPush) { - _lparen(); - } - return doPush; - } - - private boolean _parenPushIfCommaExpr(JsExpression x) { - boolean doPush = - x instanceof JsBinaryOperation - && ((JsBinaryOperation) x).getOperator() == JsBinaryOperator.COMMA; - if (doPush) { - _lparen(); - } - return doPush; - } - - private boolean _parenPushOrSpace(JsExpression parent, JsExpression child, boolean wrongAssoc) { - boolean doPush = _parenCalc(parent, child, wrongAssoc); - if (doPush) { - _lparen(); - } else { - _space(); - } - return doPush; - } - - private void _questionMark() { - p.print('?'); - } - - private void _rbrace() { - p.print('}'); - } - - private void _return() { - p.print(CHARS_RETURN); - } - - private void _rparen() { - p.print(')'); - } - - private void _rsquare() { - p.print(']'); - } - - private void _semi() { - p.print(';'); - } - - private void _semiOpt() { - p.printOpt(';'); - } - - private boolean _sepCommaOptSpace(boolean sep) { - if (sep) { - p.print(','); - _spaceOpt(); - } - return true; - } - - private void _slash() { - p.print('/'); - } - - private void _space() { - p.print(' '); - } - - /** - * Decide whether, if op is printed followed by arg, - * there needs to be a space between the operator and expression. - * - * @return true if a space needs to be printed - */ - private boolean _spaceCalc(JsOperator op, JsExpression arg) { - if (op.isKeyword()) { - return true; - } - if (arg instanceof JsBinaryOperation) { - JsBinaryOperation binary = (JsBinaryOperation) arg; - /* - * If the binary operation has a higher precedence than op, then it won't - * be parenthesized, so check the first argument of the binary operation. - */ - if (binary.getOperator().getPrecedence() > op.getPrecedence()) { - return _spaceCalc(op, binary.getArg1()); - } - return false; - } - if (arg instanceof JsPrefixOperation) { - JsOperator op2 = ((JsPrefixOperation) arg).getOperator(); - return (op == JsBinaryOperator.SUB || op == JsUnaryOperator.NEG) - && (op2 == JsUnaryOperator.DEC || op2 == JsUnaryOperator.NEG) - || (op == JsBinaryOperator.ADD && op2 == JsUnaryOperator.INC); - } - if (arg instanceof JsNumberLiteral) { - JsNumberLiteral literal = (JsNumberLiteral) arg; - return (op == JsBinaryOperator.SUB || op == JsUnaryOperator.NEG) && (literal.getValue() < 0); - } - return false; - } - - private void _spaceOpt() { - p.printOpt(' '); - } - - private void _switch() { - p.print(CHARS_SWITCH); - } - - private void _this() { - p.print(CHARS_THIS); - } - - private void _throw() { - p.print(CHARS_THROW); - } - - private void _true() { - p.print(CHARS_TRUE); - } - - private void _try() { - p.print(CHARS_TRY); - } - - private void _var() { - p.print(CHARS_VAR); - } - - private void _while() { - p.print(CHARS_WHILE); - } - - // CHECKSTYLE_NAMING_ON - - private void indent() { - p.indentIn(); - } - - private void outdent() { - p.indentOut(); - } - - private void printStringLiteral(String value) { - String resultString = javaScriptString(value); - p.print(resultString); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/UncheckedJsParserException.java b/js/js.ast/src/com/google/dart/compiler/backend/js/UncheckedJsParserException.java deleted file mode 100644 index c2db8120537..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/UncheckedJsParserException.java +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js; - -/** - * An unchecked wrapper exception to interop with Rhino. - */ -class UncheckedJsParserException extends RuntimeException { - - private final JsParserException parserException; - - public UncheckedJsParserException(JsParserException parserException) { - this.parserException = parserException; - } - - public JsParserException getParserException() { - return parserException; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/CanBooleanEval.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/CanBooleanEval.java deleted file mode 100644 index 8f4364d94f2..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/CanBooleanEval.java +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * An interface that describes the boolean evaluation of an expression. - */ -public interface CanBooleanEval { - - boolean isBooleanFalse(); - - boolean isBooleanTrue(); -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasArguments.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasArguments.java deleted file mode 100644 index 5a47c567606..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasArguments.java +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.List; - -/** - * Implemented by JavaScript objects that accept arguments. - */ -public interface HasArguments { - List getArguments(); -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasCondition.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasCondition.java deleted file mode 100644 index 082f4e15eb3..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasCondition.java +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Implemented by JavaScript objects with conditional execution. - */ -public interface HasCondition { - - JsExpression getCondition(); - - void setCondition(JsExpression condition); -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasName.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasName.java deleted file mode 100644 index 8daed3769f4..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/HasName.java +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Implemented by JavaScript objects that have a name. - */ -public interface HasName { - JsName getName(); -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsArrayAccess.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsArrayAccess.java deleted file mode 100644 index 46df5108086..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsArrayAccess.java +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a javascript expression for array access. - */ -public final class JsArrayAccess extends JsExpression { - - private JsExpression arrayExpr; - private JsExpression indexExpr; - - public JsArrayAccess() { - super(); - } - - public JsArrayAccess(JsExpression arrayExpr, JsExpression indexExpr) { - this.arrayExpr = arrayExpr; - this.indexExpr = indexExpr; - } - - public JsExpression getArrayExpr() { - return arrayExpr; - } - - public JsExpression getIndexExpr() { - return indexExpr; - } - - @Override - public boolean hasSideEffects() { - return arrayExpr.hasSideEffects() || indexExpr.hasSideEffects(); - } - - @Override - public boolean isDefinitelyNotNull() { - return false; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - public void setArrayExpr(JsExpression arrayExpr) { - this.arrayExpr = arrayExpr; - } - - public void setIndexExpr(JsExpression indexExpr) { - this.indexExpr = indexExpr; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - arrayExpr = v.accept(arrayExpr); - indexExpr = v.accept(indexExpr); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.ARRAY_ACCESS; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsArrayLiteral.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsArrayLiteral.java deleted file mode 100644 index 8cb9f7e6d52..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsArrayLiteral.java +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.ArrayList; -import java.util.List; - -/** - * Represents a JavaScript expression for array literals. - */ -public final class JsArrayLiteral extends JsLiteral { - - private final List exprs = new ArrayList(); - - public JsArrayLiteral() { - super(); - } - - public List getExpressions() { - return exprs; - } - - @Override - public boolean hasSideEffects() { - for (JsExpression expr : exprs) { - if (expr.hasSideEffects()) { - return true; - } - } - return false; - } - - @Override - public boolean isBooleanFalse() { - return false; - } - - @Override - public boolean isBooleanTrue() { - return true; - } - - @Override - public boolean isDefinitelyNotNull() { - return true; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - v.acceptWithInsertRemove(exprs); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.ARRAY; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBinaryOperation.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBinaryOperation.java deleted file mode 100644 index b09d50c1d05..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBinaryOperation.java +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript binary operation. - */ -public final class JsBinaryOperation extends JsExpression { - - private JsExpression arg1; - private JsExpression arg2; - private final JsBinaryOperator op; - - public JsBinaryOperation(JsBinaryOperator op) { - this(op, null, null); - } - - public JsBinaryOperation(JsBinaryOperator op, JsExpression arg1, JsExpression arg2) { - this.op = op; - this.arg1 = arg1; - this.arg2 = arg2; - } - - public JsExpression getArg1() { - return arg1; - } - - public JsExpression getArg2() { - return arg2; - } - - public JsBinaryOperator getOperator() { - return op; - } - - @Override - public boolean hasSideEffects() { - return op.isAssignment() || arg1.hasSideEffects() || arg2.hasSideEffects(); - } - - @Override - public boolean isDefinitelyNotNull() { - // Precarious coding, but none of these can have null results. - if (op.getPrecedence() > 5) { - return true; - } - if (op == JsBinaryOperator.OR) { - if (arg1 instanceof CanBooleanEval) { - if (((CanBooleanEval) arg1).isBooleanTrue()) { - assert arg1.isDefinitelyNotNull(); - return true; - } - } - } - // AND and OR can return nulls - if (op.isAssignment()) { - if (op == JsBinaryOperator.ASG) { - return arg2.isDefinitelyNotNull(); - } else { - // All other ASG's are math ops. - return true; - } - } - - if (op == JsBinaryOperator.COMMA) { - return arg2.isDefinitelyNotNull(); - } - - return false; - } - - @Override - public boolean isDefinitelyNull() { - if (op == JsBinaryOperator.AND) { - return arg1.isDefinitelyNull(); - } - return false; - } - - public void setArg1(JsExpression arg1) { - this.arg1 = arg1; - } - - public void setArg2(JsExpression arg2) { - this.arg2 = arg2; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - if (op.isAssignment()) { - arg1 = v.acceptLvalue(arg1); - } else { - arg1 = v.accept(arg1); - } - arg2 = v.accept(arg2); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.BINARY_OP; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBinaryOperator.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBinaryOperator.java deleted file mode 100644 index b54647f3a46..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBinaryOperator.java +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents the operator in a JavaScript binary operation. - */ -public enum JsBinaryOperator implements JsOperator { - - /* - * Precedence indices from "JavaScript - The Definitive Guide" 4th Edition - * (page 57) - * - * - * Precedence 15 is for really important things that have their own AST - * classes. - * - * Precedence 14 is for unary operators. - */ - - MUL("*", 13, LEFT | INFIX), DIV("/", 13, LEFT | INFIX), MOD("%", 13, LEFT - | INFIX), - - ADD("+", 12, LEFT | INFIX), SUB("-", 12, LEFT | INFIX), - - SHL("<<", 11, LEFT | INFIX), SHR(">>", 11, LEFT | INFIX), SHRU(">>>", 11, - LEFT | INFIX), - - LT("<", 10, LEFT | INFIX), LTE("<=", 10, LEFT | INFIX), GT(">", 10, LEFT - | INFIX), GTE(">=", 10, LEFT | INFIX), INSTANCEOF("instanceof", 10, LEFT - | INFIX), INOP("in", 10, LEFT | INFIX), - - EQ("==", 9, LEFT | INFIX), NEQ("!=", 9, LEFT | INFIX), REF_EQ("===", 9, LEFT - | INFIX), REF_NEQ("!==", 9, LEFT | INFIX), - - BIT_AND("&", 8, LEFT | INFIX), - - BIT_XOR("^", 7, LEFT | INFIX), - - BIT_OR("|", 6, LEFT | INFIX), - - AND("&&", 5, LEFT | INFIX), - - OR("||", 4, LEFT | INFIX), - - // Precedence 3 is for the condition operator. - - // These assignment operators are right-associative. - ASG("=", 2, INFIX), ASG_ADD("+=", 2, INFIX), ASG_SUB("-=", 2, INFIX), ASG_MUL( - "*=", 2, INFIX), ASG_DIV("/=", 2, INFIX), ASG_MOD("%=", 2, INFIX), ASG_SHL( - "<<=", 2, INFIX), ASG_SHR(">>=", 2, INFIX), ASG_SHRU(">>>=", 2, INFIX), ASG_BIT_AND( - "&=", 2, INFIX), ASG_BIT_OR("|=", 2, INFIX), ASG_BIT_XOR("^=", 2, INFIX), - - COMMA(",", 1, LEFT | INFIX); - - private final int mask; - private final int precedence; - private final String symbol; - - private JsBinaryOperator(String symbol, int precedence, int mask) { - this.symbol = symbol; - this.precedence = precedence; - this.mask = mask; - } - - @Override - public int getPrecedence() { - return precedence; - } - - @Override - public String getSymbol() { - return symbol; - } - - public boolean isAssignment() { - /* - * Beware, flaky! Maybe I should have added Yet Another Field to - * BinaryOperator? - */ - return (getPrecedence() == ASG.getPrecedence()); - } - - @Override - public boolean isKeyword() { - return this == INSTANCEOF || this == INOP; - } - - @Override - public boolean isLeftAssociative() { - return (mask & LEFT) != 0; - } - - @Override - public boolean isPrecedenceLessThan(JsOperator other) { - return precedence < other.getPrecedence(); - } - - @Override - public boolean isValidInfix() { - return (mask & INFIX) != 0; - } - - @Override - public boolean isValidPostfix() { - return (mask & POSTFIX) != 0; - } - - @Override - public boolean isValidPrefix() { - return (mask & PREFIX) != 0; - } - - @Override - public String toString() { - return symbol; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBlock.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBlock.java deleted file mode 100644 index fca607c4eb4..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBlock.java +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.LinkedList; -import java.util.List; - -/** - * Represents a JavaScript block statement. - */ -public class JsBlock extends JsStatement { - - private final LinkedList stmts = new LinkedList(); - - public JsBlock() { - } - - public JsBlock(JsStatement stmt) { - stmts.add(stmt); - } - - public List getStatements() { - return stmts; - } - - public void addStatement(JsStatement statement) { - assert statement != null; - stmts.add(statement); - } - - public boolean isGlobalBlock() { - return false; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - v.acceptWithInsertRemove(stmts); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.BLOCK; - } - - /*Pavel Talanov*/ - public void addVarDeclaration(JsVars vars) { - stmts.offerFirst(vars); - } - - public void setStatements(List statements) { - assert this.stmts.isEmpty() : "Already contains statements."; - this.stmts.addAll(statements); - } - -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBooleanLiteral.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBooleanLiteral.java deleted file mode 100644 index 12238ddbb02..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBooleanLiteral.java +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript literal boolean expression. - */ -public final class JsBooleanLiteral extends JsValueLiteral { - - private final boolean value; - - // Should be interned by JsProgram - JsBooleanLiteral(boolean value) { - this.value = value; - } - - public boolean getValue() { - return value; - } - - @Override - public boolean isBooleanFalse() { - return value == false; - } - - @Override - public boolean isBooleanTrue() { - return value == true; - } - - @Override - public boolean isDefinitelyNotNull() { - return true; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - v.visit(this, ctx); - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.BOOLEAN; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBreak.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBreak.java deleted file mode 100644 index 363f294df78..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsBreak.java +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents the JavaScript break statement. - */ -public final class JsBreak extends JsStatement { - - private final JsNameRef label; - - public JsBreak() { - this(null); - } - - public JsBreak(JsNameRef label) { - super(); - this.label = label; - } - - public JsNameRef getLabel() { - return label; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - if (label != null) { - v.accept(label); - } - } - v.endVisit(this, ctx); - } - - @Override - public boolean unconditionalControlBreak() { - return true; - } - - @Override - public NodeKind getKind() { - return NodeKind.BREAK; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCase.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCase.java deleted file mode 100644 index 43d2fc41230..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCase.java +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents the JavaScript case statement. - */ -public final class JsCase extends JsSwitchMember { - - private JsExpression caseExpr; - - public JsCase() { - super(); - } - - public JsExpression getCaseExpr() { - return caseExpr; - } - - public void setCaseExpr(JsExpression caseExpr) { - this.caseExpr = caseExpr; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - caseExpr = v.accept(caseExpr); - v.acceptWithInsertRemove(stmts); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.CASE; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCatch.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCatch.java deleted file mode 100644 index f992545b944..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCatch.java +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript catch clause. - */ -public class JsCatch extends JsNode implements HasCondition { - - protected final JsCatchScope scope; - private JsBlock body; - private JsExpression condition; - private JsParameter param; - - public JsCatch(JsScope parent, String ident) { - super(); - assert (parent != null); - scope = new JsCatchScope(parent, ident); - param = new JsParameter(scope.findExistingName(ident)); - } - - public JsBlock getBody() { - return body; - } - - @Override - public JsExpression getCondition() { - return condition; - } - - public JsParameter getParameter() { - return param; - } - - public JsScope getScope() { - return scope; - } - - public void setBody(JsBlock body) { - this.body = body; - } - - @Override - public void setCondition(JsExpression condition) { - this.condition = condition; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - param = v.accept(param); - if (condition != null) { - condition = v.accept(condition); - } - body = v.accept(body); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.CATCH; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCatchScope.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCatchScope.java deleted file mode 100644 index 5e5a2f2f577..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsCatchScope.java +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.Iterator; -import java.util.NoSuchElementException; - -/** - * A special scope used only for catch blocks. It only holds a single symbol: - * the catch argument's name. - */ -public class JsCatchScope extends JsScope { - - private final JsName name; - - public JsCatchScope(JsScope parent, String ident) { - super(parent, "Catch scope"); - this.name = new JsName(this, ident, ident, ident); - } - - @Override - public JsName declareName(String ident) { - // Declare into parent scope! - return getParent().declareName(ident); - } - - @Override - public JsName declareName(String ident, String shortIdent) { - // Declare into parent scope! - return getParent().declareName(ident, shortIdent); - } - - @Override - public Iterator getAllNames() { - return new Iterator() { - private boolean didIterate = false; - - @Override - public boolean hasNext() { - return !didIterate; - } - - @Override - public JsName next() { - if (didIterate) { - throw new NoSuchElementException(); - } - didIterate = true; - return name; - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - - }; - } - - @Override - protected JsName doCreateName(String ident, String shortIdent, String originalName) { - throw new UnsupportedOperationException("Cannot create a name in a catch scope"); - } - - @Override - public JsName findExistingNameNoRecurse(String ident) { - if (name.getIdent().equals(ident)) { - return name; - } else { - return null; - } - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsConditional.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsConditional.java deleted file mode 100644 index b1171bac2c0..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsConditional.java +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript conditional expression. - */ -public final class JsConditional extends JsExpression { - - private JsExpression elseExpr; - private JsExpression testExpr; - private JsExpression thenExpr; - - public JsConditional() { - } - - public JsConditional(JsExpression testExpr, JsExpression thenExpr, JsExpression elseExpr) { - this.testExpr = testExpr; - this.thenExpr = thenExpr; - this.elseExpr = elseExpr; - } - - public JsExpression getElseExpression() { - return elseExpr; - } - - public JsExpression getTestExpression() { - return testExpr; - } - - public JsExpression getThenExpression() { - return thenExpr; - } - - @Override - public boolean hasSideEffects() { - return testExpr.hasSideEffects() || thenExpr.hasSideEffects() || elseExpr.hasSideEffects(); - } - - @Override - public boolean isDefinitelyNotNull() { - return thenExpr.isDefinitelyNotNull() && elseExpr.isDefinitelyNotNull(); - } - - @Override - public boolean isDefinitelyNull() { - return thenExpr.isDefinitelyNull() && elseExpr.isDefinitelyNull(); - } - - public void setElseExpression(JsExpression elseExpr) { - this.elseExpr = elseExpr; - } - - public void setTestExpression(JsExpression testExpr) { - this.testExpr = testExpr; - } - - public void setThenExpression(JsExpression thenExpr) { - this.thenExpr = thenExpr; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - testExpr = v.accept(testExpr); - thenExpr = v.accept(thenExpr); - elseExpr = v.accept(elseExpr); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.CONDITIONAL; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsContext.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsContext.java deleted file mode 100644 index ddb170052d3..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsContext.java +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * The context in which a JsNode visitation occurs. This represents the set of - * possible operations a JsVisitor subclass can perform on the currently visited - * node. - */ -public interface JsContext { - - boolean canInsert(); - - boolean canRemove(); - - void insertAfter(JsVisitable node); - - void insertBefore(JsVisitable node); - - boolean isLvalue(); - - void removeMe(); - - void replaceMe(JsVisitable node); -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsContinue.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsContinue.java deleted file mode 100644 index d761815fe76..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsContinue.java +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents the JavaScript continue statement. - */ -public final class JsContinue extends JsStatement { - - private final JsNameRef label; - - public JsContinue() { - this(null); - } - - public JsContinue(JsNameRef label) { - super(); - this.label = label; - } - - public JsNameRef getLabel() { - return label; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - if (label != null) { - v.accept(label); - } - } - v.endVisit(this, ctx); - } - - @Override - public boolean unconditionalControlBreak() { - return true; - } - - @Override - public NodeKind getKind() { - return NodeKind.CONTINUE; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDebugger.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDebugger.java deleted file mode 100644 index 34cfae43f48..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDebugger.java +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript debugger statement. - */ -public class JsDebugger extends JsStatement { - - public JsDebugger() { - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - v.visit(this, ctx); - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.DEBUGGER; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDefault.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDefault.java deleted file mode 100644 index a76987a8e5d..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDefault.java +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents the default option in a JavaScript swtich statement. - */ -public final class JsDefault extends JsSwitchMember { - - public JsDefault() { - super(); - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - v.acceptWithInsertRemove(stmts); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.DEFAULT; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDoWhile.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDoWhile.java deleted file mode 100644 index 1dd4a47e8d4..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsDoWhile.java +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript do..while statement. - */ -public class JsDoWhile extends JsStatement { - - private JsStatement body; - private JsExpression condition; - - public JsDoWhile() { - super(); - } - - public JsDoWhile(JsExpression condition, JsStatement body) { - super(); - this.condition = condition; - this.body = body; - } - - public JsStatement getBody() { - return body; - } - - public JsExpression getCondition() { - return condition; - } - - public void setBody(JsStatement body) { - this.body = body; - } - - public void setCondition(JsExpression condition) { - this.condition = condition; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - body = v.accept(body); - condition = v.accept(condition); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.DO; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsEmpty.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsEmpty.java deleted file mode 100644 index c2ac99e3ac0..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsEmpty.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents an empty statement in JavaScript. - */ -public class JsEmpty extends JsStatement { - - // Interned by JsProgram - JsEmpty() { - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - v.visit(this, ctx); - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.EMPTY; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsExprStmt.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsExprStmt.java deleted file mode 100644 index 5b9fc1218c3..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsExprStmt.java +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript expression statement. - */ -public final class JsExprStmt extends JsStatement { - - private JsExpression expr; - - public JsExprStmt(JsExpression expr) { - super(); - this.expr = expr; - this.setSourceInfo(expr); - } - - public JsExpression getExpression() { - return expr; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - expr = v.accept(expr); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.EXPR_STMT; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsExpression.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsExpression.java deleted file mode 100644 index 43545ec98dc..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsExpression.java +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import com.google.dart.compiler.common.SourceInfo; - -/** - * An abstract base class for all JavaScript expressions. - */ -public abstract class JsExpression extends JsNode { - - protected JsExpression() { - } - - /** - * Determines whether the expression can cause side effects. - */ - public abstract boolean hasSideEffects(); - - /** - * True if the target expression is definitely not null. - */ - public abstract boolean isDefinitelyNotNull(); - - /** - * True if the target expression is definitely null. - */ - public abstract boolean isDefinitelyNull(); - - /** - * Determines whether or not this expression is a leaf, such as a - * {@link JsNameRef}, {@link JsBooleanLiteral}, and so on. Leaf expressions - * never need to be parenthesized. - */ - public boolean isLeaf() { - // Conservatively say that it isn't a leaf. - // Individual subclasses can speak for themselves if they are a leaf. - return false; - } - - public JsExprStmt makeStmt() { - return new JsExprStmt(this); - } - - @Override - public JsExpression setSourceRef(SourceInfo info) { - super.setSourceRef(info); - return this; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsFor.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsFor.java deleted file mode 100644 index b980d4be1a2..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsFor.java +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import com.google.dart.compiler.common.SourceInfo; - -/** - * A for statement. If specified at all, the initializer part is - * either a declaration of one or more variables, in which case - * {@link #getInitVars()} is used, or an expression, in which case - * {@link #getInitExpr()} is used. In the latter case, the comma operator is - * often used to create a compound expression. - * - *

- * Note that any of the parts of the for loop header can be - * null, although the body will never be null. - */ -public class JsFor extends JsStatement { - - private JsStatement body; - private JsExpression condition; - private JsExpression incrExpr; - private JsExpression initExpr; - private JsVars initVars; - - public JsFor() { - super(); - } - - public JsStatement getBody() { - return body; - } - - public JsExpression getCondition() { - return condition; - } - - public JsExpression getIncrExpr() { - return incrExpr; - } - - public JsExpression getInitExpr() { - return initExpr; - } - - public JsVars getInitVars() { - return initVars; - } - - public void setBody(JsStatement body) { - this.body = body; - } - - public void setCondition(JsExpression condition) { - this.condition = condition; - } - - public void setIncrExpr(JsExpression incrExpr) { - this.incrExpr = incrExpr; - } - - public void setInitExpr(JsExpression initExpr) { - this.initExpr = initExpr; - } - - public void setInitVars(JsVars initVars) { - this.initVars = initVars; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - assert (!(initExpr != null && initVars != null)); - - if (initExpr != null) { - initExpr = v.accept(initExpr); - } else if (initVars != null) { - initVars = v.accept(initVars); - } - - if (condition != null) { - condition = v.accept(condition); - } - - if (incrExpr != null) { - incrExpr = v.accept(incrExpr); - } - body = v.accept(body); - } - v.endVisit(this, ctx); - } - - @Override - public JsFor setSourceRef(SourceInfo info) { - super.setSourceRef(info); - return this; - } - - @Override - public NodeKind getKind() { - return NodeKind.FOR; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsForIn.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsForIn.java deleted file mode 100644 index 646e349885c..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsForIn.java +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript for..in statement. - */ -public class JsForIn extends JsStatement { - - private JsStatement body; - private JsExpression iterExpr; - private JsExpression objExpr; - - // Optional: the name of a new iterator variable to introduce - private final JsName iterVarName; - - public JsForIn() { - this(null); - } - - public JsForIn(JsName iterVarName) { - this.iterVarName = iterVarName; - } - - public JsStatement getBody() { - return body; - } - - public JsExpression getIterExpr() { - return iterExpr; - } - - public JsName getIterVarName() { - return iterVarName; - } - - public JsExpression getObjExpr() { - return objExpr; - } - - public void setBody(JsStatement body) { - this.body = body; - } - - public void setIterExpr(JsExpression iterExpr) { - this.iterExpr = iterExpr; - } - - public void setObjExpr(JsExpression objExpr) { - this.objExpr = objExpr; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - if (iterExpr != null) { - iterExpr = v.acceptLvalue(iterExpr); - } - objExpr = v.accept(objExpr); - body = v.accept(body); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.FOR_IN; - } -} \ No newline at end of file diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsFunction.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsFunction.java deleted file mode 100644 index f2c7d258791..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsFunction.java +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import com.google.dart.compiler.common.SourceInfo; - -import java.util.ArrayList; -import java.util.List; - -/** - * Represents a JavaScript function expression. - */ -public final class JsFunction extends JsLiteral implements HasName { - - private static void trace(String title, String code) { - System.out.println("---------------------------"); - System.out.println(title + ":"); - System.out.println("---------------------------"); - System.out.println(code); - } - - protected JsBlock body; - protected final List params = new ArrayList(); - protected final JsScope scope; - private boolean artificiallyRescued; - private boolean executeOnce; - private boolean fromDart; - private JsFunction impliedExecute; - private JsName name; - private boolean trace = false; - private boolean traceFirst = true; - private boolean hoisted = false; - private boolean constructor = false; - - /** - * Creates an anonymous function. - */ - public JsFunction(JsScope parent) { - this(parent, null, false); - } - - /** - * Creates a function that is not derived from Dart source. - */ - public JsFunction(JsScope parent, JsName name) { - this(parent, name, false); - } - - /** - * Creates a named function, possibly derived from Dart source. - */ - public JsFunction(JsScope parent, JsName name, boolean fromDart) { - assert (parent != null); - this.fromDart = fromDart; - setName(name); - String scopeName = (name == null) ? "" : name.getIdent(); - scopeName = "function " + scopeName; - this.scope = new JsScope(parent, scopeName); - } - - public JsBlock getBody() { - return body; - } - - /** - * If true, this indicates that only the first invocation of the function will - * have any effects. Subsequent invocations may be considered to be no-op - * calls whose return value is ignored. - */ - public boolean getExecuteOnce() { - return executeOnce; - } - - public JsFunction getImpliedExecute() { - return impliedExecute; - } - - @Override - public JsName getName() { - return name; - } - - public void setParameters(List params) { - this.params.clear(); - this.params.addAll(params); - } - - public List getParameters() { - return params; - } - - public JsScope getScope() { - return scope; - } - - @Override - public boolean hasSideEffects() { - // If there's a name, the name is assigned to. - return name != null; - } - - public boolean isArtificiallyRescued() { - return artificiallyRescued; - } - - @Override - public boolean isBooleanFalse() { - return false; - } - - @Override - public boolean isBooleanTrue() { - return true; - } - - @Override - public boolean isDefinitelyNotNull() { - return true; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - public boolean isFromDart() { - return fromDart; - } - - public void setArtificiallyRescued(boolean rescued) { - this.artificiallyRescued = rescued; - } - - public void setBody(JsBlock body) { - this.body = body; - } - - public void setExecuteOnce(boolean executeOnce) { - this.executeOnce = executeOnce; - } - - public void setFromDart(boolean fromDart) { - this.fromDart = fromDart; - } - - public void setImpliedExecute(JsFunction impliedExecute) { - this.impliedExecute = impliedExecute; - } - - public void setName(JsName name) { - this.name = name; - if (name != null) { - if (isFromDart()) { - name.setStaticRef(this); - } - } - } - - public void setTrace() { - this.trace = true; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - String before = null; - if (trace && v instanceof JsModVisitor) { - before = this.toSource(); - if (traceFirst) { - traceFirst = false; - trace("SCRIPT INITIAL", before); - } - } - if (v.visit(this, ctx)) { - v.acceptWithInsertRemove(params); - body = v.accept(body); - } - v.endVisit(this, ctx); - if (trace && v instanceof JsModVisitor) { - String after = this.toSource(); - if (!after.equals(before)) { - String title = v.getClass().getSimpleName(); - trace(title, after); - } - } - } - - public void setHoisted() { - hoisted = true; - } - - /** - * Whether the function has been hoisted - */ - public boolean isHoisted() { - return hoisted; - } - - /** - * Rebase the function to a new scope. - * - * @param newScopeParent The scope to add the function to. - */ - public void rebaseScope(JsScope newScopeParent) { - this.scope.rebase(newScopeParent); - } - - @Override - public JsFunction setSourceRef(SourceInfo info) { - super.setSourceRef(info); - return this; - } - - public boolean isConstructor() { - return this.constructor; - } - - public boolean setIsConstructor(boolean constructor) { - return this.constructor = constructor; - } - - @Override - public NodeKind getKind() { - return NodeKind.FUNCTION; - } - - // Pavel Talanov - // dummy parameter to distinguish from other constructors - private JsFunction(Void dummy, JsScope functionScope) { - this.fromDart = false; - this.scope = functionScope; - } - - public static JsFunction getAnonymousFunctionWithScope(JsScope scope) { - return new JsFunction(null, scope); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsGlobalBlock.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsGlobalBlock.java deleted file mode 100644 index 9a14004e14c..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsGlobalBlock.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represnts a JavaScript block in the global scope. - */ -public class JsGlobalBlock extends JsBlock { - - public JsGlobalBlock() { - } - - @Override - public boolean isGlobalBlock() { - return true; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsIf.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsIf.java deleted file mode 100644 index 478538235ab..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsIf.java +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript if statement. - */ -public final class JsIf extends JsStatement { - - private JsExpression ifExpr; - private JsStatement thenStmt; - private JsStatement elseStmt; - - public JsIf() { - } - - public JsIf(JsExpression ifExpr, JsStatement thenStmt, JsStatement elseStmt) { - this.ifExpr = ifExpr; - this.thenStmt = thenStmt; - this.elseStmt = elseStmt; - } - - public JsStatement getElseStmt() { - return elseStmt; - } - - public JsExpression getIfExpr() { - return ifExpr; - } - - public JsStatement getThenStmt() { - return thenStmt; - } - - public void setElseStmt(JsStatement elseStmt) { - this.elseStmt = elseStmt; - } - - public void setIfExpr(JsExpression ifExpr) { - this.ifExpr = ifExpr; - } - - public void setThenStmt(JsStatement thenStmt) { - this.thenStmt = thenStmt; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - ifExpr = v.accept(ifExpr); - thenStmt = v.accept(thenStmt); - if (elseStmt != null) { - elseStmt = v.accept(elseStmt); - } - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.IF; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsInvocation.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsInvocation.java deleted file mode 100644 index 777c33730d0..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsInvocation.java +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Represents a JavaScript invocation. - */ -public final class JsInvocation extends JsExpression implements HasArguments { - - private final List args = new ArrayList(); - private JsExpression qualifier; - - public JsInvocation() { - } - - @Override - public List getArguments() { - return args; - } - - public JsExpression getQualifier() { - return qualifier; - } - - @Override - public boolean hasSideEffects() { - return true; - } - - @Override - public boolean isDefinitelyNotNull() { - return false; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - public void setQualifier(JsExpression qualifier) { - this.qualifier = qualifier; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - qualifier = v.accept(qualifier); - v.acceptList(args); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.INVOKE; - } - - // Pavel Talanov - public void setArguments(List arguments) { - assert this.args.isEmpty() : "Arguments already set."; - this.args.addAll(arguments); - } - - public void setArguments(JsExpression... arguments) { - setArguments(Arrays.asList(arguments)); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsLabel.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsLabel.java deleted file mode 100644 index 7d026c3a6de..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsLabel.java +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript label statement. - */ -public class JsLabel extends JsStatement implements HasName { - - private final JsName label; - - private JsStatement stmt; - - public JsLabel(JsName label) { - this.label = label; - } - - @Override - public JsName getName() { - return label; - } - - public JsStatement getStmt() { - return stmt; - } - - public void setStmt(JsStatement stmt) { - this.stmt = stmt; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - stmt = v.accept(stmt); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.LABEL; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsLiteral.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsLiteral.java deleted file mode 100644 index c87ae0c8af1..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsLiteral.java +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript string literal expression. - */ -public abstract class JsLiteral extends JsExpression implements CanBooleanEval { - - protected JsLiteral() { - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsModVisitor.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsModVisitor.java deleted file mode 100644 index ef6e75ce994..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsModVisitor.java +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import com.google.dart.compiler.util.Hack; - -import java.util.List; - -/** - * A visitor for iterating through and modifying an AST. - */ -public class JsModVisitor extends JsVisitor { - - private class ListContext implements JsContext { - - private List collection; - private int index; - private boolean removed; - private boolean replaced; - - @Override - public boolean canInsert() { - return true; - } - - @Override - public boolean canRemove() { - return true; - } - - @Override - public void insertAfter(JsVisitable node) { - checkRemoved(); - collection.add(index + 1, Hack.cast(node)); - didChange = true; - } - - @Override - public void insertBefore(JsVisitable node) { - checkRemoved(); - collection.add(index++, Hack.cast(node)); - didChange = true; - } - - @Override - public boolean isLvalue() { - return false; - } - - @Override - public void removeMe() { - checkState(); - collection.remove(index--); - didChange = removed = true; - } - - @Override - public void replaceMe(JsVisitable node) { - checkState(); - checkReplacement(collection.get(index), node); - collection.set(index, Hack.cast(node)); - didChange = replaced = true; - } - - protected void traverse(List collection) { - this.collection = collection; - for (index = 0; index < collection.size(); ++index) { - removed = replaced = false; - doTraverse(collection.get(index), this); - } - } - - private void checkRemoved() { - if (removed) { - throw new RuntimeException("Node was already removed"); - } - } - - private void checkState() { - checkRemoved(); - if (replaced) { - throw new RuntimeException("Node was already replaced"); - } - } - } - - private class LvalueContext extends NodeContext { - @Override - public boolean isLvalue() { - return true; - } - } - - private class NodeContext implements JsContext { - private T node; - private boolean replaced; - - @Override - public boolean canInsert() { - return false; - } - - @Override - public boolean canRemove() { - return false; - } - - @Override - public void insertAfter(JsVisitable node) { - throw new UnsupportedOperationException(); - } - - @Override - public void insertBefore(JsVisitable node) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isLvalue() { - return false; - } - - @Override - public void removeMe() { - throw new UnsupportedOperationException(); - } - - @Override - public void replaceMe(JsVisitable node) { - if (replaced) { - throw new RuntimeException("Node was already replaced"); - } - checkReplacement(this.node, node); - this.node = Hack.cast(node); - didChange = replaced = true; - } - - protected T traverse(T node) { - this.node = node; - replaced = false; - doTraverse(node, this); - return this.node; - } - } - - protected static void checkReplacement(T origNode, T newNode) { - if (newNode == null) { - throw new RuntimeException("Cannot replace with null"); - } - if (newNode == origNode) { - throw new RuntimeException("The replacement is the same as the original"); - } - } - - protected boolean didChange = false; - - @Override - public boolean didChange() { - return didChange; - } - - @Override - protected T doAccept(T node) { - return new NodeContext().traverse(node); - } - - @Override - protected void doAcceptList(List collection) { - NodeContext ctx = new NodeContext(); - for (int i = 0, c = collection.size(); i < c; ++i) { - ctx.traverse(collection.get(i)); - if (ctx.replaced) { - collection.set(i, ctx.node); - } - } - } - - @Override - protected JsExpression doAcceptLvalue(JsExpression expr) { - return new LvalueContext().traverse(expr); - } - - @Override - protected void doAcceptWithInsertRemove(List collection) { - new ListContext().traverse(collection); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsName.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsName.java deleted file mode 100644 index ccc1322338a..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsName.java +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.io.Serializable; - -/** - * An abstract base class for named JavaScript objects. - */ -public class JsName implements Serializable { - private final JsScope enclosing; - private final String ident; - private boolean isObfuscatable; - private String shortIdent; - private String originalName; - - /** - * A back-reference to the JsNode that the JsName refers to. - */ - private JsNode staticRef; - - /** - * @param ident the unmangled ident to use for this name - */ -JsName(JsScope enclosing, String ident, String shortIdent, String originalName) { - this.enclosing = enclosing; - this.ident = ident; - this.shortIdent = shortIdent; - if (originalName != null) { - this.originalName = originalName; - } - this.isObfuscatable = true; - } - - public JsScope getEnclosing() { - return enclosing; - } - - public String getIdent() { - return ident; - } - - public String getShortIdent() { - return shortIdent; - } - - public String getOriginalName() { - return originalName; - } - - public JsNode getStaticRef() { - return staticRef; - } - - public boolean isObfuscatable() { - return isObfuscatable; - } - - public JsNameRef makeRef() { - return new JsNameRef(this); - } - - public void setObfuscatable(boolean isObfuscatable) { - this.isObfuscatable = isObfuscatable; - } - - public void setShortIdent(String shortIdent) { - this.shortIdent = shortIdent; - } - - /** - * Should never be called except on immutable stuff. - */ - public void setStaticRef(JsNode node) { - this.staticRef = node; - } - - @Override - public String toString() { - return ident; - } - - @Override - public int hashCode() { - return ident.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof JsName)) { - return false; - } - JsName other = (JsName) obj; - return ident.equals(other.ident) && enclosing == other.enclosing; - } - -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNameRef.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNameRef.java deleted file mode 100644 index dc26c8fa61a..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNameRef.java +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript expression that references a name. - */ -public final class JsNameRef extends JsExpression implements CanBooleanEval, HasName { - - private String ident; - private JsName name; - private JsExpression qualifier; - - public JsNameRef(JsName name) { - this.name = name; - } - - public JsNameRef(String ident) { - this.ident = ident; - } - - public String getIdent() { - return (name == null) ? ident : name.getIdent(); - } - - @Override - public JsName getName() { - return name; - } - - public JsExpression getQualifier() { - return qualifier; - } - - public String getShortIdent() { - return (name == null) ? ident : name.getShortIdent(); - } - - @Override - public boolean hasSideEffects() { - if (qualifier == null) { - return false; - } - if (!qualifier.isDefinitelyNotNull()) { - // Could trigger NPE. - return true; - } - return qualifier.hasSideEffects(); - } - - @Override - public boolean isBooleanFalse() { - return isDefinitelyNull(); - } - - @Override - public boolean isBooleanTrue() { - return false; - } - - @Override - public boolean isDefinitelyNotNull() { - // TODO: look for single-assignment of stuff from Java? - return false; - } - - @Override - public boolean isDefinitelyNull() { - if (name != null) { - return (name.getEnclosing().getProgram().getUndefinedLiteral().getName() == name); - } - return false; - } - - @Override - public boolean isLeaf() { - if (qualifier == null) { - return true; - } else { - return false; - } - } - - public boolean isResolved() { - return name != null; - } - - public void resolve(JsName name) { - this.name = name; - this.ident = null; - } - - public void setQualifier(JsExpression qualifier) { - this.qualifier = qualifier; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - if (qualifier != null) { - qualifier = v.accept(qualifier); - } - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.NAME_REF; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNew.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNew.java deleted file mode 100644 index 68fc366684d..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNew.java +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.ArrayList; -import java.util.List; - -/** - * Represents the JavaScript new expression. - */ -public final class JsNew extends JsExpression implements HasArguments { - - private final List args = new ArrayList(); - private JsExpression ctorExpr; - - public JsNew(JsExpression ctorExpr) { - this.ctorExpr = ctorExpr; - } - - @Override - public List getArguments() { - return args; - } - - public void setArguments(List arguments) { - args.clear(); - args.addAll(arguments); - } - - public JsExpression getConstructorExpression() { - return ctorExpr; - } - - @Override - public boolean hasSideEffects() { - return true; - } - - @Override - public boolean isDefinitelyNotNull() { - // Sadly, in JS it can be! - // TODO: analysis could probably determine most instances cannot be null. - return false; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - ctorExpr = v.accept(ctorExpr); - v.acceptList(args); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.NEW; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNode.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNode.java deleted file mode 100644 index 0d4b7aaa714..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNode.java +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -package com.google.dart.compiler.backend.js.ast; - -import com.google.dart.compiler.backend.js.JsSourceGenerationVisitor; -import com.google.dart.compiler.backend.js.JsToStringGenerationVisitor; -import com.google.dart.compiler.common.AbstractNode; -import com.google.dart.compiler.common.SourceInfo; -import com.google.dart.compiler.util.DefaultTextOutput; - -/** - * Base class for all JS AST elements. - */ -public abstract class JsNode extends AbstractNode implements JsVisitable { - - protected JsNode() { - } - - // Causes source generation to delegate to the one visitor - public final String toSource() { - DefaultTextOutput out = new DefaultTextOutput(false); - JsSourceGenerationVisitor v = new JsSourceGenerationVisitor(out); - v.accept(this); - return out.toString(); - } - - // Causes source generation to delegate to the one visitor - @Override - public final String toString() { - DefaultTextOutput out = new DefaultTextOutput(false); - JsToStringGenerationVisitor v = new JsToStringGenerationVisitor(out); - v.accept(this); - return out.toString(); - } - - @Override - public SourceInfo getSourceInfo() { - return this; - } - - public JsNode setSourceRef(SourceInfo info) { - if (info != null) { - this.setSourceInfo(info); - } - return this; - } - - public abstract NodeKind getKind(); -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNullLiteral.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNullLiteral.java deleted file mode 100644 index 506b2e3f330..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNullLiteral.java +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript null literal. - */ -public final class JsNullLiteral extends JsValueLiteral { - - // Should only be instantiated in JsProgram - JsNullLiteral() { - } - - @Override - public boolean isBooleanFalse() { - return true; - } - - @Override - public boolean isBooleanTrue() { - return false; - } - - @Override - public boolean isDefinitelyNotNull() { - return false; - } - - @Override - public boolean isDefinitelyNull() { - return true; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - v.visit(this, ctx); - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.NULL; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNumberLiteral.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNumberLiteral.java deleted file mode 100644 index 726c6b0ed27..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsNumberLiteral.java +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Represents a JavaScript literal decimal expression. - */ -public final class JsNumberLiteral extends JsValueLiteral { - - private final double value; - - // Should be interned by JsProgram - JsNumberLiteral(double value) { - this.value = value; - } - - public double getValue() { - return value; - } - - @Override - public boolean isBooleanFalse() { - return value == 0.0; - } - - @Override - public boolean isBooleanTrue() { - return value != 0.0; - } - - @Override - public boolean isDefinitelyNotNull() { - return true; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - v.visit(this, ctx); - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.NUMBER; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsObjectLiteral.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsObjectLiteral.java deleted file mode 100644 index 749ed473c21..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsObjectLiteral.java +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.ArrayList; -import java.util.List; - -/** - * A JavaScript object literal. - */ -public final class JsObjectLiteral extends JsLiteral { - - private final List props; - - public JsObjectLiteral() { - props = new ArrayList(); - } - - public JsObjectLiteral(List props) { - assert props != null; - this.props = props; - } - - public List getPropertyInitializers() { - return props; - } - - @Override - public boolean hasSideEffects() { - for (JsPropertyInitializer prop : props) { - if (prop.hasSideEffects()) { - return true; - } - } - return false; - } - - @Override - public boolean isBooleanFalse() { - return false; - } - - @Override - public boolean isBooleanTrue() { - return true; - } - - @Override - public boolean isDefinitelyNotNull() { - return true; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - v.acceptWithInsertRemove(props); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.OBJECT; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsOperator.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsOperator.java deleted file mode 100644 index e4440cbe9ab..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsOperator.java +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript operator. - */ -public interface JsOperator { - - int INFIX = 0x02; - int LEFT = 0x01; - int POSTFIX = 0x04; - int PREFIX = 0x08; - - int getPrecedence(); - - String getSymbol(); - - boolean isKeyword(); - - boolean isLeftAssociative(); - - boolean isPrecedenceLessThan(JsOperator other); - - boolean isValidInfix(); - - boolean isValidPostfix(); - - boolean isValidPrefix(); -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsParameter.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsParameter.java deleted file mode 100644 index 17581ce4084..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsParameter.java +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript parameter. - */ -public final class JsParameter extends JsNode implements HasName { - - private final JsName name; - - public JsParameter(JsName name) { - this.name = name; - name.setStaticRef(this); - } - - @Override - public JsName getName() { - return name; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - v.visit(this, ctx); - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.PARAMETER; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPostfixOperation.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPostfixOperation.java deleted file mode 100644 index a33536f6c0d..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPostfixOperation.java +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript postfix operation. - */ -public final class JsPostfixOperation extends JsUnaryOperation { - - public JsPostfixOperation(JsUnaryOperator op) { - this(op, null); - } - - public JsPostfixOperation(JsUnaryOperator op, JsExpression arg) { - super(op, arg); - } - - @Override - public boolean isDefinitelyNotNull() { - return true; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - super.traverse(v, ctx); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.POSTFIX_OP; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPrefixOperation.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPrefixOperation.java deleted file mode 100644 index 8ce12c7bacd..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPrefixOperation.java +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript prefix operation. - */ -public final class JsPrefixOperation extends JsUnaryOperation implements CanBooleanEval { - - public JsPrefixOperation(JsUnaryOperator op) { - this(op, null); - } - - public JsPrefixOperation(JsUnaryOperator op, JsExpression arg) { - super(op, arg); - } - - @Override - public boolean isBooleanFalse() { - if (getOperator() == JsUnaryOperator.VOID) { - return true; - } - if (getOperator() == JsUnaryOperator.NOT && getArg() instanceof CanBooleanEval) { - CanBooleanEval eval = (CanBooleanEval) getArg(); - return eval.isBooleanTrue(); - } - return false; - } - - @Override - public boolean isBooleanTrue() { - if (getOperator() == JsUnaryOperator.NOT && getArg() instanceof CanBooleanEval) { - CanBooleanEval eval = (CanBooleanEval) getArg(); - return eval.isBooleanFalse(); - } - if (getOperator() == JsUnaryOperator.TYPEOF) { - return true; - } - return false; - } - - @Override - public boolean isDefinitelyNotNull() { - if (getOperator() == JsUnaryOperator.TYPEOF) { - return true; - } - return getOperator() != JsUnaryOperator.VOID; - } - - @Override - public boolean isDefinitelyNull() { - return getOperator() == JsUnaryOperator.VOID; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - super.traverse(v, ctx); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.PREFIX_OP; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsProgram.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsProgram.java deleted file mode 100644 index c8e4310ba9b..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsProgram.java +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.HashMap; -import java.util.Map; - -/** - * A JavaScript program. - */ -public final class JsProgram extends JsNode { - - private final JsStatement debuggerStmt; - private final JsEmpty emptyStmt; - private final JsBooleanLiteral falseLiteral; - private JsProgramFragment[] fragments; - private final Map indexedFunctions = new HashMap(); - private final JsNullLiteral nullLiteral; - private final Map numberLiteralMap = - new HashMap(); - private final JsScope objectScope; - private final JsRootScope rootScope; - private final Map stringLiteralMap = - new HashMap(); - private final JsScope topScope; - private final JsBooleanLiteral trueLiteral; - - /** - * Constructs a JavaScript program object. - */ - public JsProgram(String unitId) { - rootScope = new JsRootScope(this); - topScope = new JsScope(rootScope, "Global", unitId); - objectScope = new JsScope(rootScope, "Object"); - setFragmentCount(1); - - debuggerStmt = new JsDebugger(); - emptyStmt = new JsEmpty(); - falseLiteral = new JsBooleanLiteral(false); - nullLiteral = new JsNullLiteral(); - trueLiteral = new JsBooleanLiteral(true); - } - - public JsBooleanLiteral getBooleanLiteral(boolean truth) { - if (truth) { - return getTrueLiteral(); - } - return getFalseLiteral(); - } - - /** - * Gets the {@link JsStatement} to use whenever parsed source include a - * debugger statement. - */ - public JsStatement getDebuggerStmt() { - return debuggerStmt; - } - - public JsEmpty getEmptyStmt() { - return emptyStmt; - } - - public JsBooleanLiteral getFalseLiteral() { - return falseLiteral; - } - - public JsBlock getFragmentBlock(int fragment) { - if (fragment < 0 || fragment >= fragments.length) { - throw new IllegalArgumentException("Invalid fragment: " + fragment); - } - return fragments[fragment].getGlobalBlock(); - } - - public int getFragmentCount() { - return this.fragments.length; - } - - /** - * Gets the one and only global block. - */ - public JsBlock getGlobalBlock() { - return getFragmentBlock(0); - } - - public JsFunction getIndexedFunction(String name) { - return indexedFunctions.get(name); - } - - public JsNullLiteral getNullLiteral() { - return nullLiteral; - } - - public JsNumberLiteral getNumberLiteral(double value) { - JsNumberLiteral lit = numberLiteralMap.get(value); - if (lit == null) { - lit = new JsNumberLiteral(value); - numberLiteralMap.put(value, lit); - } - - return lit; - } - - public JsScope getObjectScope() { - return objectScope; - } - - /** - * Gets the quasi-mythical root scope. This is not the same as the top scope; - * all unresolvable identifiers wind up here, because they are considered - * external to the program. - */ - public JsRootScope getRootScope() { - return rootScope; - } - - /** - * Gets the top level scope. This is the scope of all the statements in the - * main program. - */ - public JsScope getScope() { - return topScope; - } - - /** - * Creates or retrieves a JsStringLiteral from an interned object pool. - */ - public JsStringLiteral getStringLiteral(String value) { - JsStringLiteral lit = stringLiteralMap.get(value); - if (lit == null) { - lit = new JsStringLiteral(value); - stringLiteralMap.put(value, lit); - } - return lit; - } - - public JsBooleanLiteral getTrueLiteral() { - return trueLiteral; - } - - public JsNameRef getUndefinedLiteral() { - return new JsNameRef("$Dart$Null"); - } - - public void setFragmentCount(int fragments) { - this.fragments = new JsProgramFragment[fragments]; - for (int i = 0; i < fragments; i++) { - this.fragments[i] = new JsProgramFragment(); - } - } - - public void setIndexedFunctions(Map indexedFunctions) { - this.indexedFunctions.clear(); - this.indexedFunctions.putAll(indexedFunctions); - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - for (JsProgramFragment fragment : fragments) { - v.accept(fragment); - } - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.PROGRAM; - } - - -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsProgramFragment.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsProgramFragment.java deleted file mode 100644 index 3c6859e2150..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsProgramFragment.java +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * One independently loadable fragment of a {@link JsProgram}. - */ -public class JsProgramFragment extends JsNode { - - private final JsGlobalBlock globalBlock; - - public JsProgramFragment() { - this.globalBlock = new JsGlobalBlock(); - } - - public JsBlock getGlobalBlock() { - return globalBlock; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - v.accept(globalBlock); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.PROGRAM_FRAGMENT; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPropertyInitializer.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPropertyInitializer.java deleted file mode 100644 index d68d8d01af4..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsPropertyInitializer.java +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Used in object literals to specify property values by name. - */ -public class JsPropertyInitializer extends JsNode { - - private JsExpression labelExpr; - private JsExpression valueExpr; - - public JsPropertyInitializer() { - } - - public JsPropertyInitializer(JsExpression labelExpr, JsExpression valueExpr) { - this.labelExpr = labelExpr; - this.valueExpr = valueExpr; - } - - public JsExpression getLabelExpr() { - return labelExpr; - } - - public JsExpression getValueExpr() { - return valueExpr; - } - - public boolean hasSideEffects() { - return labelExpr.hasSideEffects() || valueExpr.hasSideEffects(); - } - - public void setLabelExpr(JsExpression labelExpr) { - this.labelExpr = labelExpr; - } - - public void setValueExpr(JsExpression valueExpr) { - this.valueExpr = valueExpr; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - labelExpr = v.accept(labelExpr); - valueExpr = v.accept(valueExpr); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.PROPERTY_INIT; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsRegExp.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsRegExp.java deleted file mode 100644 index 158c7a5e092..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsRegExp.java +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript regular expression. - */ -public final class JsRegExp extends JsValueLiteral { - - private String flags; - private String pattern; - - public JsRegExp() { - } - - public String getFlags() { - return flags; - } - - public String getPattern() { - return pattern; - } - - @Override - public boolean isBooleanFalse() { - return false; - } - - @Override - public boolean isBooleanTrue() { - return true; - } - - @Override - public boolean isDefinitelyNotNull() { - return true; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - public void setFlags(String suffix) { - this.flags = suffix; - } - - public void setPattern(String re) { - this.pattern = re; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - v.visit(this, ctx); - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.REGEXP; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsReturn.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsReturn.java deleted file mode 100644 index 16d90e4b353..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsReturn.java +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript return statement. - */ -public final class JsReturn extends JsStatement { - - private JsExpression expr; - - public JsReturn() { - } - - public JsReturn(JsExpression expr) { - this.expr = expr; - } - - public JsExpression getExpr() { - return expr; - } - - public void setExpr(JsExpression expr) { - this.expr = expr; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - if (expr != null) { - expr = v.accept(expr); - } - } - v.endVisit(this, ctx); - } - - @Override - public boolean unconditionalControlBreak() { - return true; - } - - @Override - public NodeKind getKind() { - return NodeKind.RETURN; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsRootScope.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsRootScope.java deleted file mode 100644 index 33b71f26222..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsRootScope.java +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import com.google.dart.compiler.backend.js.JsReservedIdentifiers; - -/** - * The root scope is the parent of every scope. All identifiers in this scope - * are not obfuscatable. This scope is prefilled with reserved global - * JavaScript symbols. - */ -public final class JsRootScope extends JsScope { - - private final JsProgram program; - - public JsRootScope(JsProgram program) { - super("Root"); - this.program = program; - } - - @Override - public JsProgram getProgram() { - return program; - } - - @Override - protected JsName doCreateName(String ident, String shortIdent, String originalName) { - JsName name = super.doCreateName(ident, shortIdent, originalName); - name.setObfuscatable(false); - return name; - } - - @Override - public JsName findExistingNameNoRecurse(String ident) { - JsName name = super.findExistingNameNoRecurse(ident); - if (name == null) { - if (JsReservedIdentifiers.getReservedGlobalSymbols().contains(ident)) { - /* - * Lazily add JsNames for reserved identifiers. Since a JsName for a reserved global symbol - * must report a legitimate enclosing scope, we can't simply have a shared set of symbol - * names. - */ - name = doCreateName(ident, ident, ident); - } - } - return name; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsScope.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsScope.java deleted file mode 100644 index 0a4053960b8..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsScope.java +++ /dev/null @@ -1,308 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import com.google.dart.compiler.util.Lists; -import com.google.dart.compiler.util.Maps; - -import java.io.Serializable; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** - * A scope is a factory for creating and allocating - * {@link JsName}s. A JavaScript AST is - * built in terms of abstract name objects without worrying about obfuscation, - * keyword/identifier blacklisting, and so on. - *

- *

- *

- * Scopes are associated with - * {@link JsFunction}s, but the two are - * not equivalent. Functions have scopes, but a scope does not - * necessarily have an associated Function. Examples of this include the - * {@link JsRootScope} and synthetic - * scopes that might be created by a client. - *

- *

- *

- * Scopes can have parents to provide constraints when allocating actual - * identifiers for names. Specifically, names in child scopes are chosen such - * that they do not conflict with names in their parent scopes. The ultimate - * parent is usually the global scope (see - * {@link JsProgram#getRootScope()}), - * but parentless scopes are useful for managing names that are always accessed - * with a qualifier and could therefore never be confused with the global scope - * hierarchy. - */ -public class JsScope implements Serializable { - - private List children = Collections.emptyList(); - private final String description; - private Map names = Collections.emptyMap(); - private JsScope parent; - protected int tempIndex = 0; - private final String scopeId; - - /* - * Create a scope with parent. - */ - public JsScope(JsScope parent, String description) { - this(parent, description, null); - } - - /** - * Create a scope with parent. - */ - public JsScope(JsScope parent, String description, String scopeId) { - assert (parent != null); - this.scopeId = scopeId; - this.description = description; - this.parent = parent; - parent.children = Lists.add(parent.children, this); - } - - /** - * Rebase the function to a new scope. - * - * @param newParent The scope to add the function to. - */ - public void rebase(JsScope newParent) { - detachFromParent(); - parent = newParent; - parent.children = Lists.add(parent.children, this); - } - - /** - * Rebase the function's children to a new scope. - * - * @param newParent - */ - public void rebaseChildScopes(JsScope newParent) { - if (newParent == this) { - return; - } - parent.children = Lists.addAll(parent.children, children); - for (JsScope child : children) { - child.parent = newParent; - } - children = Collections.emptyList(); - } - - /** - * Subclasses can detach and become parentless. - */ - protected void detachFromParent() { - JsScope oldParent = parent; - - oldParent.children = Lists.remove( - parent.children, oldParent.children.indexOf(this)); - - parent = null; - } - - /** - * Subclasses can be parentless. - */ - protected JsScope(String description) { - this.description = description; - this.parent = null; - this.scopeId = null; - } - - /** - * Gets a name object associated with the specified ident in this scope, - * creating it if necessary.
- * If the JsName does not exist yet, a new JsName is created. The ident, - * short name, and original name of the newly created JsName are equal to - * the given ident. - * - * @param ident An identifier that is unique within this scope. - */ - public JsName declareName(String ident) { - JsName name = findExistingNameNoRecurse(ident); - if (name != null) { - return name; - } - return doCreateName(ident, ident, ident); - } - - /** - * Creates a new variable with an unique ident in this scope. - * The generated JsName is guaranteed to have an identifier (but not short - * name) that does not clash with any existing variables in the scope. - * Future declarations of variables might however clash with the temporary - * (unless they use this function). - */ - public JsName declareFreshName(String shortName) { - String ident = shortName; - int counter = 0; - while (findExistingNameNoRecurse(ident) != null) { - ident = shortName + "_" + counter++; - } - return doCreateName(ident, shortName, shortName); - } - - String getNextTempName() { - // TODO(ngeoffray): Decide on a convention for temporary variables - // introduced by the compiler. - return "tmp$" + (scopeId != null ? scopeId + "$" : "") + tempIndex++; - } - - /** - * Creates a temporary variable with an unique name in this scope. - * The generated temporary is guaranteed to have an identifier (but not short - * name) that does not clash with any existing variables in the scope. - * Future declarations of variables might however clash with the temporary. - */ - public JsName declareTemporary() { - return declareFreshName(getNextTempName()); - } - - /** - * Gets a name object associated with the specified ident in this scope, - * creating it if necessary.
- * If the JsName does not exist yet, a new JsName is created with the given - * ident, short name and original name. - * - * @param ident An identifier that is unique within this scope. - * @param shortIdent A "pretty" name that does not have to be unique. - * @throws IllegalArgumentException if ident already exists in this scope but - * the requested short name does not match the existing short name. - */ - public JsName declareName(String ident, String shortIdent) { - return declareName(ident, shortIdent, ident); - } - - /** - * Gets a name object associated with the specified ident in this scope, - * creating it if necessary.
- * If the JsName does not exist yet, a new JsName is created. The original - * name stored in the JsName is equal to the (unmangled) specified originalName. - * - * @param ident An identifier that is unique within this scope. - * @param shortIdent A "pretty" name that does not have to be unique. - * @param originalName The original name in the source. - * @throws IllegalArgumentException if ident already exists in this scope but - * the requested short name does not match the existing short name, - * or the original name does not match the existing original name. - */ - public JsName declareName(String ident, String shortIdent, String originalName) { - JsName name = findExistingNameNoRecurse(ident); - if (name != null) { - if (!name.getShortIdent().equals(shortIdent) - || !nullableEquals(name.getOriginalName(), originalName)) { - throw new IllegalArgumentException("Requested short name " + shortIdent - + " conflicts with preexisting short name " + name.getShortIdent() + " for identifier " - + ident); - } - return name; - } - return doCreateName(ident, shortIdent, originalName); - } - - boolean nullableEquals(String s1, String s2) { - return (s1 == null) ? (s2 == null) : s1.equals(s2); - } - - /** - * Attempts to find the name object for the specified ident, searching in this - * scope, and if not found, in the parent scopes. - * - * @return null if the identifier has no associated name - */ - public final JsName findExistingName(String ident) { - JsName name = findExistingNameNoRecurse(ident); - if (name == null && parent != null) { - return parent.findExistingName(ident); - } - return name; - } - - /** - * Attempts to find an unobfuscatable name object for the specified ident, - * searching in this scope, and if not found, in the parent scopes. - * - * @return null if the identifier has no associated name - */ - public final JsName findExistingUnobfuscatableName(String ident) { - JsName name = findExistingNameNoRecurse(ident); - if (name != null && name.isObfuscatable()) { - name = null; - } - if (name == null && parent != null) { - return parent.findExistingUnobfuscatableName(ident); - } - return name; - } - - /** - * Returns an iterator for all the names defined by this scope. - */ - public Iterator getAllNames() { - return names.values().iterator(); - } - - /** - * Returns a list of this scope's child scopes. - */ - public final List getChildren() { - return children; - } - - /** - * Returns the parent scope of this scope, or null if this is the - * root scope. - */ - public final JsScope getParent() { - return parent; - } - - /** - * Returns the associated program. - */ - public JsProgram getProgram() { - assert (parent != null) : "Subclasses must override getProgram() if they do not set a parent"; - return parent.getProgram(); - } - - @Override - public final String toString() { - if (parent != null) { - return description + "->" + parent; - } else { - return description; - } - } - - /** - * Creates a new name in this scope. - */ - protected JsName doCreateName(String ident, String shortIdent, String originalName) { - JsName name = new JsName(this, ident, shortIdent, originalName); - names = Maps.putOrdered(names, ident, name); - return name; - } - - /** - * Attempts to find the name object for the specified ident, searching in this - * scope only. - * - * @return null if the identifier has no associated name - */ - public JsName findExistingNameNoRecurse(String ident) { - return names.get(ident); - } - - /** - * - * Checks whether this scope owns this name. - */ - public boolean ownsName(JsName name) { - return names.containsValue(name); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsStatement.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsStatement.java deleted file mode 100644 index 82d37ca1185..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsStatement.java +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Abstract base class for JavaScript statement objects. - */ -public abstract class JsStatement extends JsNode { - - protected JsStatement() { - } - - /** - * Returns true if this statement definitely causes an abrupt change in flow - * control. - */ - public boolean unconditionalControlBreak() { - return false; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsStringLiteral.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsStringLiteral.java deleted file mode 100644 index 77e60c9b89a..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsStringLiteral.java +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript string literal expression. - */ -public final class JsStringLiteral extends JsValueLiteral { - - private final String value; - - // These only get created by JsProgram so that they can be interned. - JsStringLiteral(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - - @Override - public boolean isBooleanFalse() { - return value.length() == 0; - } - - @Override - public boolean isBooleanTrue() { - return value.length() != 0; - } - - @Override - public boolean isDefinitelyNotNull() { - return true; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - v.visit(this, ctx); - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.STRING; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsSwitch.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsSwitch.java deleted file mode 100644 index 5a49624af42..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsSwitch.java +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.ArrayList; -import java.util.List; - -/** - * A JavaScript switch statement. - */ -public class JsSwitch extends JsStatement { - - private final List cases = new ArrayList(); - private JsExpression expr; - - public JsSwitch() { - super(); - } - - public List getCases() { - return cases; - } - - public JsExpression getExpr() { - return expr; - } - - public void setExpr(JsExpression expr) { - this.expr = expr; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - expr = v.accept(expr); - v.acceptWithInsertRemove(cases); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.SWITCH; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsSwitchMember.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsSwitchMember.java deleted file mode 100644 index 0a748f60078..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsSwitchMember.java +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.ArrayList; -import java.util.List; - -/** - * A member/case in a JavaScript switch object. - */ -public abstract class JsSwitchMember extends JsNode { - - protected final List stmts = new ArrayList(); - - protected JsSwitchMember() { - super(); - } - - public List getStmts() { - return stmts; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsThisRef.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsThisRef.java deleted file mode 100644 index 9adb6459488..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsThisRef.java +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript this reference. - */ -public final class JsThisRef extends JsValueLiteral { - - public JsThisRef() { - super(); - } - - @Override - public boolean isBooleanFalse() { - return false; - } - - @Override - public boolean isBooleanTrue() { - return true; - } - - @Override - public boolean isDefinitelyNotNull() { - /* - * You'd think that you could get a null this via function.call/apply, but - * in fact you can't: they just make this be the window object instead. So - * it really can't ever be null. - */ - return true; - } - - @Override - public boolean isDefinitelyNull() { - return false; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - v.visit(this, ctx); - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.THIS; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsThrow.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsThrow.java deleted file mode 100644 index 4616418fb6b..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsThrow.java +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript throw statement. - */ -public class JsThrow extends JsStatement { - - private JsExpression expr; - - public JsThrow() { - super(); - } - - public JsThrow(JsExpression expr) { - super(); - this.expr = expr; - } - - public JsExpression getExpr() { - return expr; - } - - public void setExpr(JsExpression expr) { - this.expr = expr; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - expr = v.accept(expr); - } - v.endVisit(this, ctx); - } - - @Override - public boolean unconditionalControlBreak() { - return true; - } - - @Override - public NodeKind getKind() { - return NodeKind.THROW; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsTry.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsTry.java deleted file mode 100644 index 61357bcd406..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsTry.java +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.ArrayList; -import java.util.List; - -/** - * A JavaScript try statement. - */ -public class JsTry extends JsStatement { - - private final List catches = new ArrayList(); - private JsBlock finallyBlock; - private JsBlock tryBlock; - - public JsTry() { - super(); - } - - public List getCatches() { - return catches; - } - - public JsBlock getFinallyBlock() { - return finallyBlock; - } - - public JsBlock getTryBlock() { - return tryBlock; - } - - public void setFinallyBlock(JsBlock block) { - this.finallyBlock = block; - } - - public void setTryBlock(JsBlock block) { - tryBlock = block; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - tryBlock = v.accept(tryBlock); - v.acceptWithInsertRemove(catches); - if (finallyBlock != null) { - finallyBlock = v.accept(finallyBlock); - } - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.TRY; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsUnaryOperation.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsUnaryOperation.java deleted file mode 100644 index 00f103f35c9..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsUnaryOperation.java +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript prefix or postfix operation. - */ -public abstract class JsUnaryOperation extends JsExpression { - - private JsExpression arg; - - private final JsUnaryOperator op; - - public JsUnaryOperation(JsUnaryOperator op) { - this(op, null); - } - - public JsUnaryOperation(JsUnaryOperator op, JsExpression arg) { - super(); - this.op = op; - this.arg = arg; - } - - public JsExpression getArg() { - return arg; - } - - public JsUnaryOperator getOperator() { - return op; - } - - @Override - public final boolean hasSideEffects() { - return op.isModifying() || arg.hasSideEffects(); - } - - public void setArg(JsExpression arg) { - this.arg = arg; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (op.isModifying()) { - // The delete operator is practically like an assignment of undefined, so - // for practical purposes we're treating it as an lvalue. - arg = v.acceptLvalue(arg); - } else { - arg = v.accept(arg); - } - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsUnaryOperator.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsUnaryOperator.java deleted file mode 100644 index 2b854d8313e..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsUnaryOperator.java +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript unary operator. - */ -public enum JsUnaryOperator implements JsOperator { - - /* - * Precedence indices from "JavaScript - The Definitive Guide" 4th Edition - * (page 57) - */ - BIT_NOT("~", 14, PREFIX), DEC("--", 14, POSTFIX | PREFIX), DELETE("delete", 14, PREFIX), INC( - "++", 14, POSTFIX | PREFIX), NEG("-", 14, PREFIX), POS("+", 14, PREFIX), - NOT("!", 14, PREFIX), TYPEOF("typeof", 14, PREFIX), VOID("void", 14, PREFIX); - - private final int mask; - private final int precedence; - private final String symbol; - - private JsUnaryOperator(String symbol, int precedence, int mask) { - this.symbol = symbol; - this.precedence = precedence; - this.mask = mask; - } - - @Override - public int getPrecedence() { - return precedence; - } - - @Override - public String getSymbol() { - return symbol; - } - - @Override - public boolean isKeyword() { - return this == DELETE || this == TYPEOF || this == VOID; - } - - @Override - public boolean isLeftAssociative() { - return (mask & LEFT) != 0; - } - - public boolean isModifying() { - return this == DEC || this == INC || this == DELETE; - } - - @Override - public boolean isPrecedenceLessThan(JsOperator other) { - return precedence < other.getPrecedence(); - } - - @Override - public boolean isValidInfix() { - return (mask & INFIX) != 0; - } - - @Override - public boolean isValidPostfix() { - return (mask & POSTFIX) != 0; - } - - @Override - public boolean isValidPrefix() { - return (mask & PREFIX) != 0; - } - - @Override - public String toString() { - return symbol; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsValueLiteral.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsValueLiteral.java deleted file mode 100644 index f23ab5dbce4..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsValueLiteral.java +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript string literal expression. - */ -public abstract class JsValueLiteral extends JsLiteral { - - protected JsValueLiteral() { - } - - @Override - public final boolean hasSideEffects() { - return false; - } - - @Override - public final boolean isLeaf() { - return true; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVars.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVars.java deleted file mode 100644 index aaf629259aa..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVars.java +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import com.google.dart.compiler.common.SourceInfo; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * A JavaScript var statement. - */ -public class JsVars extends JsStatement implements Iterable { - - /** - * A var declared using the JavaScript var statement. - */ - public static class JsVar extends JsNode implements HasName { - - private final JsName name; - private JsExpression initExpr; - - public JsVar(JsName name) { - this.name = name; - } - - public JsVar(JsName name, JsExpression initExpr) { - this.name = name; - this.initExpr = initExpr; - } - - public JsExpression getInitExpr() { - return initExpr; - } - - @Override - public JsName getName() { - return name; - } - - public void setInitExpr(JsExpression initExpr) { - this.initExpr = initExpr; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - if (initExpr != null) { - initExpr = v.accept(initExpr); - } - } - v.endVisit(this, ctx); - } - - @Override - public JsVar setSourceRef(SourceInfo info) { - super.setSourceRef(info); - return this; - } - - @Override - public NodeKind getKind() { - return NodeKind.VAR; - } - } - - private final List vars = new ArrayList(); - - public JsVars() { - } - - public void add(JsVar var) { - vars.add(var); - } - - public int getNumVars() { - return vars.size(); - } - - public void insert(JsVar var) { - vars.add(var); - } - - public boolean isEmpty() { - return vars.isEmpty(); - } - - // Iterator returns JsVar objects - @Override - public Iterator iterator() { - return vars.iterator(); - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - v.acceptWithInsertRemove(vars); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.VARS; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVisitable.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVisitable.java deleted file mode 100644 index 626648af8ae..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVisitable.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * Abstracts the idea that a class can be traversed. - */ -public interface JsVisitable { - - /** - * Causes this object to have the visitor visit itself and its children. - * - * @param visitor the visitor that should traverse this node - * @param ctx the context of an existing traversal - */ - void traverse(JsVisitor visitor, JsContext ctx); -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVisitor.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVisitor.java deleted file mode 100644 index 5b9cd983d08..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsVisitor.java +++ /dev/null @@ -1,430 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -import java.util.List; - -/** - * Implemented by nodes that will visit child nodes. - */ -@SuppressWarnings("unused") -public class JsVisitor { - - protected static final JsContext LVALUE_CONTEXT = new JsContext() { - - @Override - public boolean canInsert() { - return false; - } - - @Override - public boolean canRemove() { - return false; - } - - @Override - public void insertAfter(JsVisitable node) { - throw new UnsupportedOperationException(); - } - - @Override - public void insertBefore(JsVisitable node) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isLvalue() { - return true; - } - - @Override - public void removeMe() { - throw new UnsupportedOperationException(); - } - - @Override - public void replaceMe(JsVisitable node) { - throw new UnsupportedOperationException(); - } - }; - - protected static final JsContext UNMODIFIABLE_CONTEXT = new JsContext() { - - @Override - public boolean canInsert() { - return false; - } - - @Override - public boolean canRemove() { - return false; - } - - @Override - public void insertAfter(JsVisitable node) { - throw new UnsupportedOperationException(); - } - - @Override - public void insertBefore(JsVisitable node) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isLvalue() { - return false; - } - - @Override - public void removeMe() { - throw new UnsupportedOperationException(); - } - - @Override - public void replaceMe(JsVisitable node) { - throw new UnsupportedOperationException(); - } - }; - - public final T accept(T node) { - return this.doAccept(node); - } - - public final void acceptList(List collection) { - doAcceptList(collection); - } - - public JsExpression acceptLvalue(JsExpression expr) { - return doAcceptLvalue(expr); - } - - public final void acceptWithInsertRemove(List collection) { - doAcceptWithInsertRemove(collection); - } - - public boolean didChange() { - throw new UnsupportedOperationException(); - } - - public void endVisit(JsArrayAccess x, JsContext ctx) { - } - - public void endVisit(JsArrayLiteral x, JsContext ctx) { - } - - public void endVisit(JsBinaryOperation x, JsContext ctx) { - } - - public void endVisit(JsBlock x, JsContext ctx) { - } - - public void endVisit(JsBooleanLiteral x, JsContext ctx) { - } - - public void endVisit(JsBreak x, JsContext ctx) { - } - - public void endVisit(JsCase x, JsContext ctx) { - } - - public void endVisit(JsCatch x, JsContext ctx) { - } - - public void endVisit(JsConditional x, JsContext ctx) { - } - - public void endVisit(JsContinue x, JsContext ctx) { - } - - public void endVisit(JsDebugger x, JsContext ctx) { - } - - public void endVisit(JsDefault x, JsContext ctx) { - } - - public void endVisit(JsDoWhile x, JsContext ctx) { - } - - public void endVisit(JsEmpty x, JsContext ctx) { - } - - public void endVisit(JsExprStmt x, JsContext ctx) { - } - - public void endVisit(JsFor x, JsContext ctx) { - } - - public void endVisit(JsForIn x, JsContext ctx) { - } - - public void endVisit(JsFunction x, JsContext ctx) { - } - - public void endVisit(JsIf x, JsContext ctx) { - } - - public void endVisit(JsInvocation x, JsContext ctx) { - } - - public void endVisit(JsLabel x, JsContext ctx) { - } - - public void endVisit(JsNameRef x, JsContext ctx) { - } - - public void endVisit(JsNew x, JsContext ctx) { - } - - public void endVisit(JsNullLiteral x, JsContext ctx) { - } - - public void endVisit(JsNumberLiteral x, JsContext ctx) { - } - - public void endVisit(JsObjectLiteral x, JsContext ctx) { - } - - public void endVisit(JsParameter x, JsContext ctx) { - } - - public void endVisit(JsPostfixOperation x, JsContext ctx) { - } - - public void endVisit(JsPrefixOperation x, JsContext ctx) { - } - - public void endVisit(JsProgram x, JsContext ctx) { - } - - public void endVisit(JsProgramFragment x, JsContext ctx) { - } - - public void endVisit(JsPropertyInitializer x, JsContext ctx) { - } - - public void endVisit(JsRegExp x, JsContext ctx) { - } - - public void endVisit(JsReturn x, JsContext ctx) { - } - - public void endVisit(JsStringLiteral x, JsContext ctx) { - } - - public void endVisit(JsSwitch x, JsContext ctx) { - } - - public void endVisit(JsThisRef x, JsContext ctx) { - } - - public void endVisit(JsThrow x, JsContext ctx) { - } - - public void endVisit(JsTry x, JsContext ctx) { - } - - public void endVisit(JsVars.JsVar x, JsContext ctx) { - } - - public void endVisit(JsVars x, JsContext ctx) { - } - - public void endVisit(JsWhile x, JsContext ctx) { - } - - public boolean visit(JsArrayAccess x, JsContext ctx) { - return true; - } - - public boolean visit(JsArrayLiteral x, JsContext ctx) { - return true; - } - - public boolean visit(JsBinaryOperation x, JsContext ctx) { - return true; - } - - public boolean visit(JsBlock x, JsContext ctx) { - return true; - } - - public boolean visit(JsBooleanLiteral x, JsContext ctx) { - return true; - } - - public boolean visit(JsBreak x, JsContext ctx) { - return true; - } - - public boolean visit(JsCase x, JsContext ctx) { - return true; - } - - public boolean visit(JsCatch x, JsContext ctx) { - return true; - } - - public boolean visit(JsConditional x, JsContext ctx) { - return true; - } - - public boolean visit(JsContinue x, JsContext ctx) { - return true; - } - - public boolean visit(JsDebugger x, JsContext ctx) { - return true; - } - - public boolean visit(JsDefault x, JsContext ctx) { - return true; - } - - public boolean visit(JsDoWhile x, JsContext ctx) { - return true; - } - - public boolean visit(JsEmpty x, JsContext ctx) { - return true; - } - - public boolean visit(JsExprStmt x, JsContext ctx) { - return true; - } - - public boolean visit(JsFor x, JsContext ctx) { - return true; - } - - public boolean visit(JsForIn x, JsContext ctx) { - return true; - } - - public boolean visit(JsFunction x, JsContext ctx) { - return true; - } - - public boolean visit(JsIf x, JsContext ctx) { - return true; - } - - public boolean visit(JsInvocation x, JsContext ctx) { - return true; - } - - public boolean visit(JsLabel x, JsContext ctx) { - return true; - } - - public boolean visit(JsNameRef x, JsContext ctx) { - return true; - } - - public boolean visit(JsNew x, JsContext ctx) { - return true; - } - - public boolean visit(JsNullLiteral x, JsContext ctx) { - return true; - } - - public boolean visit(JsNumberLiteral x, JsContext ctx) { - return true; - } - - public boolean visit(JsObjectLiteral x, JsContext ctx) { - return true; - } - - public boolean visit(JsParameter x, JsContext ctx) { - return true; - } - - public boolean visit(JsPostfixOperation x, JsContext ctx) { - return true; - } - - public boolean visit(JsPrefixOperation x, JsContext ctx) { - return true; - } - - public boolean visit(JsProgram x, JsContext ctx) { - return true; - } - - public boolean visit(JsProgramFragment x, JsContext ctx) { - return true; - } - - public boolean visit(JsPropertyInitializer x, JsContext ctx) { - return true; - } - - public boolean visit(JsRegExp x, JsContext ctx) { - return true; - } - - public boolean visit(JsReturn x, JsContext ctx) { - return true; - } - - public boolean visit(JsStringLiteral x, JsContext ctx) { - return true; - } - - public boolean visit(JsSwitch x, JsContext ctx) { - return true; - } - - public boolean visit(JsThisRef x, JsContext ctx) { - return true; - } - - public boolean visit(JsThrow x, JsContext ctx) { - return true; - } - - public boolean visit(JsTry x, JsContext ctx) { - return true; - } - - public boolean visit(JsVars.JsVar x, JsContext ctx) { - return true; - } - - public boolean visit(JsVars x, JsContext ctx) { - return true; - } - - public boolean visit(JsWhile x, JsContext ctx) { - return true; - } - - protected T doAccept(T node) { - doTraverse(node, UNMODIFIABLE_CONTEXT); - return node; - } - - protected void doAcceptList(List collection) { - for (T node : collection) { - doTraverse(node, UNMODIFIABLE_CONTEXT); - } - } - - protected JsExpression doAcceptLvalue(JsExpression expr) { - doTraverse(expr, LVALUE_CONTEXT); - return expr; - } - - protected void doAcceptWithInsertRemove(List collection) { - for (T node : collection) { - doTraverse(node, UNMODIFIABLE_CONTEXT); - } - } - - protected void doTraverse(JsVisitable node, JsContext ctx) { - node.traverse(this, ctx); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsWhile.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsWhile.java deleted file mode 100644 index c40203bc1f1..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/JsWhile.java +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -/** - * A JavaScript while statement. - */ -public class JsWhile extends JsStatement { - - private JsStatement body; - private JsExpression condition; - - public JsWhile() { - } - - public JsWhile(JsExpression condition, JsStatement body) { - this.condition = condition; - this.body = body; - } - - public JsStatement getBody() { - return body; - } - - public JsExpression getCondition() { - return condition; - } - - public void setBody(JsStatement body) { - this.body = body; - } - - public void setCondition(JsExpression condition) { - this.condition = condition; - } - - @Override - public void traverse(JsVisitor v, JsContext ctx) { - if (v.visit(this, ctx)) { - condition = v.accept(condition); - body = v.accept(body); - } - v.endVisit(this, ctx); - } - - @Override - public NodeKind getKind() { - return NodeKind.WHILE; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/NodeKind.java b/js/js.ast/src/com/google/dart/compiler/backend/js/ast/NodeKind.java deleted file mode 100644 index 614e4bb3bd9..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/backend/js/ast/NodeKind.java +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.backend.js.ast; - -public enum NodeKind { - ARRAY_ACCESS, - ARRAY, - BINARY_OP, - BLOCK, - BOOLEAN, - BREAK, - CASE, - CATCH, - CONDITIONAL, - CONTINUE, - DEBUGGER, - DEFAULT, - DO, - EMPTY, - EXPR_STMT, - FOR, - FOR_IN, - FUNCTION, - IF, - INVOKE, - LABEL, - NAME_REF, - NEW, - NULL, - NUMBER, - OBJECT, - PARAMETER, - POSTFIX_OP, - PREFIX_OP, - PROGRAM, - PROGRAM_FRAGMENT, - PROPERTY_INIT, - REGEXP, - RETURN, - STRING, - SWITCH, - THIS, - THROW, - TRY, - VARS, - VAR, - WHILE -} diff --git a/js/js.ast/src/com/google/dart/compiler/common/AbstractNode.java b/js/js.ast/src/com/google/dart/compiler/common/AbstractNode.java deleted file mode 100644 index 5b70197dd13..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/common/AbstractNode.java +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.common; - -import com.google.dart.compiler.Source; - -/** - * Abstract base class for nodes that carry source information. - */ -public class AbstractNode implements SourceInfo, HasSourceInfo { - - // TODO(johnlenz): All this source location data is wasteful. - // Move it into a com.google.dart.compiler.backend.common object, that can be shared between the ASTs - // or something. - protected Source source = null; - protected int sourceLine = -1; - protected int sourceColumn = -1; - protected int sourceStart = -1; - protected int sourceLength = -1; - - @Override - public Source getSource() { - return source; - } - - @Override - public int getSourceLine() { - return sourceLine; - } - - @Override - public int getSourceColumn() { - return sourceColumn; - } - - @Override - public int getSourceStart() { - return sourceStart; - } - - @Override - public int getSourceLength() { - return sourceLength; - } - - @Override - public SourceInfo getSourceInfo() { - return this; - } - - @Override - public void setSourceInfo(SourceInfo info) { - source = info.getSource(); - sourceStart = info.getSourceStart(); - sourceLength = info.getSourceLength(); - sourceLine = info.getSourceLine(); - sourceColumn = info.getSourceColumn(); - } - - @Override - public final void setSourceLocation( - Source source, int line, int column, int startPosition, int length) { - assert (startPosition != -1 && length >= 0 - || startPosition == -1 && length == 0); - this.source = source; - this.sourceLine = line; - this.sourceColumn = column; - this.sourceStart = startPosition; - this.sourceLength = length; - } - - public final void setSourceRange(int startPosition, int length) { - assert (startPosition != -1 && length >= 0 - || startPosition == -1 && length == 0); - this.sourceStart = startPosition; - this.sourceLength = length; - } - -} diff --git a/js/js.ast/src/com/google/dart/compiler/common/HasSourceInfo.java b/js/js.ast/src/com/google/dart/compiler/common/HasSourceInfo.java deleted file mode 100644 index bda3da94996..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/common/HasSourceInfo.java +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.common; - -import com.google.dart.compiler.Source; - -/** - * Abstract view of a class that has source info. - */ -public interface HasSourceInfo { - - /** - * Return the source info associated with this object. - */ - SourceInfo getSourceInfo(); - - /** - * Set the source info associated with this object. May only be called once. - * @param info - */ - void setSourceInfo(SourceInfo info); - - /** - * Sets the source range of the original source file where the source fragment - * corresponding to this node was found. - * - *

- * Each node in the subtree (other than the contrived nodes) carries source - * range(s) information relating back to positions in the given source (the - * given source itself is not remembered with the AST). The source range - * usually begins at the first character of the first token corresponding to - * the node; leading whitespace and comments are not included. The - * source range usually extends through the last character of the last token - * corresponding to the node; trailing whitespace and comments are not - * included. There are a handful of exceptions (including the various body - * declarations). Source ranges nest properly: the source range for a child is - * always within the source range of its parent, and the source ranges of - * sibling nodes never overlap. - * - * @param source the associated source - * @param line the 1-based line index, or -1, if no source - * location is available - * @param column the 1-based column index, or -1, if no source - * location is available - * @param startPosition a 0-based character index, or -1, if no - * source location is available - * @param length a (possibly 0) length, or -1, if no source - * location is available - * @see SourceInfo#getSourceStart() - * @see SourceInfo#getSourceLength() - */ - void setSourceLocation(Source source, int line, int column, int startPosition, int length); -} diff --git a/js/js.ast/src/com/google/dart/compiler/common/Name.java b/js/js.ast/src/com/google/dart/compiler/common/Name.java deleted file mode 100644 index 4697b491d96..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/common/Name.java +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.common; - -import java.io.*; -import java.nio.charset.Charset; - -/** - * Instead of Strings, we use GlobalNames to abstract the underlying representation. - * - *

    - *
  • GlobalNames are globally unique and use identity for equality.
  • - *
  • GlobalNames are interned, so all references to the same name use the same - * bytes.
  • - *
- * TODO(scottb): use byte[] instead of char[] when the parser is rewritten - * to parse byte[]. - */ -public final class Name implements Serializable { - - /** - * The encoding this class uses when converting between chars and bytes. - */ - public static final Charset CHARSET = Charset.forName("UTF-8"); - - private static final NameFactory factory = new NameFactory(); - - private static final long serialVersionUID = 0L; - - /** - * Return the Name corresponding to the data. An internal reference to - * data is kept for efficiency, do NOT mutate data after calling - * this method. - */ - public static Name of(char[] data) { - return factory.of(data); - } - - /** - * Return the Name corresponding to the data. An internal copy of the data is - * made. - */ - public static Name of(char[] data, int offset, int length) { - return factory.of(data, offset, length); - } - - static int computeHashCode(char[] data, int offset, int length) { - // Effective Java Item 9. - int result = 89; - for (int i = offset, end = offset + length; i < end; ++i) { - result *= 31; - result += data[i]; - } - return result; - } - - final char[] data; - - private final transient int hashCode; - - Name(char[] data, int hashCode) { - this.data = data; - this.hashCode = hashCode; - } - - /** - * Always compares based on identity. - */ - @Override - public boolean equals(Object obj) { - return this == obj; - } - - /** - * Returns the hashCode of the underlying data. - */ - @Override - public int hashCode() { - return hashCode; - } - - /** - * Constructs a String to represent the internal data. - */ - @Override - public String toString() { - return String.valueOf(data); - } - - /** - * Write my data into a {@link java.io.OutputStream} using the encoding specified in - * {@link #CHARSET}. - */ - public void writeBytesTo(OutputStream out) throws IOException { - // TODO(scottb): avoid allocating the String. - out.write(new String(data).getBytes(CHARSET)); - } - - /** - * Write my character data into a {@link java.io.PrintStream}. - */ - public void writeCharsTo(PrintStream out) { - out.print(data); - } - - /** - * Write my character data into a {@link java.io.Writer}. - */ - public void writeCharsTo(Writer writer) throws IOException { - writer.write(data); - } - - /** - * Replace with the canonical instance. - */ - private Object readResolve() { - return Name.of(data); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/common/NameFactory.java b/js/js.ast/src/com/google/dart/compiler/common/NameFactory.java deleted file mode 100644 index d305f290bf9..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/common/NameFactory.java +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.common; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.MapMaker; - -import java.lang.ref.ReferenceQueue; -import java.lang.ref.WeakReference; -import java.util.Arrays; -import java.util.concurrent.ConcurrentMap; - -/** - * Manages the life cycle, uniqueness, and object identity invariants of - * {@link Name}. - */ -final class NameFactory { - /* - * TODO: does this actually save memory in practice? For each interned Name, - * we use: - * - * 1) The data array (n bytes). - * - * 2) The Name object (2 fields) - * - * 3) The RealKey (1 field + 4 fields from Reference). - * - * 4) ConcurrentMap.Entry (4 fields) - * - * Of course, a Map is really much heavier than we need, all we really need is - * a Set where you can retrieve an object already in the Set. A bare linear - * probe hash table of RealKey would let us get rid of the Entry object. - */ - - /** - * The whole point of this class is to cheaply create a light-weight key that - * doesn't need to make its own copy of the data. This object is constructed - * with equality semantics to {com.google.dart.compiler.backend.common.NameFactory.RealKey}, for doing cheap map lookups. - */ - private static final class FakeKey { - private final char[] data; - private final int hashCode; - private final int length; - private final int offset; - - public FakeKey(char[] data, int hashCode) { - this(data, 0, data.length, hashCode); - } - - public FakeKey(char[] data, int offset, int length, int hashCode) { - this.data = data; - this.offset = offset; - this.length = length; - this.hashCode = hashCode; - } - - @Override - public boolean equals(Object obj) { - /* - * NOTE: this ONLY WORKS for comparisons to RealKey. But that's all we - * need since we only store real keys in the map. - */ - Name name = ((RealKey) obj).get(); - if (name == null) { - return false; - } - return equalsName(name); - } - - public boolean equalsName(Name name) { - if (this.length != name.data.length) { - return false; - } - int itMine = this.offset; - int itTheirs = 0; - int endMine = this.offset + this.length; - while (itMine < endMine) { - if (this.data[itMine++] != name.data[itTheirs++]) { - return false; - } - } - return true; - } - - @Override - public int hashCode() { - return hashCode; - } - - @Override - public String toString() { - return "FakeKey(" + String.valueOf(data, offset, length) + ")"; - } - } - - /** - * Adapted from {@link com.google.common.collect.Interners#newWeakInterner()}. - */ - private static final class RealKey extends WeakReference { - /** - * Must store the hashCode locally so we can be removed from - * {com.google.dart.compiler.backend.common.NameFactory#map} after our referent is cleared. - */ - private final int hashCode; - - public RealKey(Name name, ReferenceQueue queue) { - super(name, queue); - hashCode = name.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj instanceof FakeKey) { - Name referent = get(); - if (referent == null) { - return false; - } - return ((FakeKey) obj).equalsName(referent); - } - if (obj instanceof RealKey) { - Name referent = get(); - if (referent == null) { - return false; - } - Name otherReferent = ((RealKey) obj).get(); - if (otherReferent == null) { - return false; - } - return Arrays.equals(referent.data, otherReferent.data); - } - return false; - } - - @Override - public int hashCode() { - return hashCode; - } - - @Override - public String toString() { - Name referent = get(); - return "RealKey(" + referent + ")"; - } - } - - private final ConcurrentMap map = new MapMaker().makeMap(); - private final ReferenceQueue queue = new ReferenceQueue(); - - /** - * Return the Name corresponding to the data. An internal reference to - * data may be kept. - */ - public Name of(char[] data) { - cleanUp(); - int hashCode = Name.computeHashCode(data, 0, data.length); - FakeKey fakeKey = new FakeKey(data, hashCode); - Name result = get(fakeKey); - if (result == null) { - result = put(new Name(data, hashCode)); - } - return result; - } - - /** - * Return the Name corresponding to the data. An internal copy of the data is - * made. - */ - public Name of(char[] data, int offset, int length) { - cleanUp(); - int hashCode = Name.computeHashCode(data, offset, length); - FakeKey fakeKey = new FakeKey(data, offset, length, hashCode); - Name result = get(fakeKey); - if (result == null) { - char[] copy = new char[length]; - System.arraycopy(data, offset, copy, 0, length); - result = put(new Name(copy, hashCode)); - } - return result; - } - - @VisibleForTesting - void cleanUp() { - RealKey item; - while ((item = (RealKey) queue.poll()) != null) { - map.remove(item); - } - } - - @VisibleForTesting - WeakReference getRefFor(Name name) { - return map.get(new FakeKey(name.data, name.hashCode())); - } - - @VisibleForTesting - int numEntries() { - return map.size(); - } - - private Name get(FakeKey fakeKey) { - RealKey realKey = map.get(fakeKey); - if (realKey != null) { - return realKey.get(); - } - return null; - } - - private Name put(Name name) { - RealKey realKey = new RealKey(name, queue); - while (true) { - RealKey sneakyRef = map.putIfAbsent(realKey, realKey); - if (sneakyRef == null) { - return name; - } else { - Name canonical = sneakyRef.get(); - if (canonical != null) { - return canonical; - } - } - } - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/common/SourceInfo.java b/js/js.ast/src/com/google/dart/compiler/common/SourceInfo.java deleted file mode 100644 index 3a5cd23f113..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/common/SourceInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.common; -import com.google.dart.compiler.Source; - -import java.io.Serializable; - -/** - * Tracks file and line information for AST nodes. - */ -public interface SourceInfo extends Serializable { - - /** - * The source code provider. - */ - Source getSource(); - - /** - * @return A 1-based line number into the original source file indicating - * where the source fragment begins. - */ - int getSourceLine(); - - /** - * @return A 1-based column number into the original source file indicating - * where the source fragment begins. - */ - int getSourceColumn(); - - /** - * Returns the character index into the original source file indicating - * where the source fragment corresponding to this node begins. - * - *

- * The parser supplies useful well-defined source ranges to the nodes it creates. - * - * @return the 0-based character index, or -1 - * if no source startPosition information is recorded for this node - * @see #getSourceLength() - * @see HasSourceInfo#setSourceLocation(com.google.dart.compiler.Source, int, int, int, int) - */ - int getSourceStart(); - - /** - * Returns the length in characters of the original source file indicating - * where the source fragment corresponding to this node ends. - *

- * The parser supplies useful well-defined source ranges to the nodes it creates. - * - * @return a (possibly 0) length, or 0 - * if no source source position information is recorded for this node - * @see #getSourceStart() - * @see HasSourceInfo#setSourceLocation(com.google.dart.compiler.Source, int, int, int, int) - */ - int getSourceLength(); -} diff --git a/js/js.ast/src/com/google/dart/compiler/util/AbstractTextOutput.java b/js/js.ast/src/com/google/dart/compiler/util/AbstractTextOutput.java deleted file mode 100644 index 9c8d2b1cd16..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/util/AbstractTextOutput.java +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.util; - -import java.io.PrintWriter; -import java.util.Arrays; - -/** - * An abstract base type to build TextOutput implementations. - */ -public abstract class AbstractTextOutput implements TextOutput { - private final boolean compact; - private int identLevel = 0; - private int indentGranularity = 2; - private char[][] indents = new char[][] {new char[0]}; - private boolean justNewlined; - private PrintWriter out; - private int position = 0; - private int line = 0; - private int column = 0; - - protected AbstractTextOutput(boolean compact) { - this.compact = compact; - } - - public int getPosition() { - return position; - } - - public int getLine() { - return line; - } - - public int getColumn() { - return column; - } - - public void indentIn() { - ++identLevel; - if (identLevel >= indents.length) { - // Cache a new level of indentation string. - // - char[] newIndentLevel = new char[identLevel * indentGranularity]; - Arrays.fill(newIndentLevel, ' '); - char[][] newIndents = new char[indents.length + 1][]; - System.arraycopy(indents, 0, newIndents, 0, indents.length); - newIndents[identLevel] = newIndentLevel; - indents = newIndents; - } - } - - public void indentOut() { - --identLevel; - } - - public void newline() { - out.print('\n'); - position++; - line++; - column = 0; - justNewlined = true; - } - - public void newlineOpt() { - if (!compact) { - newline(); - } - } - - public void print(char c) { - maybeIndent(); - out.print(c); - position++; - column++; - justNewlined = false; - } - - public void print(char[] s) { - maybeIndent(); - printAndCount(s); - justNewlined = false; - } - - public void print(String s) { - maybeIndent(); - printAndCount(s.toCharArray()); - justNewlined = false; - } - - // Why don't the "Opt" methods update "justNewLined"? - public void printOpt(char c) { - if (!compact) { - maybeIndent(); - out.print(c); - position += 1; - column++; - } - } - - public void printOpt(char[] s) { - if (!compact) { - maybeIndent(); - printAndCount(s); - } - } - - public void printOpt(String s) { - if (!compact) { - maybeIndent(); - printAndCount(s.toCharArray()); - } - } - - protected void setPrintWriter(PrintWriter out) { - this.out = out; - } - - private void maybeIndent() { - if (justNewlined && !compact) { - printAndCount(indents[identLevel]); - justNewlined = false; - } - } - - private void printAndCount(char[] chars) { - position += chars.length; - column += chars.length; - out.print(chars); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/util/AstUtil.java b/js/js.ast/src/com/google/dart/compiler/util/AstUtil.java deleted file mode 100644 index c635d696c54..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/util/AstUtil.java +++ /dev/null @@ -1,404 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.util; - -import com.google.dart.compiler.InternalCompilerException; -import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.common.SourceInfo; -import com.sun.istack.internal.NotNull; - -import java.util.List; - -/** - * @author johnlenz@google.com (John Lenz) - */ -public class AstUtil { - - public static JsInvocation newInvocation( - JsExpression target, JsExpression... params) { - JsInvocation invoke = new JsInvocation(); - invoke.setQualifier(target); - for (JsExpression expr : params) { - invoke.getArguments().add(expr); - } - return invoke; - } - - public static JsInvocation newInvocation( - JsExpression target, List params) { - JsInvocation invoke = new JsInvocation(); - invoke.setQualifier(target); - for (JsExpression expr : params) { - invoke.getArguments().add(expr); - } - return invoke; - } - - public static JsNameRef newQualifiedNameRef(String name) { - JsNameRef node = null; - int endPos = -1; - int startPos = 0; - do { - endPos = name.indexOf('.', startPos); - String part = (endPos == -1 - ? name.substring(startPos) - : name.substring(startPos, endPos)); - node = newNameRef(node, part); - startPos = endPos + 1; - } while (endPos != -1); - - return node; - } - - public static JsNameRef newNameRef(JsExpression qualifier, String prop) { - JsNameRef nameRef = new JsNameRef(prop); - if (qualifier != null) { - nameRef.setQualifier(qualifier); - } - return nameRef; - } - - public static JsNameRef nameref(SourceInfo info, JsName qualifier, JsName prop) { - JsNameRef nameRef = new JsNameRef(prop); - if (qualifier != null) { - nameRef.setQualifier(qualifier.makeRef()); - } - nameRef.setSourceRef(info); - return nameRef; - } - - public static JsNameRef newNameRef(JsExpression qualifier, JsName prop) { - JsNameRef nameRef = new JsNameRef(prop); - if (qualifier != null) { - nameRef.setQualifier(qualifier); - } - return nameRef; - } - - public static JsNameRef newPrototypeNameRef(JsExpression qualifier) { - return newNameRef(qualifier, "prototype"); - } - - public static JsArrayAccess newArrayAccess(JsExpression target, JsExpression key) { - JsArrayAccess arr = new JsArrayAccess(); - arr.setArrayExpr(target); - arr.setIndexExpr(key); - return arr; - } - - public static JsBlock newBlock(JsStatement... stmts) { - JsBlock jsBlock = new JsBlock(); - for (JsStatement stmt : stmts) { - jsBlock.getStatements().add(stmt); - } - return jsBlock; - } - - /** - * Returns a sequence of expressions (using the binary sequence operator). - * - * @param exprs - expressions to add to sequence - * @return a sequence of expressions. - */ - public static JsBinaryOperation newSequence(JsExpression... exprs) { - if (exprs.length < 2) { - throw new InternalCompilerException("newSequence expects at least two arguments"); - } - JsExpression result = exprs[exprs.length - 1]; - for (int i = exprs.length - 2; i >= 0; i--) { - result = new JsBinaryOperation(JsBinaryOperator.COMMA, exprs[i], result); - } - return (JsBinaryOperation) result; - } - - // Ensure a valid LHS - public static JsBinaryOperation newAssignment( - JsNameRef nameRef, JsExpression expr) { - return new JsBinaryOperation(JsBinaryOperator.ASG, nameRef, expr); - } - - public static JsBinaryOperation newAssignment( - JsArrayAccess target, JsExpression expr) { - return new JsBinaryOperation(JsBinaryOperator.ASG, target, expr); - } - - public static JsVars newVar(SourceInfo info, JsName name, JsExpression expr) { - JsVars.JsVar var = new JsVars.JsVar(name).setSourceRef(info); - var.setInitExpr(expr); - JsVars vars = new JsVars(); - vars.add(var); - return vars; - } - - public static JsVars newVar(JsName name, JsExpression expr) { - JsVars.JsVar var = new JsVars.JsVar(name); - if (expr != null) { - var.setInitExpr(expr); - } - JsVars vars = new JsVars(); - vars.add(var); - return vars; - } - - public static JsSwitch newSwitch( - JsExpression expr, JsSwitchMember... cases) { - JsSwitch jsSwitch = new JsSwitch(); - jsSwitch.setExpr(expr); - for (JsSwitchMember jsCase : cases) { - jsSwitch.getCases().add(jsCase); - } - return jsSwitch; - } - - public static JsCase newCase(JsExpression expr, JsStatement... stmts) { - JsCase jsCase = new JsCase(); - jsCase.setCaseExpr(expr); - for (JsStatement stmt : stmts) { - jsCase.getStmts().add(stmt); - } - return jsCase; - } - - public static JsDefault newDefaultCase(JsStatement... stmts) { - JsDefault jsCase = new JsDefault(); - for (JsStatement stmt : stmts) { - jsCase.getStmts().add(stmt); - } - return jsCase; - } - - public static JsFunction newFunction( - JsScope scope, JsName name, List params, JsBlock body) { - JsFunction fn = new JsFunction(scope); - if (name != null) { - fn.setName(name); - } - if (params != null) { - for (JsParameter param : params) { - fn.getParameters().add(param); - } - } - fn.setBody(body); - return fn; - } - - public static JsInvocation call(SourceInfo src, JsExpression target, JsExpression... params) { - return (JsInvocation) newInvocation(target, params).setSourceRef(src); - } - - public static JsBinaryOperation comma(SourceInfo src, JsExpression op1, JsExpression op2) { - return (JsBinaryOperation) new JsBinaryOperation(JsBinaryOperator.COMMA, op1, op2) - .setSourceRef(src); - } - - public static JsNameRef nameref(SourceInfo src, String name) { - return (JsNameRef) new JsNameRef(name).setSourceRef(src); - } - - public static JsNameRef nameref(SourceInfo src, JsName qualifier, String prop) { - return nameref(src, qualifier.makeRef().setSourceRef(src), prop); - } - - public static JsNameRef nameref(SourceInfo src, JsExpression qualifier, String prop) { - return (JsNameRef) newNameRef(qualifier, prop).setSourceRef(src); - } - - public static JsExpression assign(SourceInfo src, JsNameRef op1, JsExpression op2) { - return newAssignment(op1, op2).setSourceRef(src); - } - - public static JsExpression neq(SourceInfo src, JsExpression op1, JsExpression op2) { - return new JsBinaryOperation(JsBinaryOperator.NEQ, op1, op2).setSourceRef(src); - } - - public static JsExpression not(SourceInfo src, JsExpression op1) { - return new JsPrefixOperation(JsUnaryOperator.NOT, op1).setSourceRef(src); - } - - public static JsExpression preinc(SourceInfo src, JsExpression op1) { - return new JsPrefixOperation(JsUnaryOperator.INC, op1).setSourceRef(src); - } - - public static JsExpression and(SourceInfo src, JsExpression op1, JsExpression op2) { - return new JsBinaryOperation(JsBinaryOperator.AND, op1, op2).setSourceRef(src); - } - - public static JsExpression in(SourceInfo src, JsExpression propName, JsExpression obj) { - return new JsBinaryOperation(JsBinaryOperator.INOP, propName, obj).setSourceRef(src); - } - - - // Pavel Talanov - public static JsPropertyInitializer newNamedMethod(JsName name, JsFunction function) { - JsNameRef methodName = name.makeRef(); - return new JsPropertyInitializer(methodName, function); - } - - public static JsStatement convertToStatement(JsNode jsNode) { - assert (jsNode instanceof JsExpression) || (jsNode instanceof JsStatement) - : "Unexpected node of type: " + jsNode.getClass().toString(); - if (jsNode instanceof JsExpression) { - return new JsExprStmt((JsExpression) jsNode); - } - return (JsStatement) jsNode; - } - - public static JsBlock convertToBlock(JsNode jsNode) { - if (jsNode instanceof JsBlock) { - return (JsBlock) jsNode; - } - JsStatement jsStatement = convertToStatement(jsNode); - return new JsBlock(jsStatement); - } - - public static JsExpression convertToExpression(JsNode jsNode) { - assert jsNode instanceof JsExpression : "Unexpected node of type: " + jsNode.getClass().toString(); - return (JsExpression) jsNode; - } - - public static JsNameRef thisQualifiedReference(JsName name) { - JsNameRef result = name.makeRef(); - result.setQualifier(new JsThisRef()); - return result; - } - - public static JsBlock newBlock(List statements) { - JsBlock result = new JsBlock(); - result.setStatements(statements); - return result; - } - - public static JsPrefixOperation negated(JsExpression expression) { - return new JsPrefixOperation(JsUnaryOperator.NOT, expression); - } - - public static JsStatement newAssignmentStatement(JsNameRef nameRef, JsExpression expr) { - return convertToStatement(new JsBinaryOperation(JsBinaryOperator.ASG, nameRef, expr)); - } - - public static JsExpression extractExpressionFromStatement(JsStatement statement) { - assert statement instanceof JsExprStmt : "Cannot extract expression from statement: " + statement; - return (((JsExprStmt) statement).getExpression()); - } - - public static JsBinaryOperation and(JsExpression op1, JsExpression op2) { - return new JsBinaryOperation(JsBinaryOperator.AND, op1, op2); - } - - public static JsBinaryOperation or(JsExpression op1, JsExpression op2) { - return new JsBinaryOperation(JsBinaryOperator.OR, op1, op2); - } - - //TODO refactor - public static void setQualifier(JsExpression selector, JsExpression receiver) { - if (selector instanceof JsInvocation) { - setQualifier(((JsInvocation) selector).getQualifier(), receiver); - return; - } - if (selector instanceof JsNameRef) { - JsNameRef nameRef = (JsNameRef) selector; - JsExpression qualifier = nameRef.getQualifier(); - if (qualifier == null) { - nameRef.setQualifier(receiver); - } else { - setQualifier(qualifier, receiver); - } - return; - } - throw new AssertionError("Set qualifier should be applied only to JsInvocation or JsNameRef instances"); - } - - //TODO: look for should-be-usages - public static JsNameRef qualified(JsName selector, JsExpression qualifier) { - JsNameRef reference = selector.makeRef(); - AstUtil.setQualifier(reference, qualifier); - return reference; - } - - public static JsBinaryOperation equals(JsExpression arg1, JsExpression arg2) { - return new JsBinaryOperation(JsBinaryOperator.EQ, arg1, arg2); - } - - public static JsBinaryOperation notEqual(JsExpression arg1, JsExpression arg2) { - return new JsBinaryOperation(JsBinaryOperator.NEQ, arg1, arg2); - } - - public static JsExpression equalsTrue(JsExpression expression, JsProgram program) { - return equals(expression, program.getTrueLiteral()); - } - - public static JsExpression assignment(JsExpression left, JsExpression right) { - return new JsBinaryOperation(JsBinaryOperator.ASG, left, right); - } - - public static JsBinaryOperation sum(JsExpression left, JsExpression right) { - return new JsBinaryOperation(JsBinaryOperator.ADD, left, right); - } - - public static JsBinaryOperation subtract(JsExpression left, JsExpression right) { - return new JsBinaryOperation(JsBinaryOperator.SUB, left, right); - } - - public static JsPrefixOperation not(JsExpression expression) { - return new JsPrefixOperation(JsUnaryOperator.NOT, expression); - } - - public static JsBinaryOperation typeof(JsExpression expression, JsStringLiteral string) { - return equals(new JsPrefixOperation(JsUnaryOperator.TYPEOF, expression), string); - } - - public static interface Mutator { - public JsNode mutate(JsNode node); - } - - - //TODO: move somewhere - //TODO: refactor and review - public static JsNode mutateLastExpression(JsNode node, Mutator mutator) { - if (node instanceof JsBlock) { - JsBlock block = (JsBlock) node; - List statements = block.getStatements(); - - if (statements.isEmpty()) return block; - - int size = statements.size(); - statements.set(size - 1, - AstUtil.convertToStatement(mutateLastExpression(statements.get(size - 1), mutator))); - return block; - } - if (node instanceof JsIf) { - JsIf ifExpr = (JsIf) node; - ifExpr.setThenStmt(AstUtil.convertToStatement(mutateLastExpression(ifExpr.getThenStmt(), mutator))); - JsStatement elseStmt = ifExpr.getElseStmt(); - if (elseStmt != null) { - ifExpr.setElseStmt(AstUtil.convertToStatement(mutateLastExpression(elseStmt, mutator))); - } - return ifExpr; - } - if (node instanceof JsExprStmt) { - return AstUtil.convertToStatement(mutateLastExpression(((JsExprStmt) node).getExpression(), mutator)); - } - return mutator.mutate(node); - } - - - public static final class SaveLastExpressionMutator implements Mutator { - - @NotNull - private final JsExpression toAssign; - - public SaveLastExpressionMutator(@NotNull JsExpression toAssign) { - this.toAssign = toAssign; - } - - @Override - public JsNode mutate(JsNode node) { - if (!(node instanceof JsExpression)) { - return node; - } - return AstUtil.assignment(toAssign, (JsExpression) node); - } - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/util/DefaultTextOutput.java b/js/js.ast/src/com/google/dart/compiler/util/DefaultTextOutput.java deleted file mode 100644 index 2a064ff87fd..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/util/DefaultTextOutput.java +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.util; - -import java.io.PrintWriter; -import java.io.StringWriter; - -/** - * Adapts {@link TextOutput} to an internal text buffer. - */ -public class DefaultTextOutput extends AbstractTextOutput { - - private final StringWriter sw = new StringWriter(); - private final PrintWriter out; - - public DefaultTextOutput(boolean compact) { - super(compact); - setPrintWriter(out = new PrintWriter(sw)); - } - - @Override - public String toString() { - out.flush(); - if (sw != null) { - return sw.toString(); - } else { - return super.toString(); - } - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/util/Hack.java b/js/js.ast/src/com/google/dart/compiler/util/Hack.java deleted file mode 100644 index 642f416394f..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/util/Hack.java +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.util; - -/** - * Utility to hack around untypable (or yet to be) code. - */ -public class Hack { - public static T cast(Object o) { - @SuppressWarnings("unchecked") - T t = (T) o; - return t; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/util/Lists.java b/js/js.ast/src/com/google/dart/compiler/util/Lists.java deleted file mode 100644 index b0ca023d280..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/util/Lists.java +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.util; - -import java.util.*; - -/** - * Utility methods for operating on memory-efficient lists. All lists of size 0 - * or 1 are assumed to be immutable. All lists of size greater than 1 are - * assumed to be mutable. - */ -public class Lists { - - private static final Class MULTI_LIST_CLASS = ArrayList.class; - private static final Class SINGLETON_LIST_CLASS = Collections.singletonList(null).getClass(); - - public static List add(List list, int index, T toAdd) { - switch (list.size()) { - case 0: - // Empty -> Singleton - if (index != 0) { - throw newIndexOutOfBounds(list, index); - } - return Collections.singletonList(toAdd); - case 1: { - // Singleton -> ArrayList - List result = new ArrayList(2); - switch (index) { - case 0: - result.add(toAdd); - result.add(list.get(0)); - return result; - case 1: - result.add(list.get(0)); - result.add(toAdd); - return result; - default: - throw newIndexOutOfBounds(list, index); - } - } - default: - // ArrayList - list.add(index, toAdd); - return list; - } - } - - public static List add(List list, T toAdd) { - switch (list.size()) { - case 0: - // Empty -> Singleton - return Collections.singletonList(toAdd); - case 1: { - // Singleton -> ArrayList - List result = new ArrayList(2); - result.add(list.get(0)); - result.add(toAdd); - return result; - } - default: - // ArrayList - list.add(toAdd); - return list; - } - } - - public static List addAll(List list, int index, List toAdd) { - switch (toAdd.size()) { - case 0: - // No-op. - return list; - case 1: - // Add one element. - return add(list, index, toAdd.get(0)); - default: - // True list merge, result >= 2. - switch (list.size()) { - case 0: - if (index != 0) { - throw newIndexOutOfBounds(list, index); - } - return new ArrayList(toAdd); - case 1: { - List result = new ArrayList(1 + toAdd.size()); - switch (index) { - case 0: - result.addAll(toAdd); - result.add(list.get(0)); - return result; - case 1: - result.add(list.get(0)); - result.addAll(toAdd); - return result; - default: - throw newIndexOutOfBounds(list, index); - } - } - default: - list.addAll(index, toAdd); - return list; - } - } - } - - public static List addAll(List list, List toAdd) { - switch (toAdd.size()) { - case 0: - // No-op. - return list; - case 1: - // Add one element. - return add(list, toAdd.get(0)); - default: - // True list merge, result >= 2. - switch (list.size()) { - case 0: - return new ArrayList(toAdd); - case 1: { - List result = new ArrayList(1 + toAdd.size()); - result.add(list.get(0)); - result.addAll(toAdd); - return result; - } - default: - list.addAll(toAdd); - return list; - } - } - } - - public static List addAll(List list, T... toAdd) { - switch (toAdd.length) { - case 0: - // No-op. - return list; - case 1: - // Add one element. - return add(list, toAdd[0]); - default: - // True list merge, result >= 2. - switch (list.size()) { - case 0: - return new ArrayList(Arrays.asList(toAdd)); - case 1: { - List result = new ArrayList(1 + toAdd.length); - result.add(list.get(0)); - result.addAll(Arrays.asList(toAdd)); - return result; - } - default: - list.addAll(Arrays.asList(toAdd)); - return list; - } - } - } - - public static List create() { - return Collections.emptyList(); - } - - public static List create(Collection collection) { - switch (collection.size()) { - case 0: - return create(); - default: - return new ArrayList(collection); - } - } - - public static List create(List list) { - switch (list.size()) { - case 0: - return create(); - case 1: - return create(list.get(0)); - default: - return new ArrayList(list); - } - } - - public static List create(T item) { - return Collections.singletonList(item); - } - - public static List create(T... items) { - switch (items.length) { - case 0: - return create(); - case 1: - return create(items[0]); - default: - return new ArrayList(Arrays.asList(items)); - } - } - - public static List normalize(List list) { - switch (list.size()) { - case 0: - return create(); - case 1: { - if (list.getClass() == SINGLETON_LIST_CLASS) { - return list; - } - return create(list.get(0)); - } - default: - if (list.getClass() == MULTI_LIST_CLASS) { - return list; - } - return new ArrayList(list); - } - } - - public static List normalizeUnmodifiable(List list) { - if (list.size() < 2) { - return normalize(list); - } else { - List copy = new ArrayList(list.size()); - Collections.copy(copy, list); - return copy; - } - } - - public static List remove(List list, int toRemove) { - switch (list.size()) { - case 0: - // Empty - throw newIndexOutOfBounds(list, toRemove); - case 1: - // Singleton -> Empty - if (toRemove == 0) { - return Collections.emptyList(); - } else { - throw newIndexOutOfBounds(list, toRemove); - } - case 2: - // ArrayList -> Singleton - switch (toRemove) { - case 0: - return Collections.singletonList(list.get(1)); - case 1: - return Collections.singletonList(list.get(0)); - default: - throw newIndexOutOfBounds(list, toRemove); - } - default: - // ArrayList - list.remove(toRemove); - return list; - } - } - - public static List set(List list, int index, T e) { - switch (list.size()) { - case 0: - // Empty - throw newIndexOutOfBounds(list, index); - case 1: - // Singleton - if (index == 0) { - return Collections.singletonList(e); - } else { - throw newIndexOutOfBounds(list, index); - } - default: - // ArrayList - list.set(index, e); - return list; - } - } - - public static > List sort(List list) { - if (list.size() > 1) { - Collections.sort(list); - } - return list; - } - - public static List sort(List list, Comparator sort) { - if (list.size() > 1) { - Collections.sort(list, sort); - } - return list; - } - - private static IndexOutOfBoundsException newIndexOutOfBounds(List list, int index) { - return new IndexOutOfBoundsException("Index: " + index + ", Size: " + list.size()); - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/util/Maps.java b/js/js.ast/src/com/google/dart/compiler/util/Maps.java deleted file mode 100644 index 15274b04902..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/util/Maps.java +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.util; - -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * Utility methods for operating on memory-efficient maps. All maps of size 0 or - * 1 are assumed to be immutable. All maps of size greater than 1 are assumed to - * be mutable. - */ -public class Maps { - - private static final Class MULTI_MAP_CLASS = HashMap.class; - private static final Class SINGLETON_MAP_CLASS = - Collections.singletonMap(null, null).getClass(); - - public static Map create() { - return Collections.emptyMap(); - } - - public static Map create(K key, V value) { - return Collections.singletonMap(key, value); - } - - public static Map normalize(Map map) { - switch (map.size()) { - case 0: - return create(); - case 1: { - if (map.getClass() == SINGLETON_MAP_CLASS) { - return map; - } - K key = map.keySet().iterator().next(); - return create(key, map.get(key)); - } - default: - if (map.getClass() == MULTI_MAP_CLASS) { - return map; - } - return new HashMap(map); - } - } - - public static Map normalizeUnmodifiable(Map map) { - if (map.size() < 2) { - return normalize(map); - } else { - // TODO: implement an UnmodifiableHashMap? - return Collections.unmodifiableMap(normalize(map)); - } - } - - public static Map put(Map map, K key, V value) { - switch (map.size()) { - case 0: - // Empty -> Singleton - return Collections.singletonMap(key, value); - case 1: { - if (map.containsKey(key)) { - return create(key, value); - } - // Singleton -> HashMap - Map result = new HashMap(); - result.put(map.keySet().iterator().next(), map.values().iterator().next()); - result.put(key, value); - return result; - } - default: - // HashMap - map.put(key, value); - return map; - } - } - - public static Map putAll(Map map, Map toAdd) { - switch (toAdd.size()) { - case 0: - // No-op. - return map; - case 1: { - // Add one element. - K key = toAdd.keySet().iterator().next(); - return put(map, key, toAdd.get(key)); - } - default: - // True list merge, result >= 2. - switch (map.size()) { - case 0: - return new HashMap(toAdd); - case 1: { - HashMap result = new HashMap(); - K key = map.keySet().iterator().next(); - result.put(key, map.get(key)); - result.putAll(toAdd); - return result; - } - default: - map.putAll(toAdd); - return map; - } - } - } - - /** - * A variation of the put method which uses a LinkedHashMap. - */ - public static Map putOrdered(Map map, K key, V value) { - switch (map.size()) { - case 0: - // Empty -> Singleton - return Collections.singletonMap(key, value); - case 1: { - if (map.containsKey(key)) { - return create(key, value); - } - // Singleton -> LinkedHashMap - Map result = new LinkedHashMap(); - result.put(map.keySet().iterator().next(), map.values().iterator().next()); - result.put(key, value); - return result; - } - default: - // LinkedHashMap - map.put(key, value); - return map; - } - } - - public static Map remove(Map map, K key) { - switch (map.size()) { - case 0: - // Empty - return map; - case 1: - // Singleton -> Empty - if (map.containsKey(key)) { - return create(); - } - return map; - case 2: - // HashMap -> Singleton - if (map.containsKey(key)) { - map.remove(key); - key = map.keySet().iterator().next(); - return create(key, map.get(key)); - } - return map; - default: - // IdentityHashMap - map.remove(key); - return map; - } - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/util/Paths.java b/js/js.ast/src/com/google/dart/compiler/util/Paths.java deleted file mode 100644 index cdda910ccb1..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/util/Paths.java +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.util; - -import java.io.File; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -/** - * Utility methods for obtaining relative paths from files and translating - * relative paths into files. - */ -public class Paths { - - /** - * Answer the relative path from baseFile to relFile - * - * @param baseFile the base file (not null) from which the - * desired path starts - * @param relFile the file referenced by the desired relative path (not - * null) - * @return a relative path (not null) - */ - public static String relativePathFor(File baseFile, File relFile) { - String baseFilePath = baseFile.getPath().replace(File.separatorChar, '/'); - String relFilePath = relFile.getPath().replace(File.separatorChar, '/'); - int baseFilePathLen = baseFilePath.length(); - int relFilePathLen = relFilePath.length(); - - // Find the com.google.dart.compiler.backend.common path elements - int index = 0; - while (index < baseFilePathLen - 1 && index < relFilePathLen - 1) { - if (baseFilePath.charAt(index) != relFilePath.charAt(index)) { - break; - } - index++; - } - while (index >= 0 - && (baseFilePath.charAt(index) != '/' || relFilePath.charAt(index) != '/')) { - index--; - } - int commonStart = index; - - // Build a path up from the base file - StringBuilder relPath = new StringBuilder(baseFilePathLen + relFilePathLen - - commonStart * 2); - index = commonStart + 1; - while (true) { - index = baseFilePath.indexOf('/', index); - if (index == -1) { - break; - } - relPath.append("../"); - index++; - } - relPath.append(relFilePath.substring(commonStart + 1)); - return relPath.toString(); - } - - /** - * Answer the file relative to the specified file - * - * @param baseFile the base file (not null) - * @param relPath the path to the desired file relative to baseFile - * @return the file (not null) - */ - public static File relativePathToFile(File baseFile, String relPath) { - if (relPath.startsWith("/")) { - return new File(relPath); - } - File parentFile = baseFile.getParentFile(); - String name; - if (parentFile == null) { - name = "."; - } else { - name = parentFile.getPath().replace(File.separatorChar, '/'); - } - name = URI.create(name + "/" + relPath).normalize().getPath(); - return new File(name); - } - - /** - * Given a collection of paths, return a collection of files - * - * @param a collection of paths to various files (not null, - * contains no nulls) - * @return a collection of files (not null, contains no - * nulls) - */ - public static List toFiles(List filePaths) { - List files = new ArrayList(); - for (String path : filePaths) { - files.add(new File(path)); - } - return files; - } -} diff --git a/js/js.ast/src/com/google/dart/compiler/util/TextOutput.java b/js/js.ast/src/com/google/dart/compiler/util/TextOutput.java deleted file mode 100644 index 99a465b1532..00000000000 --- a/js/js.ast/src/com/google/dart/compiler/util/TextOutput.java +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -package com.google.dart.compiler.util; - -/** - * Interface used for printing text output. - */ -public interface TextOutput { - - int getPosition(); - - int getLine(); - - int getColumn(); - - void indentIn(); - - void indentOut(); - - void newline(); - - void newlineOpt(); - - void print(char c); - - void print(char[] s); - - void print(String s); - - void printOpt(char c); - - void printOpt(char[] s); - - void printOpt(String s); -} diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java index 7e09549fdb9..158a317ebab 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java @@ -17,9 +17,11 @@ package org.jetbrains.k2js.translate.context; import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.addVarDeclaration; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.newVar; + public class DynamicContext { @NotNull @@ -66,8 +68,8 @@ public class DynamicContext { @NotNull public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression) { JsName temporaryName = blockScope.declareTemporary(); - JsVars temporaryDeclaration = AstUtil.newVar(temporaryName, null); - jsBlock().addVarDeclaration(temporaryDeclaration); + JsVars temporaryDeclaration = newVar(temporaryName, /*no init expression in var statement*/ null); + addVarDeclaration(jsBlock(), temporaryDeclaration); return new TemporaryVariable(temporaryName, initExpression); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java index c92af4d1bac..fdc4f340113 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java @@ -22,6 +22,8 @@ import com.google.dart.compiler.backend.js.ast.JsScope; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier; + /** * @author Pavel Talanov *

@@ -71,7 +73,8 @@ public final class Namer { public static String getNameForAccessor(@NotNull String propertyName, boolean isGetter) { if (isGetter) { return getNameForGetter(propertyName); - } else { + } + else { return getNameForSetter(propertyName); } } @@ -139,17 +142,17 @@ public final class Namer { } @NotNull - private JsNameRef createMethodReference(@NotNull JsName name) { + private static JsNameRef createMethodReference(@NotNull JsName name) { JsNameRef qualifier = name.makeRef(); JsNameRef reference = AstUtil.newQualifiedNameRef("create"); - AstUtil.setQualifier(reference, qualifier); + setQualifier(reference, qualifier); return reference; } @NotNull private JsNameRef kotlin(@NotNull JsNameRef reference) { JsNameRef kotlinReference = kotlinName.makeRef(); - AstUtil.setQualifier(reference, kotlinReference); + setQualifier(reference, kotlinReference); return reference; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/NamingScope.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/NamingScope.java index 650f0ffb5b1..6b267859ab2 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/NamingScope.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/NamingScope.java @@ -20,6 +20,8 @@ import com.google.dart.compiler.backend.js.ast.JsName; import com.google.dart.compiler.backend.js.ast.JsScope; import org.jetbrains.annotations.NotNull; +import java.util.Iterator; + /** * @author Pavel Talanov *

@@ -42,7 +44,7 @@ public final class NamingScope { @NotNull public NamingScope innerScope(@NotNull String scopeName) { JsScope innerJsScope = new JsScope(jsScope(), scopeName); - return new NamingScope(innerJsScope); + return innerScope(innerJsScope); } @NotNull @@ -71,13 +73,14 @@ public final class NamingScope { return doObfuscate(name); } + //TODO: refactor @NotNull private String doObfuscate(@NotNull String name) { int obfuscate = 0; String result = name; while (true) { JsName existingNameWithSameIdent = scope.findExistingName(result); - boolean isDuplicate = (existingNameWithSameIdent != null) && (scope.ownsName(existingNameWithSameIdent)); + boolean isDuplicate = (existingNameWithSameIdent != null) && ownsName(scope, existingNameWithSameIdent); if (!isDuplicate) break; @@ -87,6 +90,19 @@ public final class NamingScope { return result; } + //TODO: util? + private static boolean ownsName(@NotNull JsScope scope, @NotNull JsName name) { + Iterator nameIterator = scope.getAllNames(); + while (nameIterator.hasNext()) { + if (nameIterator.next() == name) { + return true; + } + } + return false; + } + + + @NotNull public JsName declareTemporary() { return scope.declareTemporary(); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index 32a0065efb2..b588c225ecc 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -16,10 +16,8 @@ package org.jetbrains.k2js.translate.context; -import com.google.dart.compiler.backend.js.ast.JsName; -import com.google.dart.compiler.backend.js.ast.JsNameRef; -import com.google.dart.compiler.backend.js.ast.JsProgram; -import com.google.dart.compiler.backend.js.ast.JsRootScope; +import com.google.common.collect.Maps; +import com.google.dart.compiler.backend.js.ast.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; @@ -31,6 +29,7 @@ import org.jetbrains.k2js.translate.context.generator.Rule; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; import org.jetbrains.k2js.translate.utils.AnnotationsUtils; +import java.util.Map; import java.util.Set; import static org.jetbrains.k2js.translate.utils.AnnotationsUtils.*; @@ -54,7 +53,7 @@ public final class StaticContext { StandardClasses standardClasses = StandardClasses.bindImplementations(namer.getKotlinScope()); return new StaticContext(program, bindingContext, aliaser, - namer, intrinsics, standardClasses, scope); + namer, intrinsics, standardClasses, scope); } @NotNull @@ -87,6 +86,9 @@ public final class StaticContext { @NotNull private final Generator qualifierIsNull = new QualifierIsNullGenerator(); + @NotNull + private final Map scopeToFunction = Maps.newHashMap(); + //TODO: too many parameters in constructor private StaticContext(@NotNull JsProgram program, @NotNull BindingContext bindingContext, @@ -144,6 +146,14 @@ public final class StaticContext { return namingScope; } + @NotNull + public JsFunction getFunctionWithScope(@NotNull CallableDescriptor descriptor) { + NamingScope scope = getScopeForDescriptor(descriptor); + JsFunction function = scopeToFunction.get(scope); + assert scope.jsScope().equals(function.getScope()) : "Inconsistency."; + return function; + } + @NotNull public JsName getNameForDescriptor(@NotNull DeclarationDescriptor descriptor) { JsName name = names.get(descriptor.getOriginal()); @@ -216,7 +226,8 @@ public final class StaticContext { if (annotation != null) { name = AnnotationsUtils.getAnnotationStringParameter(descriptor, LIBRARY_ANNOTATION_FQNAME); name = (!name.isEmpty()) ? name : descriptor.getName(); - } else { + } + else { ClassDescriptor containingClass = getContainingClass(descriptor); if (containingClass == null) return null; if (getAnnotationByName(containingClass, LIBRARY_ANNOTATION_FQNAME) != null) { @@ -264,7 +275,8 @@ public final class StaticContext { if (annotation != null) { name = AnnotationsUtils.getAnnotationStringParameter(descriptor, NATIVE_ANNOTATION_FQNAME); name = (!name.isEmpty()) ? name : descriptor.getName(); - } else { + } + else { ClassDescriptor containingClass = getContainingClass(descriptor); if (containingClass == null) return null; if (getAnnotationByName(containingClass, NATIVE_ANNOTATION_FQNAME) != null) { @@ -286,7 +298,8 @@ public final class StaticContext { Set overriddenDescriptors = ((FunctionDescriptor) descriptor).getOverriddenDescriptors(); if (overriddenDescriptors.isEmpty()) { return null; - } else { + } + else { //assert overriddenDescriptors.size() == 1; //TODO: for now translator can't deal with multiple inheritance good enough for (FunctionDescriptor overriddenDescriptor : overriddenDescriptors) { @@ -360,6 +373,20 @@ public final class StaticContext { return enclosingScope.innerScope("Scope for member " + descriptor.getName()); } }; + Rule createFunctionObjectsForCallableDescriptors = new Rule() { + @Override + public NamingScope apply(@NotNull DeclarationDescriptor descriptor) { + if (!(descriptor instanceof CallableDescriptor)) { + return null; + } + NamingScope enclosingScope = getEnclosingScope(descriptor); + JsFunction correspondingFunction = new JsFunction(enclosingScope.jsScope()); + NamingScope newScope = enclosingScope.innerScope(correspondingFunction.getScope()); + scopeToFunction.put(newScope, correspondingFunction); + return newScope; + } + }; + addRule(createFunctionObjectsForCallableDescriptors); addRule(generateNewScopesForClassesWithNoAncestors); addRule(generateInnerScopesForDerivedClasses); addRule(generateNewScopesForNamespaceDescriptors); @@ -439,7 +466,7 @@ public final class StaticContext { } } - private class QualifierIsNullGenerator extends Generator { + private static class QualifierIsNullGenerator extends Generator { private QualifierIsNullGenerator() { Rule propertiesHaveNoQualifiers = new Rule() { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index c2f398ca438..17836e8c99d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -16,7 +16,6 @@ package org.jetbrains.k2js.translate.context; -import com.google.common.collect.Maps; import com.google.dart.compiler.backend.js.ast.*; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; @@ -26,8 +25,6 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; -import java.util.Map; - import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForElement; /** @@ -41,15 +38,13 @@ public final class TranslationContext { private final DynamicContext dynamicContext; @NotNull private final StaticContext staticContext; - @NotNull - private final Map scopeToFunction = Maps.newHashMap(); @NotNull public static TranslationContext rootContext(@NotNull StaticContext staticContext) { JsProgram program = staticContext.getProgram(); JsBlock globalBlock = program.getGlobalBlock(); return new TranslationContext(staticContext, - DynamicContext.rootContext(staticContext.getRootScope(), globalBlock)); + DynamicContext.rootContext(staticContext.getRootScope(), globalBlock)); } private TranslationContext(@NotNull StaticContext staticContext, @NotNull DynamicContext dynamicContext) { @@ -155,6 +150,11 @@ public final class TranslationContext { return dynamicContext.jsScope(); } + @NotNull + public JsFunction getFunctionObject(@NotNull CallableDescriptor descriptor) { + return staticContext.getFunctionWithScope(descriptor); + } + public void addStatementToCurrentBlock(@NotNull JsStatement statement) { dynamicContext.jsBlock().getStatements().add(statement); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java index e4daf2a6300..a253fe3c174 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getAllClassesDefinedInNamespace; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; /** * @author Pavel Talanov @@ -49,7 +50,7 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { @NotNull private final Map localToGlobalClassName; @NotNull - private final JsScope dummyFunctionScope; + private final JsFunction dummyFunction; @Nullable private JsName declarationsObject = null; @Nullable @@ -60,14 +61,14 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { super(context); this.descriptors = descriptors; this.localToGlobalClassName = new HashMap(); - this.dummyFunctionScope = new JsScope(context().jsScope(), "class declaration function"); + this.dummyFunction = new JsFunction(context.jsScope()); } public void generateDeclarations() { declarationsObject = context().jsScope().declareName(Namer.nameForClassesVariable()); assert declarationsObject != null; declarationsStatement = - AstUtil.newVar(declarationsObject, generateDummyFunctionInvocation()); + newVar(declarationsObject, generateDummyFunctionInvocation()); } @NotNull @@ -84,10 +85,9 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { @NotNull private JsInvocation generateDummyFunctionInvocation() { - JsFunction dummyFunction = JsFunction.getAnonymousFunctionWithScope(dummyFunctionScope); List classDeclarations = generateClassDeclarationStatements(); classDeclarations.add(new JsReturn(generateReturnedObjectLiteral())); - dummyFunction.setBody(AstUtil.newBlock(classDeclarations)); + dummyFunction.setBody(newBlock(classDeclarations)); return AstUtil.newInvocation(dummyFunction); } @@ -136,13 +136,13 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { JsName localClassName = generateLocalAlias(declaration); JsInvocation classDeclarationExpression = Translation.translateClassDeclaration(declaration, context()); - return AstUtil.newVar(localClassName, classDeclarationExpression); + return newVar(localClassName, classDeclarationExpression); } @NotNull private JsName generateLocalAlias(@NotNull JetClass declaration) { JsName globalClassName = context().getNameForElement(declaration); - JsName localAlias = dummyFunctionScope.declareTemporary(); + JsName localAlias = dummyFunction.getScope().declareTemporary(); localToGlobalClassName.put(localAlias, globalClassName); ClassDescriptor descriptor = BindingUtils.getClassDescriptor(bindingContext(), declaration); aliaser().setAliasForDescriptor(descriptor, localAlias); @@ -161,7 +161,7 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { @NotNull private JsPropertyInitializer getClassNameToClassObject(@NotNull ClassDescriptor classDescriptor) { JsName className = context().getNameForDescriptor(classDescriptor); - JsNameRef alreadyDefinedClassReferernce = AstUtil.qualified(className, getDeclarationsObjectName().makeRef()); + JsNameRef alreadyDefinedClassReferernce = qualified(className, getDeclarationsObjectName().makeRef()); return new JsPropertyInitializer(className.makeRef(), alreadyDefinedClassReferernce); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java index 590121d94ff..35c86f5dc6d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java @@ -86,9 +86,11 @@ public final class ClassTranslator extends AbstractTranslator { private JsInvocation classCreateMethodInvocation() { if (isObject()) { return AstUtil.newInvocation(context().namer().objectCreationMethodReference()); - } else if (isTrait()) { + } + else if (isTrait()) { return AstUtil.newInvocation(context().namer().traitCreationMethodReference()); - } else { + } + else { return AstUtil.newInvocation(context().namer().classCreationMethodReference()); } } @@ -163,7 +165,10 @@ public final class ClassTranslator extends AbstractTranslator { } propertyList.addAll(translatePropertiesAsConstructorParameters()); propertyList.addAll(declarationBodyVisitor.traverseClass(classDeclaration, context())); - return new JsObjectLiteral(propertyList); + //TODO: util? + JsObjectLiteral jsObjectLiteral = new JsObjectLiteral(); + jsObjectLiteral.getPropertyInitializers().addAll(propertyList); + return jsObjectLiteral; } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java index 6562fe3c40e..f026b6aed24 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java @@ -29,6 +29,9 @@ import org.jetbrains.k2js.translate.utils.BindingUtils; import java.util.ArrayList; import java.util.List; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.newVar; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier; + /** * @author Pavel.Talanov *

@@ -62,7 +65,7 @@ public final class NamespaceTranslator extends AbstractTranslator { @NotNull public JsStatement getInitializeStatement() { JsNameRef initializeMethodReference = Namer.initializeMethodReference(); - AstUtil.setQualifier(initializeMethodReference, namespaceName.makeRef()); + setQualifier(initializeMethodReference, namespaceName.makeRef()); return AstUtil.newInvocation(initializeMethodReference).makeStmt(); } @@ -76,7 +79,7 @@ public final class NamespaceTranslator extends AbstractTranslator { JsInvocation namespaceDeclaration = namespaceCreateMethodInvocation(); addMemberDeclarations(namespaceDeclaration); addClassesDeclarations(namespaceDeclaration); - return AstUtil.newVar(namespaceName, namespaceDeclaration); + return newVar(namespaceName, namespaceDeclaration); } private void addClassesDeclarations(@NotNull JsInvocation namespaceDeclaration) { @@ -93,6 +96,9 @@ public final class NamespaceTranslator extends AbstractTranslator { List propertyList = new ArrayList(); propertyList.add(Translation.generateNamespaceInitializerMethod(descriptor, context())); propertyList.addAll(new DeclarationBodyVisitor().traverseNamespace(descriptor, context())); - return new JsObjectLiteral(propertyList); + //TODO: make util, search for dups + JsObjectLiteral jsObjectLiteral = new JsObjectLiteral(); + jsObjectLiteral.getPropertyInitializers().addAll(propertyList); + return jsObjectLiteral; } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java index 7fb2a4ac820..930d44f3004 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java @@ -17,7 +17,6 @@ package org.jetbrains.k2js.translate.declaration; import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; @@ -31,10 +30,11 @@ import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.utils.BindingUtils; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import static org.jetbrains.k2js.translate.utils.TranslationUtils.*; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; +import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField; +import static org.jetbrains.k2js.translate.utils.TranslationUtils.backingFieldReference; /** * @author Pavel Talanov @@ -74,7 +74,8 @@ public final class PropertyTranslator extends AbstractTranslator { private void addGetter() { if (hasCustomGetter()) { accessors.add(translateCustomAccessor(getCustomGetterDeclaration())); - } else { + } + else { accessors.add(generateDefaultGetter()); } } @@ -82,7 +83,8 @@ public final class PropertyTranslator extends AbstractTranslator { private void addSetter() { if (hasCustomSetter()) { accessors.add(translateCustomAccessor(getCustomSetterDeclaration())); - } else { + } + else { accessors.add(generateDefaultSetter()); } } @@ -115,15 +117,15 @@ public final class PropertyTranslator extends AbstractTranslator { private JsPropertyInitializer generateDefaultGetter() { PropertyGetterDescriptor getterDescriptor = property.getGetter(); assert getterDescriptor != null : "Getter descriptor should not be null"; - return AstUtil.newNamedMethod(context().getNameForDescriptor(getterDescriptor), - generateDefaultGetterFunction(getterDescriptor)); + return newNamedMethod(context().getNameForDescriptor(getterDescriptor), + generateDefaultGetterFunction(getterDescriptor)); } @NotNull private JsFunction generateDefaultGetterFunction(@NotNull PropertyGetterDescriptor descriptor) { JsReturn returnExpression = new JsReturn(backingFieldReference(context(), property)); - JsFunction getterFunction = functionWithScope(context().getScopeForDescriptor(descriptor)); - getterFunction.setBody(AstUtil.convertToBlock(returnExpression)); + JsFunction getterFunction = context().getFunctionObject(descriptor); + getterFunction.setBody(convertToBlock(returnExpression)); return getterFunction; } @@ -131,18 +133,18 @@ public final class PropertyTranslator extends AbstractTranslator { private JsPropertyInitializer generateDefaultSetter() { PropertySetterDescriptor setterDescriptor = property.getSetter(); assert setterDescriptor != null : "Setter descriptor should not be null"; - return AstUtil.newNamedMethod(context().getNameForDescriptor(setterDescriptor), - generateDefaultSetterFunction(setterDescriptor)); + return newNamedMethod(context().getNameForDescriptor(setterDescriptor), + generateDefaultSetterFunction(setterDescriptor)); } @NotNull private JsFunction generateDefaultSetterFunction(@NotNull PropertySetterDescriptor propertySetterDescriptor) { - JsFunction result = functionWithScope(context().getScopeForDescriptor(propertySetterDescriptor)); + JsFunction result = context().getFunctionObject(propertySetterDescriptor); JsParameter defaultParameter = new JsParameter(propertyAccessContext(propertySetterDescriptor).jsScope().declareTemporary()); JsStatement assignment = assignmentToBackingField(context(), property, defaultParameter.getName().makeRef()); - result.setParameters(Arrays.asList(defaultParameter)); - result.setBody(AstUtil.convertToBlock(assignment)); + setParameters(result, defaultParameter); + result.setBody(convertToBlock(assignment)); return result; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index ba564959d8a..23770651790 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -17,7 +17,6 @@ package org.jetbrains.k2js.translate.expression; import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; @@ -36,11 +35,13 @@ import org.jetbrains.k2js.translate.operation.IncrementTranslator; import org.jetbrains.k2js.translate.operation.UnaryOperationTranslator; import org.jetbrains.k2js.translate.reference.*; import org.jetbrains.k2js.translate.utils.BindingUtils; +import org.jetbrains.k2js.translate.utils.JsAstUtils; import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.List; import static org.jetbrains.k2js.translate.utils.BindingUtils.*; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; import static org.jetbrains.k2js.translate.utils.PsiUtils.getObjectDeclarationName; import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateInitializerForProperty; @@ -52,7 +53,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull private JsExpression translateAsExpression(@NotNull JetExpression expression, @NotNull TranslationContext context) { - return AstUtil.convertToExpression(expression.accept(this, context)); + return convertToExpression(expression.accept(this, context)); } @Override @@ -98,9 +99,9 @@ public final class ExpressionVisitor extends TranslatorVisitor { TranslationContext blockContext = context.innerBlock(jsBlock); for (JetElement statement : statements) { assert statement instanceof JetExpression : "Elements in JetBlockExpression " + - "should be of type JetExpression"; + "should be of type JetExpression"; JsNode jsNode = statement.accept(this, blockContext); - jsBlock.addStatement(AstUtil.convertToStatement(jsNode)); + jsBlock.getStatements().add(convertToStatement(jsNode)); } return jsBlock; } @@ -142,7 +143,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { DeclarationDescriptor descriptor = getDescriptorForElement(context.bindingContext(), expression); JsName jsPropertyName = context.getNameForDescriptor(descriptor); JsExpression jsInitExpression = translateInitializerForProperty(expression, context); - return AstUtil.newVar(jsPropertyName, jsInitExpression); + return newVar(jsPropertyName, jsInitExpression); } @Override @@ -160,11 +161,11 @@ public final class ExpressionVisitor extends TranslatorVisitor { return ifStatement; } TemporaryVariable result = context.declareTemporary(context.program().getNullLiteral()); - AstUtil.SaveLastExpressionMutator saveResultToTemporaryMutator = - new AstUtil.SaveLastExpressionMutator(result.reference()); - JsNode mutatedIfStatement = AstUtil.mutateLastExpression(ifStatement, - saveResultToTemporaryMutator); - JsStatement resultingStatement = AstUtil.convertToStatement(mutatedIfStatement); + JsAstUtils.SaveLastExpressionMutator saveResultToTemporaryMutator = + new JsAstUtils.SaveLastExpressionMutator(result.reference()); + JsNode mutatedIfStatement = mutateLastExpression(ifStatement, + saveResultToTemporaryMutator); + JsStatement resultingStatement = convertToStatement(mutatedIfStatement); context.addStatementToCurrentBlock(resultingStatement); return result.reference(); } @@ -194,7 +195,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { if (jetElse == null) { return null; } - return AstUtil.convertToStatement(jetElse.accept(this, context)); + return convertToStatement(jetElse.accept(this, context)); } @NotNull @@ -203,7 +204,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { if (nullableExpression == null) { return context.program().getEmptyStmt(); } - return AstUtil.convertToStatement(nullableExpression.accept(this, context)); + return convertToStatement(nullableExpression.accept(this, context)); } @NotNull @@ -211,7 +212,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull TranslationContext context) { JsExpression jsCondition = translateNullableExpression(expression, context); assert (jsCondition != null) : "Condition should not be empty"; - return AstUtil.convertToExpression(jsCondition); + return convertToExpression(jsCondition); } @Nullable @@ -253,14 +254,14 @@ public final class ExpressionVisitor extends TranslatorVisitor { } @NotNull - private JsNode resolveAsTemplate(@NotNull JetStringTemplateExpression expression, - @NotNull TranslationContext context) { + private static JsNode resolveAsTemplate(@NotNull JetStringTemplateExpression expression, + @NotNull TranslationContext context) { return StringTemplateTranslator.translate(expression, context); } @Nullable - private JsStringLiteral resolveAsStringConstant(@NotNull JetExpression expression, - @NotNull TranslationContext context) { + private static JsStringLiteral resolveAsStringConstant(@NotNull JetExpression expression, + @NotNull TranslationContext context) { Object value = getCompileTimeValue(context.bindingContext(), expression); if (value == null) { return null; @@ -408,7 +409,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { DeclarationDescriptor descriptor = getDescriptorForElement(context.bindingContext(), objectDeclarationName); JsName propertyName = context.getNameForDescriptor(descriptor); JsExpression value = ClassTranslator.generateClassCreationExpression(expression, context); - return AstUtil.newVar(propertyName, value); + return newVar(propertyName, value); } @Override diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java index 44be9f3f8a3..6441f04b066 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java @@ -30,13 +30,16 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.utils.DescriptorUtils; +import org.jetbrains.k2js.translate.utils.JsAstUtils; import java.util.ArrayList; import java.util.List; import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptor; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*; -import static org.jetbrains.k2js.translate.utils.TranslationUtils.*; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; +import static org.jetbrains.k2js.translate.utils.TranslationUtils.newAliasForThis; +import static org.jetbrains.k2js.translate.utils.TranslationUtils.removeAliasForThis; /** @@ -108,7 +111,7 @@ public final class FunctionTranslator extends AbstractTranslator { @NotNull private JsFunction generateFunctionObject() { - functionObject.setParameters(translateParameters()); + setParameters(functionObject, translateParameters()); translateBody(); functionObject.setBody(functionBody); restoreContext(); @@ -126,7 +129,7 @@ public final class FunctionTranslator extends AbstractTranslator { @NotNull private JsFunction createFunctionObject() { if (isDeclaration()) { - return functionWithScope(context().getScopeForDescriptor(descriptor)); + return context().getFunctionObject(descriptor); } if (isLiteral()) { //TODO: changing this piece of code to more natural "same as for declaration" results in life test failing @@ -143,7 +146,7 @@ public final class FunctionTranslator extends AbstractTranslator { return; } JsNode realBody = Translation.translateExpression(jetBodyExpression, functionBodyContext); - functionBody.addStatement(wrapWithReturnIfNeeded(realBody, mustAddReturnToGeneratedFunctionBody())); + functionBody.getStatements().add(wrapWithReturnIfNeeded(realBody, mustAddReturnToGeneratedFunctionBody())); } private boolean mustAddReturnToGeneratedFunctionBody() { @@ -153,15 +156,15 @@ public final class FunctionTranslator extends AbstractTranslator { } @NotNull - private JsBlock wrapWithReturnIfNeeded(@NotNull JsNode body, boolean needsReturn) { + private static JsBlock wrapWithReturnIfNeeded(@NotNull JsNode body, boolean needsReturn) { if (!needsReturn) { - return AstUtil.convertToBlock(body); + return convertToBlock(body); } - return AstUtil.convertToBlock(lastExpressionReturned(body)); + return convertToBlock(lastExpressionReturned(body)); } - private JsNode lastExpressionReturned(@NotNull JsNode body) { - return AstUtil.mutateLastExpression(body, new AstUtil.Mutator() { + private static JsNode lastExpressionReturned(@NotNull JsNode body) { + return mutateLastExpression(body, new JsAstUtils.Mutator() { @Override @NotNull public JsNode mutate(@NotNull JsNode node) { @@ -177,7 +180,8 @@ public final class FunctionTranslator extends AbstractTranslator { private TranslationContext functionBodyContext() { if (isLiteral()) { return context().innerJsScope(functionObject.getScope()); - } else { + } + else { return context().newDeclaration(functionDeclaration); } } @@ -218,6 +222,6 @@ public final class FunctionTranslator extends AbstractTranslator { private boolean isDeclaration() { return (functionDeclaration instanceof JetNamedFunction) || - (functionDeclaration instanceof JetPropertyAccessor); + (functionDeclaration instanceof JetPropertyAccessor); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java index 8792faead7e..58c1a09d8bb 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java @@ -28,8 +28,11 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.utils.BindingUtils; +import org.jetbrains.k2js.translate.utils.JsAstUtils; import org.jetbrains.k2js.translate.utils.TranslationUtils; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; + /** * @author Pavel Talanov */ @@ -50,11 +53,12 @@ public final class PatternTranslator extends AbstractTranslator { JetPattern pattern = getPattern(expression); JsExpression resultingExpression = translatePattern(pattern, left); if (expression.isNegated()) { - return AstUtil.negated(resultingExpression); + return negated(resultingExpression); } return resultingExpression; } + //TODO: inspection @NotNull private JetPattern getPattern(@NotNull JetIsExpression expression) { JetPattern pattern = expression.getPattern(); @@ -79,14 +83,14 @@ public final class PatternTranslator extends AbstractTranslator { //TODO: look into using intrinsics or other mechanisms to implement this logic JsName className = getClassReference(pattern).getName(); if (className.getIdent().equals("String")) { - return AstUtil.typeof(expressionToMatch, program().getStringLiteral("string")); + return typeof(expressionToMatch, program().getStringLiteral("string")); } if (className.getIdent().equals("Int")) { - return AstUtil.typeof(expressionToMatch, program().getStringLiteral("number")); + return typeof(expressionToMatch, program().getStringLiteral("number")); } JsInvocation isCheck = AstUtil.newInvocation(context().namer().isOperationReference(), - expressionToMatch, getClassReference(pattern)); + expressionToMatch, getClassReference(pattern)); if (isNullable(pattern)) { return addNullCheck(expressionToMatch, isCheck); } @@ -95,12 +99,12 @@ public final class PatternTranslator extends AbstractTranslator { @NotNull private JsExpression addNullCheck(@NotNull JsExpression expressionToMatch, @NotNull JsInvocation isCheck) { - return AstUtil.or(TranslationUtils.isNullCheck(context(), expressionToMatch), isCheck); + return or(TranslationUtils.isNullCheck(context(), expressionToMatch), isCheck); } private boolean isNullable(JetTypePattern pattern) { return BindingUtils.getTypeByReference(bindingContext(), - getTypeReference(pattern)).isNullable(); + getTypeReference(pattern)).isNullable(); } @NotNull @@ -109,6 +113,7 @@ public final class PatternTranslator extends AbstractTranslator { return getClassNameReferenceForTypeReference(typeReference); } + //TODO: inspection: util? @NotNull private JetTypeReference getTypeReference(@NotNull JetTypePattern pattern) { JetTypeReference typeReference = pattern.getTypeReference(); @@ -129,6 +134,6 @@ public final class PatternTranslator extends AbstractTranslator { assert patternExpression != null : "Expression patter should have an expression."; JsExpression expressionToMatchAgainst = Translation.translateAsExpression(patternExpression, context()); - return AstUtil.equals(expressionToMatch, expressionToMatchAgainst); + return JsAstUtils.equals(expressionToMatch, expressionToMatchAgainst); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/StringTemplateTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/StringTemplateTranslator.java index 2391dac7fe1..423df83b980 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/StringTemplateTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/StringTemplateTranslator.java @@ -25,7 +25,8 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.Translation; -import static com.google.dart.compiler.util.AstUtil.sum; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.sum; + /** * @author Pavel Talanov @@ -66,7 +67,8 @@ public final class StringTemplateTranslator extends AbstractTranslator { void append(@NotNull JsExpression expression) { if (resultingExpression == null) { resultingExpression = expression; - } else { + } + else { resultingExpression = sum(resultingExpression, expression); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/TryTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/TryTranslator.java index a163939a748..aa03b28ee12 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/TryTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/TryTranslator.java @@ -30,7 +30,7 @@ import org.jetbrains.k2js.translate.general.Translation; import java.util.ArrayList; import java.util.List; -import static com.google.dart.compiler.util.AstUtil.convertToBlock; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.convertToBlock; /** * @author Pavel Talanov diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java index 5af8ed98cbb..42432d4bba9 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java @@ -25,10 +25,13 @@ import org.jetbrains.k2js.translate.context.TemporaryVariable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.Translation; +import org.jetbrains.k2js.translate.utils.JsAstUtils; import java.util.ArrayList; import java.util.List; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; + /** * @author Pavel Talanov */ @@ -63,7 +66,7 @@ public class WhenTranslator extends AbstractTranslator { JsNode translate() { JsFor resultingFor = generateDummyFor(); List entries = translateEntries(); - resultingFor.setBody(AstUtil.newBlock(entries)); + resultingFor.setBody(newBlock(entries)); context().addStatementToCurrentBlock(resultingFor); return result.reference(); } @@ -80,7 +83,7 @@ public class WhenTranslator extends AbstractTranslator { @NotNull private JsStatement surroundWithDummyIf(@NotNull JsStatement entryStatement) { JsExpression stepNumberEqualsCurrentEntryNumber = new JsBinaryOperation(JsBinaryOperator.EQ, - dummyCounter.reference(), program().getNumberLiteral(currentEntryNumber)); + dummyCounter.reference(), program().getNumberLiteral(currentEntryNumber)); currentEntryNumber++; return new JsIf(stepNumberEqualsCurrentEntryNumber, entryStatement, null); } @@ -118,8 +121,8 @@ public class WhenTranslator extends AbstractTranslator { @NotNull JsStatement withReturnValueCaptured(@NotNull JsNode node) { - return AstUtil.convertToStatement(AstUtil.mutateLastExpression(node, - new AstUtil.SaveLastExpressionMutator(result.reference()))); + return convertToStatement(mutateLastExpression(node, + new JsAstUtils.SaveLastExpressionMutator(result.reference()))); } @NotNull @@ -139,7 +142,7 @@ public class WhenTranslator extends AbstractTranslator { } @NotNull - private JsExpression anyOfThemIsTrue(List conditions) { + private static JsExpression anyOfThemIsTrue(List conditions) { assert !conditions.isEmpty() : "When entry (not else) should have at least one condition"; JsExpression current = null; for (JsExpression condition : conditions) { @@ -150,11 +153,12 @@ public class WhenTranslator extends AbstractTranslator { } @NotNull - private JsExpression addCaseCondition(@Nullable JsExpression current, @NotNull JsExpression condition) { + private static JsExpression addCaseCondition(@Nullable JsExpression current, @NotNull JsExpression condition) { if (current == null) { return condition; - } else { - return AstUtil.or(current, condition); + } + else { + return or(current, condition); } } @@ -167,7 +171,7 @@ public class WhenTranslator extends AbstractTranslator { } @NotNull - private JsBlock addDummyBreak(@NotNull JsStatement statement) { + private static JsBlock addDummyBreak(@NotNull JsStatement statement) { return AstUtil.newBlock(statement, new JsBreak()); } @@ -176,12 +180,12 @@ public class WhenTranslator extends AbstractTranslator { JsExpression patternMatchExpression = Translation.patternTranslator(context()). translatePattern(getPattern(condition), expressionToMatch); if (isNegated(condition)) { - return AstUtil.negated(patternMatchExpression); + return negated(patternMatchExpression); } return patternMatchExpression; } - private boolean isNegated(@NotNull JetWhenCondition condition) { + private static boolean isNegated(@NotNull JetWhenCondition condition) { if (condition instanceof JetWhenConditionIsPattern) { return ((JetWhenConditionIsPattern) condition).isNegated(); } @@ -189,13 +193,15 @@ public class WhenTranslator extends AbstractTranslator { } @NotNull - private JetPattern getPattern(@NotNull JetWhenCondition condition) { + private static JetPattern getPattern(@NotNull JetWhenCondition condition) { JetPattern pattern; if (condition instanceof JetWhenConditionIsPattern) { pattern = ((JetWhenConditionIsPattern) condition).getPattern(); - } else if (condition instanceof JetWhenConditionWithExpression) { + } + else if (condition instanceof JetWhenConditionWithExpression) { pattern = ((JetWhenConditionWithExpression) condition).getPattern(); - } else { + } + else { throw new AssertionError("Wrong type of JetWhenCondition"); } assert pattern != null : "Condition should have a non null pattern."; diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java index 296427f2163..ecd94aac82a 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java @@ -33,6 +33,7 @@ import java.util.List; import static org.jetbrains.k2js.translate.expression.foreach.ForTranslatorUtils.temporariesInitialization; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getClassDescriptorForType; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopBody; import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange; @@ -54,7 +55,7 @@ public final class ArrayForTranslator extends ForTranslator { //TODO: better check //TODO: IMPORTANT! return getClassDescriptorForType(rangeType).getName().equals("Array") - || getClassDescriptorForType(rangeType).getName().equals("IntArray"); + || getClassDescriptorForType(rangeType).getName().equals("IntArray"); } @NotNull @@ -78,7 +79,7 @@ public final class ArrayForTranslator extends ForTranslator { private JsBlock translate() { List blockStatements = temporariesInitialization(loopRange, end); blockStatements.add(generateForExpression()); - return AstUtil.newBlock(blockStatements); + return newBlock(blockStatements); } @NotNull @@ -94,19 +95,19 @@ public final class ArrayForTranslator extends ForTranslator { @NotNull private JsStatement getBody() { JsArrayAccess arrayAccess = new JsArrayAccess(loopRange.reference(), index.reference()); - JsStatement currentVar = AstUtil.newVar(parameterName, arrayAccess); + JsStatement currentVar = newVar(parameterName, arrayAccess); JsStatement realBody = Translation.translateAsStatement(getLoopBody(expression), context()); return AstUtil.newBlock(currentVar, realBody); } @NotNull private JsVars initExpression() { - return AstUtil.newVar(index.name(), program().getNumberLiteral(0)); + return newVar(index.name(), program().getNumberLiteral(0)); } @NotNull private JsExpression getCondition() { - return AstUtil.notEqual(index.reference(), end.reference()); + return notEqual(index.reference(), end.reference()); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java index e1c0e15f9a8..8b537937218 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java @@ -30,6 +30,8 @@ import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.reference.CallBuilder; import static org.jetbrains.k2js.translate.utils.BindingUtils.*; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.convertToBlock; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.newVar; import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopBody; import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange; @@ -62,10 +64,10 @@ public final class IteratorForTranslator extends ForTranslator { @NotNull private JsBlock generateCycleBody() { JsBlock cycleBody = new JsBlock(); - JsStatement parameterAssignment = AstUtil.newVar(parameterName, nextMethodInvocation()); + JsStatement parameterAssignment = newVar(parameterName, nextMethodInvocation()); JsNode originalBody = Translation.translateExpression(getLoopBody(expression), context().innerBlock(cycleBody)); - cycleBody.addStatement(parameterAssignment); - cycleBody.addStatement(AstUtil.convertToBlock(originalBody)); + cycleBody.getStatements().add(parameterAssignment); + cycleBody.getStatements().add(convertToBlock(originalBody)); return cycleBody; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeForTranslator.java index 9cf83198ba2..e8501e036ee 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeForTranslator.java @@ -31,6 +31,7 @@ import java.util.List; import static org.jetbrains.k2js.translate.expression.foreach.ForTranslatorUtils.temporariesInitialization; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getClassDescriptorForType; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopBody; import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange; @@ -39,6 +40,7 @@ import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange; */ public final class RangeForTranslator extends ForTranslator { + //TODO: inspection @NotNull public static JsStatement translate(@NotNull JetForExpression expression, @NotNull TranslationContext context) { @@ -67,8 +69,8 @@ public final class RangeForTranslator extends ForTranslator { rangeExpression = context.declareTemporary(Translation.translateAsExpression(getLoopRange(expression), context)); JsExpression isReversed = callFunction("get_reversed"); JsConditional incrVarValue = new JsConditional(isReversed, - program().getNumberLiteral(-1), - program().getNumberLiteral(1)); + program().getNumberLiteral(-1), + program().getNumberLiteral(1)); incrVar = context().declareTemporary(incrVarValue); start = context().declareTemporary(callFunction("get_start")); end = context().declareTemporary(new JsBinaryOperation(JsBinaryOperator.ADD, callFunction("get_end"), incrVar.reference())); @@ -78,7 +80,7 @@ public final class RangeForTranslator extends ForTranslator { private JsBlock translate() { List blockStatements = temporariesInitialization(rangeExpression, incrVar, start, end); blockStatements.add(generateForExpression()); - return AstUtil.newBlock(blockStatements); + return newBlock(blockStatements); } @NotNull @@ -93,12 +95,12 @@ public final class RangeForTranslator extends ForTranslator { @NotNull private JsVars initExpression() { - return AstUtil.newVar(parameterName, start.reference()); + return newVar(parameterName, start.reference()); } @NotNull private JsExpression getCondition() { - return AstUtil.notEqual(parameterName.makeRef(), end.reference()); + return notEqual(parameterName.makeRef(), end.reference()); } @NotNull @@ -109,7 +111,7 @@ public final class RangeForTranslator extends ForTranslator { @NotNull private JsExpression getField(@NotNull String fieldName) { JsNameRef nameRef = AstUtil.newQualifiedNameRef(fieldName); - AstUtil.setQualifier(nameRef, rangeExpression.reference()); + setQualifier(nameRef, rangeExpression.reference()); return nameRef; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeLiteralForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeLiteralForTranslator.java index 25cc708664a..585c98e9807 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeLiteralForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeLiteralForTranslator.java @@ -16,9 +16,7 @@ package org.jetbrains.k2js.translate.expression.foreach; -import com.google.common.collect.Lists; import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetBinaryExpression; import org.jetbrains.jet.lang.psi.JetExpression; @@ -30,6 +28,7 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import java.util.List; import static org.jetbrains.k2js.translate.expression.foreach.ForTranslatorUtils.temporariesInitialization; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange; import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateLeftExpression; import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRightExpression; @@ -82,7 +81,7 @@ public final class RangeLiteralForTranslator extends ForTranslator { private JsBlock translate() { List blockStatements = temporariesInitialization(rangeEnd); blockStatements.add(generateForExpression()); - return AstUtil.newBlock(blockStatements); + return newBlock(blockStatements); } @NotNull @@ -97,12 +96,12 @@ public final class RangeLiteralForTranslator extends ForTranslator { @NotNull private JsVars initExpression() { - return AstUtil.newVar(parameterName, rangeStart); + return newVar(parameterName, rangeStart); } @NotNull private JsExpression getCondition() { - return AstUtil.notEqual(parameterName.makeRef(), rangeEnd.reference()); + return notEqual(parameterName.makeRef(), rangeEnd.reference()); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java index dc69b2e67d9..ecd9dd8d725 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java @@ -19,7 +19,6 @@ package org.jetbrains.k2js.translate.general; import com.google.dart.compiler.backend.js.JsNamer; import com.google.dart.compiler.backend.js.JsPrettyNamer; import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.psi.*; @@ -38,6 +37,9 @@ import org.jetbrains.k2js.translate.initializer.NamespaceInitializerTranslator; import java.util.List; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.convertToExpression; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.convertToStatement; + /** * @author Pavel Talanov *

@@ -46,6 +48,9 @@ import java.util.List; */ public final class Translation { + private Translation() { + } + @NotNull public static FunctionTranslator functionTranslator(@NotNull JetDeclarationWithBody function, @NotNull TranslationContext context) { @@ -76,13 +81,13 @@ public final class Translation { @NotNull public static JsExpression translateAsExpression(@NotNull JetExpression expression, @NotNull TranslationContext context) { - return AstUtil.convertToExpression(translateExpression(expression, context)); + return convertToExpression(translateExpression(expression, context)); } @NotNull public static JsStatement translateAsStatement(@NotNull JetExpression expression, @NotNull TranslationContext context) { - return AstUtil.convertToStatement(translateExpression(expression, context)); + return convertToStatement(translateExpression(expression, context)); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java index 374299eb26a..2f6e99bbe9b 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java @@ -17,7 +17,6 @@ package org.jetbrains.k2js.translate.initializer; import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; @@ -35,8 +34,8 @@ import java.util.ArrayList; import java.util.List; import static org.jetbrains.k2js.translate.utils.BindingUtils.*; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField; -import static org.jetbrains.k2js.translate.utils.TranslationUtils.functionWithScope; /** * @author Pavel Talanov @@ -57,10 +56,11 @@ public final class ClassInitializerTranslator extends AbstractInitializerTransla @Override @NotNull protected JsFunction generateInitializerFunction() { - JsFunction result = functionWithScope(initializerMethodScope); + //TODO: look for duplication of this code + JsFunction result = new JsFunction(initializerMethodScope.jsScope()); //NOTE: that while we translateAsLocalNameReference constructor parameters we also add property initializer statements // for properties declared as constructor parameters - result.setParameters(translatePrimaryConstructorParameters()); + setParameters(result, translatePrimaryConstructorParameters()); mayBeAddCallToSuperMethod(); result.setBody(generateInitializerMethodBody()); return result; @@ -69,7 +69,7 @@ public final class ClassInitializerTranslator extends AbstractInitializerTransla @NotNull private JsBlock generateInitializerMethodBody() { initializerStatements.addAll(translateClassInitializers(classDeclaration)); - return AstUtil.newBlock(initializerStatements); + return newBlock(initializerStatements); } private void mayBeAddCallToSuperMethod() { @@ -84,8 +84,7 @@ public final class ClassInitializerTranslator extends AbstractInitializerTransla //TODO: look into JsName superMethodName = initializerMethodScope.jsScope().declareName(Namer.superMethodName()); List arguments = translateArguments(superCall); - initializerStatements.add(AstUtil.convertToStatement - (AstUtil.newInvocation(AstUtil.thisQualifiedReference(superMethodName), arguments))); + initializerStatements.add(convertToStatement(newInvocation(thisQualifiedReference(superMethodName), arguments))); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java index 4132315e645..3e7173779c0 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java @@ -17,12 +17,11 @@ package org.jetbrains.k2js.translate.initializer; import com.google.dart.compiler.backend.js.ast.JsFunction; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.k2js.translate.context.TranslationContext; -import static org.jetbrains.k2js.translate.utils.TranslationUtils.functionWithScope; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.newBlock; /** * @author Pavel Talanov @@ -41,8 +40,8 @@ public final class NamespaceInitializerTranslator extends AbstractInitializerTra @Override @NotNull protected JsFunction generateInitializerFunction() { - JsFunction result = functionWithScope(initializerMethodScope); - result.setBody(AstUtil.newBlock(translateNamespaceInitializers(namespace))); + JsFunction result = new JsFunction(initializerMethodScope.jsScope()); + result.setBody(newBlock(translateNamespaceInitializers(namespace))); return result; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayFunctionConstructorIntrinsic.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayFunctionConstructorIntrinsic.java index 6cd6f5cd2fd..2a025280241 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayFunctionConstructorIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayFunctionConstructorIntrinsic.java @@ -26,6 +26,8 @@ import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; import java.util.List; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.newInvocation; + /** * @author Pavel Talanov */ @@ -43,6 +45,6 @@ public enum ArrayFunctionConstructorIntrinsic implements FunctionIntrinsic { assert arguments.size() == 2; //TODO: provide better mechanism JsNameRef iteratorFunName = AstUtil.newQualifiedNameRef("Kotlin.arrayFromFun"); - return AstUtil.newInvocation(iteratorFunName, arguments); + return newInvocation(iteratorFunName, arguments); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayNullConstructorIntrinsic.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayNullConstructorIntrinsic.java index a9e0ee1cea3..3d590da0f2e 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayNullConstructorIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayNullConstructorIntrinsic.java @@ -26,6 +26,8 @@ import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; import java.util.List; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.newInvocation; + /** * @author Pavel Talanov */ @@ -42,6 +44,6 @@ public enum ArrayNullConstructorIntrinsic implements FunctionIntrinsic { assert arguments.size() == 1; //TODO: provide better mechanism JsNameRef nullArrayFunName = AstUtil.newQualifiedNameRef("Kotlin.nullArray"); - return AstUtil.newInvocation(nullArrayFunName, arguments); + return newInvocation(nullArrayFunName, arguments); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArraySizeIntrinsic.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArraySizeIntrinsic.java index 69a04d2231f..c1715d85b3f 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArraySizeIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArraySizeIntrinsic.java @@ -26,6 +26,8 @@ import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; import java.util.List; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier; + /** * @author Pavel Talanov */ @@ -42,7 +44,7 @@ public enum ArraySizeIntrinsic implements FunctionIntrinsic { assert arguments.isEmpty() : "Length expression must have zero arguments."; //TODO: provide better way JsNameRef lengthProperty = AstUtil.newQualifiedNameRef("length"); - AstUtil.setQualifier(lengthProperty, receiver); + setQualifier(lengthProperty, receiver); return lengthProperty; } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveEqualsIntrinsic.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveEqualsIntrinsic.java index 05cd57be9cd..3d95c2ca6b9 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveEqualsIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveEqualsIntrinsic.java @@ -17,14 +17,16 @@ package org.jetbrains.k2js.translate.intrinsic.primitive; import com.google.dart.compiler.backend.js.ast.JsExpression; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.EqualsIntrinsic; +import org.jetbrains.k2js.translate.utils.JsAstUtils; import java.util.List; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.notEqual; + /** * @author Pavel Talanov */ @@ -42,10 +44,12 @@ public final class PrimitiveEqualsIntrinsic extends EqualsIntrinsic { public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { assert arguments.size() == 1 : "Equals operation should have one argument"; + assert receiver != null; if (isNegated()) { - return AstUtil.notEqual(receiver, arguments.get(0)); - } else { - return AstUtil.equals(receiver, arguments.get(0)); + return notEqual(receiver, arguments.get(0)); + } + else { + return JsAstUtils.equals(receiver, arguments.get(0)); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveRangeToIntrinsic.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveRangeToIntrinsic.java index 723beaf07dc..3920ade7a2a 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveRangeToIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveRangeToIntrinsic.java @@ -26,9 +26,10 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; -import java.util.Arrays; import java.util.List; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; + /** * @author Pavel Talanov */ @@ -48,14 +49,14 @@ public final class PrimitiveRangeToIntrinsic implements FunctionIntrinsic { @NotNull TranslationContext context) { assert arguments.size() == 1 : "RangeTo must have one argument."; JsExpression rangeEnd = arguments.get(0); - JsBinaryOperation rangeSize = AstUtil.sum(AstUtil.subtract(rangeEnd, rangeStart), - context.program().getNumberLiteral(1)); + JsBinaryOperation rangeSize = sum(subtract(rangeEnd, rangeStart), + context.program().getNumberLiteral(1)); //TODO: provide a way not to hard code this value JsNew numberRangeConstructorInvocation = new JsNew(AstUtil.newQualifiedNameRef("Kotlin.NumberRange")); //TODO: add tests and correct expression for reversed ranges. JsBooleanLiteral isRangeReversed = context.program().getFalseLiteral(); - numberRangeConstructorInvocation.setArguments(Arrays.asList(rangeStart, rangeSize, isRangeReversed)); + setArguments(numberRangeConstructorInvocation, rangeStart, rangeSize, isRangeReversed); return numberRangeConstructorInvocation; } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/string/CharAtIntrinsic.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/string/CharAtIntrinsic.java index e2bcfb82eb3..902cbf6f0dc 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/string/CharAtIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/string/CharAtIntrinsic.java @@ -26,6 +26,9 @@ import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; import java.util.List; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.newInvocation; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier; + /** * @author Pavel Talanov */ @@ -41,7 +44,7 @@ public enum CharAtIntrinsic implements FunctionIntrinsic { assert arguments.size() == 1 : "get Char expression must have 1 arguments."; //TODO: provide better way JsNameRef charAtReference = AstUtil.newQualifiedNameRef("charAt"); - AstUtil.setQualifier(charAtReference, receiver); - return AstUtil.newInvocation(charAtReference, arguments); + setQualifier(charAtReference, receiver); + return newInvocation(charAtReference, arguments); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/string/LengthIntrinsic.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/string/LengthIntrinsic.java index 3e66610f8e2..510c9f938a2 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/string/LengthIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/string/LengthIntrinsic.java @@ -27,6 +27,8 @@ import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; import java.util.List; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier; + /** * @author Pavel Talanov */ @@ -42,7 +44,7 @@ public enum LengthIntrinsic implements FunctionIntrinsic { assert arguments.isEmpty() : "Length expression must have zero arguments."; //TODO: provide better way JsNameRef lengthProperty = AstUtil.newQualifiedNameRef("length"); - AstUtil.setQualifier(lengthProperty, receiver); + setQualifier(lengthProperty, receiver); return lengthProperty; } } \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java index 6fdf03194f2..85e3a978cbd 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java @@ -35,12 +35,12 @@ import org.jetbrains.k2js.translate.reference.CallType; import java.util.Arrays; -import static com.google.dart.compiler.util.AstUtil.not; import static org.jetbrains.k2js.translate.operation.AssignmentTranslator.isAssignmentOperator; import static org.jetbrains.k2js.translate.operation.CompareToTranslator.isCompareToCall; import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptorForOperationExpression; import static org.jetbrains.k2js.translate.utils.BindingUtils.getResolvedCall; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.isEquals; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.not; import static org.jetbrains.k2js.translate.utils.PsiUtils.*; import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateLeftExpression; import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRightExpression; @@ -140,7 +140,8 @@ public final class BinaryOperationTranslator extends AbstractTranslator { if (isInOrNotInOperation(expression)) { return callBuilder.receiver(rightExpression).args(leftExpression); - } else { + } + else { return callBuilder.receiver(leftExpression).args(rightExpression); } } @@ -149,7 +150,8 @@ public final class BinaryOperationTranslator extends AbstractTranslator { private JsExpression mayBeWrapWithNegation(@NotNull JsExpression result) { if (isNotInOperation(expression)) { return not(result); - } else { + } + else { return result; } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java index b51a05e360f..5c1df95e6b1 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetBinaryExpression; import org.jetbrains.k2js.translate.context.TranslationContext; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier; import static org.jetbrains.k2js.translate.utils.TranslationUtils.getMethodReferenceForOverloadedOperation; /** @@ -60,7 +61,7 @@ public final class OverloadedAssignmentTranslator extends AssignmentTranslator { @NotNull private JsExpression overloadedMethodInvocation() { - AstUtil.setQualifier(operationReference, accessTranslator.translateAsGet()); + setQualifier(operationReference, accessTranslator.translateAsGet()); return AstUtil.newInvocation(operationReference, right); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/operation/OverloadedIncrementTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/operation/OverloadedIncrementTranslator.java index bbeea97e9b0..466f7b21674 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/operation/OverloadedIncrementTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/operation/OverloadedIncrementTranslator.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetUnaryExpression; import org.jetbrains.k2js.translate.context.TranslationContext; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier; import static org.jetbrains.k2js.translate.utils.TranslationUtils.getMethodReferenceForOverloadedOperation; /** @@ -47,14 +48,14 @@ public final class OverloadedIncrementTranslator extends IncrementTranslator { } @NotNull - protected JsExpression translate() { + private JsExpression translate() { return translateAsMethodCall(); } @Override @NotNull protected JsExpression operationExpression(@NotNull JsExpression receiver) { - AstUtil.setQualifier(operationReference, receiver); + setQualifier(operationReference, receiver); return AstUtil.newInvocation(operationReference); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index 199d9e4b446..cd6e096c1cf 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -37,6 +37,7 @@ import java.util.ArrayList; import java.util.List; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; import static org.jetbrains.k2js.translate.utils.TranslationUtils.getThisObject; /** @@ -134,7 +135,7 @@ public final class CallTranslator extends AbstractTranslator { private JsExpression constructorCall() { JsExpression constructorReference = translateAsFunctionWithNoThisObject(descriptor); JsNew constructorCall = new JsNew(constructorReference); - constructorCall.setArguments(arguments); + setArguments(constructorCall, arguments); return constructorCall; } @@ -149,7 +150,7 @@ public final class CallTranslator extends AbstractTranslator { private boolean isExtensionFunctionLiteral() { boolean isLiteral = descriptor instanceof VariableAsFunctionDescriptor - || descriptor instanceof ExpressionAsFunctionDescriptor; + || descriptor instanceof ExpressionAsFunctionDescriptor; return isExtensionFunction() && isLiteral; } @@ -170,7 +171,7 @@ public final class CallTranslator extends AbstractTranslator { private JsExpression constructExtensionLiteralCall(@NotNull JsExpression realReceiver) { List callArguments = generateExtensionCallArgumentList(realReceiver); JsInvocation callMethodInvocation = generateCallMethodInvocation(); - callMethodInvocation.setArguments(callArguments); + setArguments(callMethodInvocation, callArguments); return callMethodInvocation; } @@ -179,7 +180,7 @@ public final class CallTranslator extends AbstractTranslator { JsNameRef callMethodNameRef = AstUtil.newQualifiedNameRef("call"); JsInvocation callMethodInvocation = new JsInvocation(); callMethodInvocation.setQualifier(callMethodNameRef); - AstUtil.setQualifier(callMethodInvocation, callParameters().functionReference); + setQualifier(callMethodInvocation, callParameters().functionReference); return callMethodInvocation; } @@ -219,8 +220,8 @@ public final class CallTranslator extends AbstractTranslator { private JsExpression constructExtensionFunctionCall(@NotNull JsExpression receiver) { List argumentList = generateExtensionCallArgumentList(receiver); JsExpression functionReference = callParameters().functionReference; - AstUtil.setQualifier(functionReference, callParameters().receiver); - return AstUtil.newInvocation(functionReference, argumentList); + setQualifier(functionReference, callParameters().receiver); + return newInvocation(functionReference, argumentList); } @NotNull @@ -241,9 +242,9 @@ public final class CallTranslator extends AbstractTranslator { public JsExpression construct(@Nullable JsExpression receiver) { JsExpression functionReference = callParameters.functionReference; if (receiver != null) { - AstUtil.setQualifier(functionReference, receiver); + setQualifier(functionReference, receiver); } - return AstUtil.newInvocation(functionReference, arguments); + return newInvocation(functionReference, arguments); } }, context()); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallType.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallType.java index 73f4c4842b4..19510c0e5e4 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallType.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallType.java @@ -20,7 +20,6 @@ import com.google.dart.compiler.backend.js.ast.JsBinaryOperation; import com.google.dart.compiler.backend.js.ast.JsConditional; import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsNullLiteral; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression; @@ -30,6 +29,7 @@ import org.jetbrains.k2js.translate.context.TemporaryVariable; import org.jetbrains.k2js.translate.context.TranslationContext; import static com.google.dart.compiler.util.AstUtil.newSequence; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.notEqual; /** * @author Pavel Talanov @@ -44,7 +44,7 @@ public enum CallType { TemporaryVariable temporaryVariable = context.declareTemporary(receiver); JsNullLiteral nullLiteral = context.program().getNullLiteral(); //TODO: find similar not null checks - JsBinaryOperation notNullCheck = AstUtil.notEqual(temporaryVariable.reference(), nullLiteral); + JsBinaryOperation notNullCheck = notEqual(temporaryVariable.reference(), nullLiteral); JsConditional callMethodIfNotNullElseNull = new JsConditional(notNullCheck, constructor.construct(temporaryVariable.reference()), nullLiteral); return newSequence(temporaryVariable.assignmentExpression(), callMethodIfNotNullElseNull); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/NativePropertyAccessTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/NativePropertyAccessTranslator.java index f6744be776c..56aaf90017a 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/NativePropertyAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/NativePropertyAccessTranslator.java @@ -18,7 +18,6 @@ package org.jetbrains.k2js.translate.reference; import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsName; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; @@ -27,6 +26,8 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.utils.TranslationUtils; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getExpectedThisDescriptor; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.assignment; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.qualified; /** * @author Pavel Talanov @@ -57,8 +58,9 @@ public final class NativePropertyAccessTranslator extends PropertyAccessTranslat JsName nativePropertyName = context().getNameForDescriptor(propertyDescriptor); JsExpression realQualifier = getQualifier(); if (realQualifier != null) { - return AstUtil.qualified(nativePropertyName, realQualifier); - } else { + return qualified(nativePropertyName, realQualifier); + } + else { return nativePropertyName.makeRef(); } } @@ -66,7 +68,7 @@ public final class NativePropertyAccessTranslator extends PropertyAccessTranslat @Override @NotNull public JsExpression translateAsSet(@NotNull JsExpression setTo) { - return AstUtil.assignment(translateAsGet(), setTo); + return assignment(translateAsGet(), setTo); } @Nullable diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index 34c0f453f54..8c9bec06db6 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -18,19 +18,22 @@ package org.jetbrains.k2js.translate.reference; import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsName; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.k2js.translate.context.TranslationContext; import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.qualified; /** * @author Pavel Talanov */ public final class ReferenceTranslator { + private ReferenceTranslator() { + } + @NotNull public static JsExpression translateSimpleName(@NotNull JetSimpleNameExpression expression, @NotNull TranslationContext context) { @@ -50,7 +53,7 @@ public final class ReferenceTranslator { return translateAsLocalNameReference(referencedDescriptor, context); } JsName referencedName = context.getNameForDescriptor(referencedDescriptor); - return AstUtil.qualified(referencedName, qualifier); + return qualified(referencedName, qualifier); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java new file mode 100644 index 00000000000..a1b115b1916 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java @@ -0,0 +1,288 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * 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 org.jetbrains.k2js.translate.utils; + +import com.google.common.collect.Lists; +import com.google.dart.compiler.backend.js.ast.*; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +/** + * @author Pavel Talanov + */ +public final class JsAstUtils { + + private JsAstUtils() { + } + + @NotNull + public static JsPropertyInitializer newNamedMethod(@NotNull JsName name, @NotNull JsFunction function) { + JsNameRef methodName = name.makeRef(); + return new JsPropertyInitializer(methodName, function); + } + + @NotNull + public static JsStatement convertToStatement(@NotNull JsNode jsNode) { + assert (jsNode instanceof JsExpression) || (jsNode instanceof JsStatement) + : "Unexpected node of type: " + jsNode.getClass().toString(); + if (jsNode instanceof JsExpression) { + return new JsExprStmt((JsExpression) jsNode); + } + return (JsStatement) jsNode; + } + + @NotNull + public static JsBlock convertToBlock(@NotNull JsNode jsNode) { + if (jsNode instanceof JsBlock) { + return (JsBlock) jsNode; + } + JsStatement jsStatement = convertToStatement(jsNode); + return new JsBlock(jsStatement); + } + + @NotNull + public static JsExpression convertToExpression(@NotNull JsNode jsNode) { + assert jsNode instanceof JsExpression : "Unexpected node of type: " + jsNode.getClass().toString(); + return (JsExpression) jsNode; + } + + public static JsNameRef thisQualifiedReference(@NotNull JsName name) { + JsNameRef result = name.makeRef(); + result.setQualifier(new JsThisRef()); + return result; + } + + @NotNull + public static JsBlock newBlock(List statements) { + JsBlock result = new JsBlock(); + setStatements(result, statements); + return result; + } + + @NotNull + public static JsPrefixOperation negated(@NotNull JsExpression expression) { + return new JsPrefixOperation(JsUnaryOperator.NOT, expression); + } + + @NotNull + public static JsStatement newAssignmentStatement(@NotNull JsNameRef nameRef, @NotNull JsExpression expr) { + return convertToStatement(new JsBinaryOperation(JsBinaryOperator.ASG, nameRef, expr)); + } + + @NotNull + public static JsExpression extractExpressionFromStatement(@NotNull JsStatement statement) { + assert statement instanceof JsExprStmt : "Cannot extract expression from statement: " + statement; + return (((JsExprStmt) statement).getExpression()); + } + + @NotNull + public static JsBinaryOperation and(@NotNull JsExpression op1, @NotNull JsExpression op2) { + return new JsBinaryOperation(JsBinaryOperator.AND, op1, op2); + } + + @NotNull + public static JsBinaryOperation or(@NotNull JsExpression op1, @NotNull JsExpression op2) { + return new JsBinaryOperation(JsBinaryOperator.OR, op1, op2); + } + + //TODO refactor + public static void setQualifier(@NotNull JsExpression selector, @Nullable JsExpression receiver) { + if (selector instanceof JsInvocation) { + setQualifier(((JsInvocation) selector).getQualifier(), receiver); + return; + } + if (selector instanceof JsNameRef) { + JsNameRef nameRef = (JsNameRef) selector; + JsExpression qualifier = nameRef.getQualifier(); + if (qualifier == null) { + nameRef.setQualifier(receiver); + } + else { + setQualifier(qualifier, receiver); + } + return; + } + throw new AssertionError("Set qualifier should be applied only to JsInvocation or JsNameRef instances"); + } + + public static JsNameRef qualified(@NotNull JsName selector, @Nullable JsExpression qualifier) { + JsNameRef reference = selector.makeRef(); + setQualifier(reference, qualifier); + return reference; + } + + @NotNull + public static JsBinaryOperation equals(@NotNull JsExpression arg1, @NotNull JsExpression arg2) { + return new JsBinaryOperation(JsBinaryOperator.EQ, arg1, arg2); + } + + @NotNull + public static JsBinaryOperation notEqual(@NotNull JsExpression arg1, @NotNull JsExpression arg2) { + return new JsBinaryOperation(JsBinaryOperator.NEQ, arg1, arg2); + } + + @NotNull + public static JsExpression equalsTrue(@NotNull JsExpression expression, @NotNull JsProgram program) { + return equals(expression, program.getTrueLiteral()); + } + + @NotNull + public static JsExpression assignment(@NotNull JsExpression left, @NotNull JsExpression right) { + return new JsBinaryOperation(JsBinaryOperator.ASG, left, right); + } + + @NotNull + public static JsBinaryOperation sum(@NotNull JsExpression left, @NotNull JsExpression right) { + return new JsBinaryOperation(JsBinaryOperator.ADD, left, right); + } + + @NotNull + public static JsBinaryOperation subtract(@NotNull JsExpression left, @NotNull JsExpression right) { + return new JsBinaryOperation(JsBinaryOperator.SUB, left, right); + } + + @NotNull + public static JsPrefixOperation not(@NotNull JsExpression expression) { + return new JsPrefixOperation(JsUnaryOperator.NOT, expression); + } + + @NotNull + public static JsBinaryOperation typeof(@NotNull JsExpression expression, @NotNull JsStringLiteral string) { + return equals(new JsPrefixOperation(JsUnaryOperator.TYPEOF, expression), string); + } + + public interface Mutator { + JsNode mutate(JsNode node); + } + + + //TODO: move somewhere + //TODO: refactor and review + public static JsNode mutateLastExpression(@NotNull JsNode node, @NotNull Mutator mutator) { + if (node instanceof JsBlock) { + JsBlock block = (JsBlock) node; + List statements = block.getStatements(); + + if (statements.isEmpty()) return block; + + int size = statements.size(); + statements.set(size - 1, + convertToStatement(mutateLastExpression(statements.get(size - 1), mutator))); + return block; + } + if (node instanceof JsIf) { + JsIf ifExpr = (JsIf) node; + ifExpr.setThenStmt(convertToStatement(mutateLastExpression(ifExpr.getThenStmt(), mutator))); + JsStatement elseStmt = ifExpr.getElseStmt(); + if (elseStmt != null) { + ifExpr.setElseStmt(convertToStatement(mutateLastExpression(elseStmt, mutator))); + } + return ifExpr; + } + if (node instanceof JsExprStmt) { + return convertToStatement(mutateLastExpression(((JsExprStmt) node).getExpression(), mutator)); + } + return mutator.mutate(node); + } + + + public static final class SaveLastExpressionMutator implements Mutator { + + @NotNull + private final JsExpression toAssign; + + public SaveLastExpressionMutator(@NotNull JsExpression toAssign) { + this.toAssign = toAssign; + } + + @Override + public JsNode mutate(JsNode node) { + if (!(node instanceof JsExpression)) { + return node; + } + return assignment(toAssign, (JsExpression) node); + } + } + + + @NotNull + public static JsVars newVar(@NotNull JsName name, @Nullable JsExpression expr) { + JsVars.JsVar var = new JsVars.JsVar(name); + if (expr != null) { + var.setInitExpr(expr); + } + JsVars vars = new JsVars(); + vars.add(var); + return vars; + } + + public static void addVarDeclaration(@NotNull JsBlock block, @NotNull JsVars vars) { + LinkedList statementLinkedList = Lists.newLinkedList(block.getStatements()); + statementLinkedList.offer(vars); + setStatements(block, statementLinkedList); + } + + public static void setStatements(@NotNull JsBlock block, @NotNull List statements) { + List statementList = block.getStatements(); + statementList.clear(); + statementList.addAll(statements); + } + + public static void setArguments(@NotNull JsInvocation invocation, @NotNull List newArgs) { + List arguments = invocation.getArguments(); + assert arguments.isEmpty() : "Arguments already set."; + arguments.addAll(newArgs); + } + + public static void setArguments(@NotNull JsInvocation invocation, JsExpression... arguments) { + setArguments(invocation, Arrays.asList(arguments)); + } + + public static void setArguments(@NotNull JsNew invocation, @NotNull List newArgs) { + List arguments = invocation.getArguments(); + assert arguments.isEmpty() : "Arguments already set."; + arguments.addAll(newArgs); + } + + public static void setArguments(@NotNull JsNew invocation, JsExpression... arguments) { + setArguments(invocation, Arrays.asList(arguments)); + } + + public static void setParameters(@NotNull JsFunction function, @NotNull List newParams) { + List parameters = function.getParameters(); + assert parameters.isEmpty() : "Arguments already set."; + parameters.addAll(newParams); + } + + public static void setParameters(@NotNull JsFunction function, JsParameter... arguments) { + setParameters(function, Arrays.asList(arguments)); + } + + @NotNull + public static JsInvocation newInvocation(@NotNull JsExpression target, List params) { + JsInvocation invoke = new JsInvocation(); + invoke.setQualifier(target); + for (JsExpression expr : params) { + invoke.getArguments().add(expr); + } + return invoke; + } +} diff --git a/js/k2js.iml b/js/k2js.iml deleted file mode 100644 index aec952a92d2..00000000000 --- a/js/k2js.iml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - -