Closure JS hookup Review by: cromwellian@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10778 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/PrecompileTaskArgProcessor.java b/dev/core/src/com/google/gwt/dev/PrecompileTaskArgProcessor.java index 04be766..5f13163 100644 --- a/dev/core/src/com/google/gwt/dev/PrecompileTaskArgProcessor.java +++ b/dev/core/src/com/google/gwt/dev/PrecompileTaskArgProcessor.java
@@ -1,12 +1,12 @@ /* * Copyright 2011 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -28,6 +28,7 @@ import com.google.gwt.dev.util.arg.ArgHandlerDraftCompile; import com.google.gwt.dev.util.arg.ArgHandlerDumpSignatures; import com.google.gwt.dev.util.arg.ArgHandlerEnableAssertions; +import com.google.gwt.dev.util.arg.ArgHandlerEnableClosureCompiler; import com.google.gwt.dev.util.arg.ArgHandlerGenDir; import com.google.gwt.dev.util.arg.ArgHandlerMaxPermsPerPrecompile; import com.google.gwt.dev.util.arg.ArgHandlerOptimize; @@ -60,6 +61,7 @@ registerHandler(new ArgHandlerStrict(options)); registerHandler(new ArgHandlerCompilerMetrics(options)); registerHandler(new ArgHandlerDisableSoycHtml(options)); + registerHandler(new ArgHandlerEnableClosureCompiler(options)); } @Override
diff --git a/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java b/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java index 7abf8b5..1fea930 100644 --- a/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java +++ b/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java
@@ -1,12 +1,12 @@ /* * Copyright 2011 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -84,6 +84,11 @@ } @Override + public boolean isClosureCompilerEnabled() { + return jjsOptions.isClosureCompilerEnabled(); + } + + @Override public boolean isCompilerMetricsEnabled() { return jjsOptions.isCompilerMetricsEnabled(); } @@ -158,6 +163,11 @@ } @Override + public void setClosureCompilerEnabled(boolean enabled) { + jjsOptions.setClosureCompilerEnabled(enabled); + } + + @Override public void setCompilerMetricsEnabled(boolean enabled) { jjsOptions.setCompilerMetricsEnabled(enabled); }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java index fc13cde..3162e5e 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java +++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
@@ -1,12 +1,12 @@ /* * Copyright 2008 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -19,6 +19,7 @@ import com.google.gwt.dev.util.arg.OptionDisableCastChecking; import com.google.gwt.dev.util.arg.OptionDisableClassMetadata; import com.google.gwt.dev.util.arg.OptionEnableAssertions; +import com.google.gwt.dev.util.arg.OptionEnableClosureCompiler; import com.google.gwt.dev.util.arg.OptionOptimize; import com.google.gwt.dev.util.arg.OptionOptimizePrecompile; import com.google.gwt.dev.util.arg.OptionRunAsyncEnabled; @@ -34,6 +35,7 @@ public interface JJSOptions extends OptionOptimize, OptionAggressivelyOptimize, OptionDisableClassMetadata, OptionDisableCastChecking, OptionEnableAssertions, OptionRunAsyncEnabled, OptionScriptStyle, OptionSoycEnabled, OptionSoycDetailed, - OptionOptimizePrecompile, OptionStrict, OptionSoycHtmlDisabled { + OptionOptimizePrecompile, OptionStrict, OptionSoycHtmlDisabled, + OptionEnableClosureCompiler { }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java index d3abb04..c1695bb 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java +++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
@@ -1,12 +1,12 @@ /* * Copyright 2008 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -37,6 +37,7 @@ private boolean soycExtra = false; private boolean soycHtmlDisabled = false; private boolean strict = false; + private boolean closureCompilerEnabled; public JJSOptionsImpl() { } @@ -58,6 +59,7 @@ setSoycExtra(other.isSoycExtra()); setSoycHtmlDisabled(other.isSoycHtmlDisabled()); setStrict(other.isStrict()); + setClosureCompilerEnabled(other.isClosureCompilerEnabled()); } @Override @@ -86,6 +88,11 @@ } @Override + public boolean isClosureCompilerEnabled() { + return this.closureCompilerEnabled; + } + + @Override public boolean isCompilerMetricsEnabled() { return compilerMetricsEnabled; } @@ -118,7 +125,7 @@ public boolean isSoycExtra() { return soycExtra; } - + @Override public boolean isSoycHtmlDisabled() { return soycHtmlDisabled; @@ -145,6 +152,11 @@ } @Override + public void setClosureCompilerEnabled(boolean enabled) { + this.closureCompilerEnabled = enabled; + } + + @Override public void setCompilerMetricsEnabled(boolean enabled) { this.compilerMetricsEnabled = enabled; } @@ -183,7 +195,7 @@ public void setSoycExtra(boolean enabled) { soycExtra = enabled; } - + @Override public void setSoycHtmlDisabled(boolean disabled) { soycHtmlDisabled = disabled;
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java index c0bf87c..9fcc051 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java +++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -1,12 +1,12 @@ /* * Copyright 2008 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -101,6 +101,7 @@ import com.google.gwt.dev.jjs.impl.TypeTightener; import com.google.gwt.dev.jjs.impl.UnifyAst; import com.google.gwt.dev.jjs.impl.gflow.DataflowOptimizer; +import com.google.gwt.dev.js.ClosureJsRunner; import com.google.gwt.dev.js.EvalFunctionsAtTopScope; import com.google.gwt.dev.js.JsBreakUpLargeVarStatements; import com.google.gwt.dev.js.JsCoerceIntShift; @@ -190,26 +191,32 @@ this.statementRanges = statementRanges; } + @Override public void addArtifacts(Collection<? extends Artifact<?>> newArtifacts) { this.artifacts.addAll(newArtifacts); } + @Override public ArtifactSet getArtifacts() { return artifacts; } + @Override public byte[][] getJs() { return js; } + @Override public Permutation getPermutation() { return permutation; } + @Override public byte[] getSerializedSymbolMap() { return serializedSymbolMap; } + @Override public StatementRanges[] getStatementRanges() { return statementRanges; } @@ -233,7 +240,7 @@ /** * Compiles a particular permutation, based on a precompiled unified AST. - * + * * @param logger the logger to use * @param unifiedAst the result of a * {@link #precompile(TreeLogger, ModuleDef, RebindPermutationOracle, String[], String[], JJSOptions, boolean, PrecompilationMetricsArtifact)} @@ -334,7 +341,7 @@ /* * Work around Safari 5 bug by rewriting a >> b as ~~a >> b. - * + * * No shifts may be generated after this point. */ JsCoerceIntShift.exec(jsProgram, logger, propertyOracles); @@ -423,7 +430,8 @@ PermutationResult toReturn = new PermutationResultImpl(js, permutation, makeSymbolMap(symbolTable, jsProgram), ranges); CompilationMetricsArtifact compilationMetrics = null; - if (options.isCompilerMetricsEnabled()) { + // TODO: enable this when ClosureCompiler is enabled + if (!options.isClosureCompilerEnabled() && options.isCompilerMetricsEnabled()) { compilationMetrics = new CompilationMetricsArtifact(permutation.getId()); compilationMetrics.setCompileElapsedMilliseconds(System.currentTimeMillis() - startTimeMilliseconds); @@ -434,12 +442,17 @@ toReturn.addArtifacts(Lists.create(unifiedAst.getModuleMetrics(), unifiedAst .getPrecompilationMetrics(), compilationMetrics)); } - toReturn.addArtifacts(makeSoycArtifacts(logger, permutationId, jprogram, js, sizeBreakdowns, - options.isSoycExtra() ? sourceInfoMaps : null, dependencies, jjsmap, obfuscateMap, - unifiedAst.getModuleMetrics(), unifiedAst.getPrecompilationMetrics(), compilationMetrics, - options.isSoycHtmlDisabled())); - if (isSourceMapsEnabled) { + // TODO: enable this when ClosureCompiler is enabled + if (!options.isClosureCompilerEnabled()) { + toReturn.addArtifacts(makeSoycArtifacts(logger, permutationId, jprogram, js, sizeBreakdowns, + options.isSoycExtra() ? sourceInfoMaps : null, dependencies, jjsmap, obfuscateMap, + unifiedAst.getModuleMetrics(), unifiedAst.getPrecompilationMetrics(), compilationMetrics, + options.isSoycHtmlDisabled())); + } + + // TODO: enable this when ClosureCompiler is enabled + if (!options.isClosureCompilerEnabled() && isSourceMapsEnabled) { logger.log(TreeLogger.INFO, "Source Maps Enabled"); toReturn.addArtifacts(SourceMapRecorder.makeSourceMapArtifacts(sourceInfoMaps, permutationId)); @@ -490,7 +503,7 @@ /** * Performs a precompilation, returning a unified AST. - * + * * @param logger the logger to use * @param module the module to compile * @param rpo the RebindPermutationOracle @@ -612,7 +625,7 @@ /* * 4) Possibly optimize some. - * + * * Don't optimize early if this is a draft compile, or if there's only one * permutation. */ @@ -804,7 +817,7 @@ /* * Enum ordinalization. - * + * * TODO(jbrosenberg): graduate this out of the 'isAggressivelyOptimize' * block, over time. */ @@ -956,7 +969,7 @@ /** * Generate JavaScript code from the given JavaScript ASTs. Also produces * information about that transformation. - * + * * @param options The options this compiler instance is running with * @param jsProgram The AST to convert to source code * @param jjsMap A map between the JavaScript AST and the Java AST it came @@ -976,6 +989,14 @@ SizeBreakdown[] sizeBreakdowns, List<Map<Range, SourceInfo>> sourceInfoMaps, boolean splitBlocks, boolean sourceMapsEnabled) { + + boolean useClosureCompiler = options.isClosureCompilerEnabled(); + if (useClosureCompiler) { + ClosureJsRunner runner = new ClosureJsRunner(); + runner.compile(jsProgram, js, options.getOutput()); + return; + } + for (int i = 0; i < js.length; i++) { DefaultTextOutput out = new DefaultTextOutput(options.getOutput().shouldMinimize()); JsSourceGenerationVisitorWithSizeBreakdown v; @@ -1036,7 +1057,7 @@ /** * This method can be used to fetch the list of referenced classs. - * + * * This method is intended to support compiler metrics in the precompile * phase. */ @@ -1164,7 +1185,7 @@ /** * Create a variable assignment to invoke a call to the statistics collector. - * + * * <pre> * Stats.isStatsAvailable() && * Stats.onModuleStart("mainClassName");
diff --git a/dev/core/src/com/google/gwt/dev/js/ClosureJsAst.java b/dev/core/src/com/google/gwt/dev/js/ClosureJsAst.java new file mode 100644 index 0000000..0a437b0 --- /dev/null +++ b/dev/core/src/com/google/gwt/dev/js/ClosureJsAst.java
@@ -0,0 +1,73 @@ +/* + * Copyright 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.gwt.dev.js; + +import com.google.gwt.thirdparty.guava.common.base.Preconditions; +import com.google.gwt.thirdparty.javascript.jscomp.AbstractCompiler; +import com.google.gwt.thirdparty.javascript.jscomp.SourceAst; +import com.google.gwt.thirdparty.javascript.jscomp.SourceFile; +import com.google.gwt.thirdparty.javascript.rhino.InputId; +import com.google.gwt.thirdparty.javascript.rhino.Node; + +/** + * Maps the JavaScript AST to a Closure Compiler input source. + */ +public class ClosureJsAst implements SourceAst { + + private static final long serialVersionUID = 1L; + + /* + * Root node of internal JS Compiler AST which represents the same source. In order to get the + * tree, getAstRoot() has to be called. + */ + private Node root; + private final InputId inputId; + + public ClosureJsAst(InputId inputId, Node root) { + Preconditions.checkNotNull(root); + this.inputId = inputId; + this.root = root; + } + + @Override + public void clearAst() { + root = null; + } + + @Override + public Node getAstRoot(AbstractCompiler compiler) { + return root; + } + + @Override + public InputId getInputId() { + return inputId; + } + + @Override + public SourceFile getSourceFile() { + return null; + } + + public String getSourceName() { + return null; + } + + @Override + public void setSourceFile(SourceFile file) { + throw new UnsupportedOperationException( + "ClosureJsAst cannot be associated with a SourceFile instance."); + } +}
diff --git a/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java b/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java new file mode 100644 index 0000000..54d1c46 --- /dev/null +++ b/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java
@@ -0,0 +1,823 @@ +/* + * Copyright 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.gwt.dev.js; + +import com.google.gwt.dev.jjs.HasSourceInfo; +import com.google.gwt.dev.jjs.SourceInfo; +import com.google.gwt.dev.js.ast.HasName; +import com.google.gwt.dev.js.ast.JsArrayAccess; +import com.google.gwt.dev.js.ast.JsArrayLiteral; +import com.google.gwt.dev.js.ast.JsBinaryOperation; +import com.google.gwt.dev.js.ast.JsBinaryOperator; +import com.google.gwt.dev.js.ast.JsBlock; +import com.google.gwt.dev.js.ast.JsBooleanLiteral; +import com.google.gwt.dev.js.ast.JsBreak; +import com.google.gwt.dev.js.ast.JsCase; +import com.google.gwt.dev.js.ast.JsCatch; +import com.google.gwt.dev.js.ast.JsConditional; +import com.google.gwt.dev.js.ast.JsContinue; +import com.google.gwt.dev.js.ast.JsDebugger; +import com.google.gwt.dev.js.ast.JsDefault; +import com.google.gwt.dev.js.ast.JsDoWhile; +import com.google.gwt.dev.js.ast.JsEmpty; +import com.google.gwt.dev.js.ast.JsExprStmt; +import com.google.gwt.dev.js.ast.JsExpression; +import com.google.gwt.dev.js.ast.JsFor; +import com.google.gwt.dev.js.ast.JsForIn; +import com.google.gwt.dev.js.ast.JsFunction; +import com.google.gwt.dev.js.ast.JsIf; +import com.google.gwt.dev.js.ast.JsInvocation; +import com.google.gwt.dev.js.ast.JsLabel; +import com.google.gwt.dev.js.ast.JsName; +import com.google.gwt.dev.js.ast.JsNameOf; +import com.google.gwt.dev.js.ast.JsNameRef; +import com.google.gwt.dev.js.ast.JsNew; +import com.google.gwt.dev.js.ast.JsNode; +import com.google.gwt.dev.js.ast.JsNullLiteral; +import com.google.gwt.dev.js.ast.JsNumberLiteral; +import com.google.gwt.dev.js.ast.JsObjectLiteral; +import com.google.gwt.dev.js.ast.JsParameter; +import com.google.gwt.dev.js.ast.JsPostfixOperation; +import com.google.gwt.dev.js.ast.JsPrefixOperation; +import com.google.gwt.dev.js.ast.JsProgram; +import com.google.gwt.dev.js.ast.JsProgramFragment; +import com.google.gwt.dev.js.ast.JsPropertyInitializer; +import com.google.gwt.dev.js.ast.JsRegExp; +import com.google.gwt.dev.js.ast.JsReturn; +import com.google.gwt.dev.js.ast.JsSeedIdOf; +import com.google.gwt.dev.js.ast.JsStatement; +import com.google.gwt.dev.js.ast.JsStringLiteral; +import com.google.gwt.dev.js.ast.JsSwitch; +import com.google.gwt.dev.js.ast.JsSwitchMember; +import com.google.gwt.dev.js.ast.JsThisRef; +import com.google.gwt.dev.js.ast.JsThrow; +import com.google.gwt.dev.js.ast.JsTry; +import com.google.gwt.dev.js.ast.JsUnaryOperator; +import com.google.gwt.dev.js.ast.JsVars; +import com.google.gwt.dev.js.ast.JsVars.JsVar; +import com.google.gwt.dev.js.ast.JsWhile; +import com.google.gwt.dev.js.ast.NodeKind; +import com.google.gwt.thirdparty.guava.common.base.Preconditions; +import com.google.gwt.thirdparty.guava.common.collect.Sets; +import com.google.gwt.thirdparty.javascript.jscomp.AstValidator; +import com.google.gwt.thirdparty.javascript.rhino.IR; +import com.google.gwt.thirdparty.javascript.rhino.InputId; +import com.google.gwt.thirdparty.javascript.rhino.Node; +import com.google.gwt.thirdparty.javascript.rhino.Token; +import com.google.gwt.thirdparty.javascript.rhino.jstype.SimpleSourceFile; +import com.google.gwt.thirdparty.javascript.rhino.jstype.StaticSourceFile; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * Translate a Dart JS AST to a Closure Compiler AST. + */ +public class ClosureJsAstTranslator { + private static String getStringValue(double value) { + long longValue = (long) value; + + // Return "1" instead of "1.0" + if (longValue == value) { + return Long.toString(longValue); + } else { + return Double.toString(value); + } + } + + private final Map<String, StaticSourceFile> sourceCache = new HashMap<String, StaticSourceFile>(); + + private final boolean validate; + private final Set<String> globalVars = Sets.newHashSet(); + private final Set<String> externalProperties = Sets.newHashSet(); + + private final Set<String> externalVars = Sets.newHashSet(); + + private final JsProgram program; + + ClosureJsAstTranslator(boolean validate, JsProgram program) { + this.program = program; + this.validate = validate; + } + + public Node translate(JsProgramFragment fragment, InputId inputId, String source) { + Node script = IR.script(); + script.putBooleanProp(Node.SYNTHETIC_BLOCK_PROP, true); + script.setInputId(inputId); + script.putProp(Node.SOURCENAME_PROP, source); + script.setStaticSourceFile(getClosureSourceFile(source)); + for (JsStatement s : fragment.getGlobalBlock().getStatements()) { + script.addChildToBack(transform(s)); + } + // Validate the structural integrity of the AST. + if (validate) { + new AstValidator().validateScript(script); + } + return script; + } + + Set<String> getExternalPropertyReferences() { + return externalProperties; + } + + Set<String> getExternalVariableReferences() { + return externalVars; + } + + Set<String> getGlobalVariableNames() { + return globalVars; + } + + private Node applyOriginalName(Node n, JsNode x) { + /* + * if (x instanceof HasSymbol) { Symbol symbol = ((HasSymbol)x).getSymbol(); if (symbol != null) + * { String originalName = symbol.getOriginalSymbolName(); n.putProp(Node.ORIGINALNAME_PROP, + * originalName); } } + */ + return n; + } + + private Node applySourceInfo(Node n, HasSourceInfo srcNode) { + if (n != null && srcNode != null) { + SourceInfo info = srcNode.getSourceInfo(); + if (info != null && info.getFileName() != null) { + n.setStaticSourceFile(getClosureSourceFile(info.getFileName())); + n.setLineno(info.getStartLine()); + n.setCharno(0); + } + } + return n; + } + + private StaticSourceFile getClosureSourceFile(String source) { + StaticSourceFile closureSourceFile = sourceCache.get(source); + if (closureSourceFile == null) { + closureSourceFile = new SimpleSourceFile(source, false); + sourceCache.put(source, closureSourceFile); + } + return closureSourceFile; + } + + private String getName(JsName name) { + return name.getShortIdent(); + } + + private String getName(JsNameRef name) { + return name.getShortIdent(); + } + + private Node getNameNodeFor(HasName hasName) { + Node n = IR.name(getName(hasName.getName())); + applyOriginalName(n, (JsNode) hasName); + return applySourceInfo(n, (HasSourceInfo) hasName); + } + + private int getTokenForOp(JsBinaryOperator op) { + switch (op) { + case MUL: + return Token.MUL; + case DIV: + return Token.DIV; + case MOD: + return Token.MOD; + case ADD: + return Token.ADD; + case SUB: + return Token.SUB; + case SHL: + return Token.LSH; + case SHR: + return Token.RSH; + case SHRU: + return Token.URSH; + case LT: + return Token.LT; + case LTE: + return Token.LE; + case GT: + return Token.GT; + case GTE: + return Token.GE; + case INSTANCEOF: + return Token.INSTANCEOF; + case INOP: + return Token.IN; + case EQ: + return Token.EQ; + case NEQ: + return Token.NE; + case REF_EQ: + return Token.SHEQ; + case REF_NEQ: + return Token.SHNE; + case BIT_AND: + return Token.BITAND; + case BIT_XOR: + return Token.BITXOR; + case BIT_OR: + return Token.BITOR; + case AND: + return Token.AND; + case OR: + return Token.OR; + case ASG: + return Token.ASSIGN; + case ASG_ADD: + return Token.ASSIGN_ADD; + case ASG_SUB: + return Token.ASSIGN_SUB; + case ASG_MUL: + return Token.ASSIGN_MUL; + case ASG_DIV: + return Token.ASSIGN_DIV; + case ASG_MOD: + return Token.ASSIGN_MOD; + case ASG_SHL: + return Token.ASSIGN_LSH; + case ASG_SHR: + return Token.ASSIGN_RSH; + case ASG_SHRU: + return Token.ASSIGN_URSH; + case ASG_BIT_AND: + return Token.ASSIGN_BITAND; + case ASG_BIT_OR: + return Token.ASSIGN_BITOR; + case ASG_BIT_XOR: + return Token.ASSIGN_BITXOR; + case COMMA: + return Token.COMMA; + } + return 0; + } + + private int getTokenForOp(JsUnaryOperator op) { + switch (op) { + case BIT_NOT: + return Token.BITNOT; + case DEC: + return Token.DEC; + case DELETE: + return Token.DELPROP; + case INC: + return Token.INC; + case NEG: + return Token.NEG; + case POS: + return Token.POS; + case NOT: + return Token.NOT; + case TYPEOF: + return Token.TYPEOF; + case VOID: + return Token.VOID; + } + throw new IllegalStateException(); + } + + private Node transform(JsArrayAccess x) { + Node n = IR.getelem(transform(x.getArrayExpr()), transform(x.getIndexExpr())); + return applySourceInfo(n, x); + } + + private Node transform(JsArrayLiteral x) { + Node n = IR.arraylit(); + for (Object element : x.getExpressions()) { + JsExpression arg = (JsExpression) element; + n.addChildToBack(transform(arg)); + } + return applySourceInfo(n, x); + } + + private Node transform(JsBinaryOperation x) { + JsBinaryOperator op = x.getOperator(); + Node n = new Node(getTokenForOp(op), transform(x.getArg1()), transform(x.getArg2())); + return applySourceInfo(n, x); + } + + private Node transform(JsBlock x) { + Node n = IR.block(); + for (JsStatement s : x.getStatements()) { + n.addChildToBack(transform(s)); + } + return applySourceInfo(n, x); + } + + private Node transform(JsBooleanLiteral x) { + Node n = x.getValue() ? IR.trueNode() : IR.falseNode(); + return applySourceInfo(n, x); + } + + private Node transform(JsBreak x) { + Node n; + JsNameRef label = x.getLabel(); + if (label == null) { + n = IR.breakNode(); + } else { + n = IR.breakNode(transformLabel(label)); + } + + return applySourceInfo(n, x); + } + + private Node transform(JsCase x) { + Node expr = transform(x.getCaseExpr()); + Node body = IR.block(); + body.putBooleanProp(Node.SYNTHETIC_BLOCK_PROP, true); + applySourceInfo(body, x); + + for (Object element : x.getStmts()) { + JsStatement stmt = (JsStatement) element; + body.addChildToBack(transform(stmt)); + } + + Node n = IR.caseNode(expr, body); + return applySourceInfo(n, x); + } + + private Node transform(JsCatch x) { + Node n = IR.catchNode(transformName(x.getParameter().getName()), transform(x.getBody())); + Preconditions.checkState(x.getCondition() == null); + return applySourceInfo(n, x); + } + + private Node transform(JsConditional x) { + Node n = + IR.hook(transform(x.getTestExpression()), transform(x.getThenExpression()), transform(x + .getElseExpression())); + return applySourceInfo(n, x); + } + + private Node transform(JsContinue x) { + Node n; + JsNameRef label = x.getLabel(); + if (label == null) { + n = IR.continueNode(); + } else { + n = IR.continueNode(transformLabel(label)); + } + + return applySourceInfo(n, x); + } + + private Node transform(JsDebugger x) { + Node n = new Node(Token.DEBUGGER); + return applySourceInfo(n, x); + } + + private Node transform(JsDefault x) { + Node body = IR.block(); + body.putBooleanProp(Node.SYNTHETIC_BLOCK_PROP, true); + applySourceInfo(body, x); + + for (Object element : x.getStmts()) { + JsStatement stmt = (JsStatement) element; + body.addChildToBack(transform(stmt)); + } + Node n = IR.defaultCase(body); + return applySourceInfo(n, x); + } + + private Node transform(JsDoWhile x) { + Node n = IR.doNode(transformBody(x.getBody(), x), transform(x.getCondition())); + return applySourceInfo(n, x); + } + + private Node transform(JsEmpty x) { + return IR.empty(); + } + + private Node transform(JsExpression x) { + assert x != null; + switch (x.getKind()) { + case ARRAY: + return transform((JsArrayLiteral) x); + case ARRAY_ACCESS: + return transform((JsArrayAccess) x); + case BINARY_OP: + return transform((JsBinaryOperation) x); + case CONDITIONAL: + return transform((JsConditional) x); + case INVOKE: + return transform((JsInvocation) x); + case FUNCTION: + return transform((JsFunction) x); + case OBJECT: + return transform((JsObjectLiteral) x); + case BOOLEAN: + return transform((JsBooleanLiteral) x); + case NULL: + return transform((JsNullLiteral) x); + case NUMBER: + return transform((JsNumberLiteral) x); + case REGEXP: + return transform((JsRegExp) x); + case STRING: + return transform((JsStringLiteral) x); + case THIS: + return transform((JsThisRef) x); + case NAME_OF: + return transform((JsNameOf) x); + case SEED_ID_OF: + return transform((JsSeedIdOf) x); + case NAME_REF: + return transform((JsNameRef) x); + case NEW: + return transform((JsNew) x); + case POSTFIX_OP: + return transform((JsPostfixOperation) x); + case PREFIX_OP: + return transform((JsPrefixOperation) x); + default: + throw new IllegalStateException("Unexpected expression type: " + + x.getClass().getSimpleName()); + } + } + + private Node transform(JsExprStmt x) { + // The GWT JS AST doesn't produce function declarations, instead + // they are expressions statements: + Node expr = transform(x.getExpression()); + if (!expr.isFunction()) { + return IR.exprResult(expr); + } else { + return expr; + } + } + + private Node transform(JsFor x) { + // The init expressions or var decl. + // + Node init; + if (x.getInitExpr() != null) { + init = transform(x.getInitExpr()); + } else if (x.getInitVars() != null) { + init = transform(x.getInitVars()); + } else { + init = IR.empty(); + } + + // The loop test. + // + Node cond; + if (x.getCondition() != null) { + cond = transform(x.getCondition()); + } else { + cond = IR.empty(); + } + + // The incr expression. + // + Node incr; + if (x.getIncrExpr() != null) { + incr = transform(x.getIncrExpr()); + } else { + incr = IR.empty(); + } + + Node body = transformBody(x.getBody(), x); + Node n = IR.forNode(init, cond, incr, body); + return applySourceInfo(n, x); + } + + private Node transform(JsForIn x) { + Node valueExpr; + if (x.getIterVarName() != null) { + valueExpr = new Node(Token.VAR, transformName(x.getIterVarName())); + } else { + // Just a name ref. + // + valueExpr = transform(x.getIterExpr()); + } + + Node n = IR.forIn(valueExpr, transform(x.getObjExpr()), transformBody(x.getBody(), x)); + return applySourceInfo(n, x); + } + + private Node transform(JsFunction x) { + Node name; + if (x.getName() != null) { + name = getNameNodeFor(x); + } else { + name = IR.name(""); + } + applySourceInfo(name, x); + + Node params = IR.paramList(); + for (Object element : x.getParameters()) { + JsParameter param = (JsParameter) element; + params.addChildToBack(transform(param)); + } + applySourceInfo(params, x); + + Node n = IR.function(name, params, transform(x.getBody())); + if (name.getString().isEmpty()) { + n.putProp(Node.ORIGINALNAME_PROP, ""); + } else { + applyOriginalName(n, x); + } + + /* + * if (x.isConstructor()) { JSDocInfoBuilder builder = new JSDocInfoBuilder(false); + * builder.recordConstructor(); n.setJSDocInfo(builder.build(n)); } + */ + + return applySourceInfo(n, x); + } + + private Node transform(JsIf x) { + Node n = IR.ifNode(transform(x.getIfExpr()), transformBody(x.getThenStmt(), x)); + if (x.getElseStmt() != null) { + n.addChildToBack(transformBody(x.getElseStmt(), x)); + } + return applySourceInfo(n, x); + } + + private Node transform(JsInvocation x) { + Node n = IR.call(transform(x.getQualifier())); + for (Object element : x.getArguments()) { + JsExpression arg = (JsExpression) element; + n.addChildToBack(transform(arg)); + } + return applySourceInfo(n, x); + } + + private Node transform(JsLabel x) { + Node n = IR.label(transformLabel(x.getName()), transform(x.getStmt())); + + return applySourceInfo(n, x); + } + + private Node transform(JsNameOf x) { + Node n = transformName(x.getName().getShortIdent(), x); + applyOriginalName(n, x); + return applySourceInfo(n, x); + } + + private Node transform(JsNameRef x) { + Node n; + JsName name = x.getName(); + boolean isExternal = name == null || !name.isObfuscatable(); + if (x.getQualifier() != null) { + n = IR.getprop(transform(x.getQualifier()), transformNameAsString(x.getShortIdent(), x)); + if (isExternal) { + this.externalProperties.add(x.getShortIdent()); + } + } else { + n = transformName(x.getShortIdent(), x); + if (isExternal) { + this.externalVars.add(x.getShortIdent()); + } else if (name.getEnclosing() == program.getScope()) { + this.globalVars.add(x.getShortIdent()); + } + } + applyOriginalName(n, x); + return applySourceInfo(n, x); + } + + private Node transform(JsNew x) { + Node n = IR.newNode(transform(x.getConstructorExpression())); + for (Object element : x.getArguments()) { + JsExpression arg = (JsExpression) element; + n.addChildToBack(transform(arg)); + } + return applySourceInfo(n, x); + } + + private Node transform(JsNullLiteral x) { + return IR.nullNode(); + } + + private Node transform(JsNumberLiteral x) { + return IR.number(x.getValue()); + } + + private Node transform(JsObjectLiteral x) { + Node n = IR.objectlit(); + + for (Object element : x.getPropertyInitializers()) { + JsPropertyInitializer propInit = (JsPropertyInitializer) element; + Node key; + if (propInit.getLabelExpr().getKind() == NodeKind.NUMBER) { + key = transformNumberAsString((JsNumberLiteral) propInit.getLabelExpr()); + key.putBooleanProp(Node.QUOTED_PROP, true); + } else if (propInit.getLabelExpr().getKind() == NodeKind.NAME_REF) { + key = + transformNameAsString(((JsNameRef) propInit.getLabelExpr()).getShortIdent(), propInit + .getLabelExpr()); + } else { + key = transform(propInit.getLabelExpr()); + } + Preconditions.checkState(key.isString(), key); + n.addChildToBack(IR.propdef(key, transform(propInit.getValueExpr()))); + } + return applySourceInfo(n, x); + } + + private Node transform(JsParameter x) { + return getNameNodeFor(x); + } + + private Node transform(JsPostfixOperation x) { + Node n = new Node(getTokenForOp(x.getOperator()), transform(x.getArg())); + n.putBooleanProp(Node.INCRDECR_PROP, true); + return applySourceInfo(n, x); + } + + private Node transform(JsPrefixOperation x) { + Node n = new Node(getTokenForOp(x.getOperator()), transform(x.getArg())); + return applySourceInfo(n, x); + } + + private Node transform(JsRegExp x) { + String flags = x.getFlags(); + Node n = + IR.regexp(Node.newString(x.getPattern()), Node.newString(flags != null ? x.getFlags() : "")); + return applySourceInfo(n, x); + } + + private Node transform(JsReturn x) { + Node n = IR.returnNode(); + JsExpression result = x.getExpr(); + if (result != null) { + n.addChildToBack(transform(x.getExpr())); + } + return applySourceInfo(n, x); + } + + private Node transform(JsSeedIdOf x) { + Node n = Node.newNumber(x.getSeedId()); + return applySourceInfo(n, x); + } + + private Node transform(JsStatement x) { + switch (x.getKind()) { + case BLOCK: + return transform((JsBlock) x); + case BREAK: + return transform((JsBreak) x); + case CONTINUE: + return transform((JsContinue) x); + case DEBUGGER: + return transform((JsDebugger) x); + case DO: + return transform((JsDoWhile) x); + case EMPTY: + return transform((JsEmpty) x); + case EXPR_STMT: + return transform((JsExprStmt) x); + case FOR: + return transform((JsFor) x); + case FOR_IN: + return transform((JsForIn) x); + case IF: + return transform((JsIf) x); + case LABEL: + return transform((JsLabel) x); + case RETURN: + return transform((JsReturn) x); + case SWITCH: + return transform((JsSwitch) x); + case THROW: + return transform((JsThrow) x); + case TRY: + return transform((JsTry) x); + case VARS: + return transform((JsVars) x); + case WHILE: + return transform((JsWhile) x); + default: + throw new IllegalStateException("Unexpected statement type: " + + x.getClass().getSimpleName()); + } + } + + private Node transform(JsStringLiteral x) { + return IR.string(x.getValue()); + } + + private Node transform(JsSwitch x) { + Node n = IR.switchNode(transform(x.getExpr())); + for (JsSwitchMember member : x.getCases()) { + n.addChildToBack(transform(member)); + } + return applySourceInfo(n, x); + } + + private Node transform(JsSwitchMember x) { + switch (x.getKind()) { + case CASE: + return transform((JsCase) x); + case DEFAULT: + return transform((JsDefault) x); + default: + throw new IllegalStateException("Unexpected switch member type: " + + x.getClass().getSimpleName()); + } + } + + private Node transform(JsThisRef x) { + Node n = new Node(Token.THIS); + return applySourceInfo(n, x); + } + + private Node transform(JsThrow x) { + Node n = IR.throwNode(transform(x.getExpr())); + return applySourceInfo(n, x); + } + + private Node transform(JsTry x) { + Node n = new Node(Token.TRY, transform(x.getTryBlock())); + + Node catches = new Node(Token.BLOCK); + for (JsCatch catchBlock : x.getCatches()) { + catches.addChildToBack(transform(catchBlock)); + } + n.addChildToBack(catches); + + JsBlock finallyBlock = x.getFinallyBlock(); + if (finallyBlock != null) { + n.addChildToBack(transform(finallyBlock)); + } + + return applySourceInfo(n, x); + } + + private Node transform(JsVar x) { + Node n = getNameNodeFor(x); + JsExpression initExpr = x.getInitExpr(); + if (initExpr != null) { + n.addChildToBack(transform(initExpr)); + } + return applySourceInfo(n, x); + } + + private Node transform(JsVars x) { + Node n = new Node(Token.VAR); + for (JsVar var : x) { + n.addChildToBack(transform(var)); + } + return applySourceInfo(n, x); + } + + private Node transform(JsWhile x) { + Node n = + IR.forNode(IR.empty(), transform(x.getCondition()), IR.empty(), transformBody(x.getBody(), + x)); + return applySourceInfo(n, x); + } + + private Node transformBody(JsStatement x, HasSourceInfo parent) { + Node n = transform(x); + if (!n.isBlock()) { + Node stmt = n; + n = IR.block(); + if (!stmt.isEmpty()) { + n.addChildToBack(stmt); + } + applySourceInfo(n, parent); + } + return n; + } + + private Node transformLabel(JsName label) { + Node n = IR.labelName(getName(label)); + return applySourceInfo(n, label.getStaticRef()); + } + + private Node transformLabel(JsNameRef label) { + Node n = IR.labelName(getName(label)); + return applySourceInfo(n, label); + } + + private Node transformName(JsName name) { + Node n = IR.name(getName(name)); + return applySourceInfo(n, name.getStaticRef()); + } + + private Node transformName(String name, HasSourceInfo info) { + Node n = IR.name(name); + return applySourceInfo(n, info); + } + + private Node transformNameAsString(String name, HasSourceInfo info) { + Node n = IR.string(name); + return applySourceInfo(n, info); + } + + private Node transformNumberAsString(JsNumberLiteral literalNode) { + Node irNode = Node.newString(getStringValue(literalNode.getValue())); + return irNode; + } +}
diff --git a/dev/core/src/com/google/gwt/dev/js/ClosureJsRunner.java b/dev/core/src/com/google/gwt/dev/js/ClosureJsRunner.java new file mode 100644 index 0000000..2bef925 --- /dev/null +++ b/dev/core/src/com/google/gwt/dev/js/ClosureJsRunner.java
@@ -0,0 +1,350 @@ +/* + * Copyright 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.gwt.dev.js; + +import com.google.gwt.dev.jjs.JsOutputOption; +import com.google.gwt.dev.js.ast.JsProgram; +import com.google.gwt.dev.js.ast.JsProgramFragment; +import com.google.gwt.thirdparty.guava.common.base.Preconditions; +import com.google.gwt.thirdparty.guava.common.base.Throwables; +import com.google.gwt.thirdparty.guava.common.collect.ImmutableList; +import com.google.gwt.thirdparty.guava.common.collect.Lists; +import com.google.gwt.thirdparty.guava.common.collect.Maps; +import com.google.gwt.thirdparty.guava.common.collect.Sets; +import com.google.gwt.thirdparty.guava.common.io.LimitInputStream; +import com.google.gwt.thirdparty.javascript.jscomp.CheckLevel; +import com.google.gwt.thirdparty.javascript.jscomp.Compiler; +import com.google.gwt.thirdparty.javascript.jscomp.CompilerInput; +import com.google.gwt.thirdparty.javascript.jscomp.CompilerOptions; +import com.google.gwt.thirdparty.javascript.jscomp.CompilerOptions.Reach; +import com.google.gwt.thirdparty.javascript.jscomp.DiagnosticGroups; +import com.google.gwt.thirdparty.javascript.jscomp.JSError; +import com.google.gwt.thirdparty.javascript.jscomp.JSModule; +import com.google.gwt.thirdparty.javascript.jscomp.JSSourceFile; +import com.google.gwt.thirdparty.javascript.jscomp.PropertyRenamingPolicy; +import com.google.gwt.thirdparty.javascript.jscomp.Result; +import com.google.gwt.thirdparty.javascript.jscomp.SourceAst; +import com.google.gwt.thirdparty.javascript.jscomp.VariableMap; +import com.google.gwt.thirdparty.javascript.jscomp.VariableRenamingPolicy; +import com.google.gwt.thirdparty.javascript.jscomp.WarningLevel; +import com.google.gwt.thirdparty.javascript.rhino.InputId; +import com.google.gwt.thirdparty.javascript.rhino.Node; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * A wrapper to simplify the interactions to the Closure Compiler + */ +public class ClosureJsRunner { + // The externs expected in externs.zip, in sorted order. + private static final List<String> DEFAULT_EXTERNS_NAMES = ImmutableList.of( + // JS externs + "es3.js", + "es5.js", + + // Event APIs + "w3c_event.js", "w3c_event3.js", + "gecko_event.js", + "ie_event.js", + "webkit_event.js", + + // DOM apis + "w3c_dom1.js", "w3c_dom2.js", "w3c_dom3.js", + "gecko_dom.js", + "ie_dom.js", + "webkit_dom.js", + + // CSS apis + "w3c_css.js", + "gecko_css.js", + "ie_css.js", + "webkit_css.js", + + // Top-level namespaces + "google.js", + + "deprecated.js", "fileapi.js", "flash.js", "gears_symbols.js", "gears_types.js", + "gecko_xml.js", "html5.js", "ie_vml.js", "iphone.js", "webstorage.js", "w3c_anim_timing.js", + "w3c_css3d.js", "w3c_elementtraversal.js", "w3c_geolocation.js", "w3c_indexeddb.js", + "w3c_navigation_timing.js", "w3c_range.js", "w3c_selectors.js", "w3c_xml.js", "window.js", + "webkit_notifications.js", "webgl.js"); + + /** + * @return a mutable list + * @throws IOException + */ + public static List<JSSourceFile> getDefaultExterns() throws IOException { + Class<ClosureJsRunner> clazz = ClosureJsRunner.class; + InputStream input = clazz.getResourceAsStream("/com/google/javascript/jscomp/externs.zip"); + if (input == null) { + /* + * HACK - the open source version of the closure compiler maps the resource into a different + * location. + */ + input = clazz.getResourceAsStream("/externs.zip"); + } + ZipInputStream zip = new ZipInputStream(input); + Map<String, JSSourceFile> externsMap = Maps.newHashMap(); + for (ZipEntry entry = null; (entry = zip.getNextEntry()) != null;) { + BufferedInputStream entryStream = + new BufferedInputStream(new LimitInputStream(zip, entry.getSize())); + externsMap.put(entry.getName(), JSSourceFile.fromInputStream( + // Give the files an odd prefix, so that they do not conflict + // with the user's files. + "externs.zip//" + entry.getName(), entryStream)); + } + + Preconditions.checkState(externsMap.keySet().equals(Sets.newHashSet(DEFAULT_EXTERNS_NAMES)), + "Externs zip must match our hard-coded list of externs."); + + // Order matters, so the resources must be added to the result list + // in the expected order. + List<JSSourceFile> externs = Lists.newArrayList(); + for (String key : DEFAULT_EXTERNS_NAMES) { + externs.add(externsMap.get(key)); + } + + return externs; + } + + private Compiler compiler = null; + private Set<String> externalProps = Sets.newHashSet(); + private Set<String> externalVars = Sets.newHashSet(); + + private Set<String> globalVars = Sets.newHashSet(); + + private final boolean validate = true; + + public ClosureJsRunner() { + } + + public void compile(JsProgram program, String[] js, JsOutputOption jsOutputOption) { + CompilerOptions options = getClosureCompilerOptions(jsOutputOption); + // Turn off Closure Compiler logging + Logger.getLogger("com.google.gwt.thirdparty.javascript.jscomp").setLevel(Level.OFF); + + // Create a fresh compiler instance. + compiler = new Compiler(); + + // Translate the ASTs and build the modules + List<JSModule> modules = createClosureModules(program); + + // Build the externs based on what we discovered building the modules. + List<JSSourceFile> externs = getClosureCompilerExterns(); + + Result result = compiler.compileModules(externs, modules, options); + if (result.success) { + int fragments = program.getFragmentCount(); + for (int i = 0; i < fragments; i++) { + int module = mapFragmentIndexToModuleIndex(fragments, i); + js[i] = compiler.toSource(modules.get(module)); + } + } else { + for (JSError error : result.errors) { + System.err.println("error optimizing:" + error.toString()); + throw new RuntimeException(error.description); + } + } + } + + protected List<JSSourceFile> getDefaultExternsList() { + List<JSSourceFile> defaultExterns; + try { + defaultExterns = getDefaultExterns(); + return defaultExterns; + } catch (IOException e) { + Throwables.propagate(e); + return null; + } + } + + private CompilerInput createClosureJsAst(JsProgram program, JsProgramFragment fragment, + String source) { + String inputName = source; + InputId inputId = new InputId(inputName); + ClosureJsAstTranslator translator = new ClosureJsAstTranslator(validate, program); + Node root = translator.translate(fragment, inputId, source); + globalVars.addAll(translator.getGlobalVariableNames()); + externalProps.addAll(translator.getExternalPropertyReferences()); + externalVars.addAll(translator.getExternalVariableReferences()); + SourceAst sourceAst = new ClosureJsAst(inputId, root); + CompilerInput input = new CompilerInput(sourceAst, false); + return input; + } + + private JSModule createClosureModule(JsProgram program, JsProgramFragment fragment, String source) { + JSModule module = new JSModule(source); + module.add(createClosureJsAst(program, fragment, source)); + return module; + } + + private List<JSModule> createClosureModules(JsProgram program) { + int fragments = program.getFragmentCount(); + JSModule[] modules = new JSModule[fragments]; + + for (int i = 0; i < fragments; i++) { + modules[mapFragmentIndexToModuleIndex(fragments, i)] = + createClosureModule(program, program.getFragment(i), "module" + i); + } + if (fragments > 1) { + // + // The fragments are expected in a specific order: + // init, split-1, split-2, ..., + // where the leftovers are dependent on the init module + // and the split modules are dependent on the leftovers + JSModule init = modules[0]; + JSModule leftovers = modules[1]; + leftovers.addDependency(init); + for (int i = 2; i < modules.length; i++) { + Preconditions.checkNotNull(modules[i], "Module: ", i); + modules[i].addDependency(leftovers); + } + } + modules[0].add(JSSourceFile.fromCode("hack", "window['gwtOnLoad'] = gwtOnLoad;\n")); + + return Arrays.asList(modules); + } + + private List<JSSourceFile> getClosureCompilerExterns() { + List<JSSourceFile> externs = getDefaultExternsList(); + externs.add(JSSourceFile.fromCode("gwt_externs", + + "var gwtOnLoad;\n" + "var $entry;\n" + " var $gwt_version;\n" + " var $wnd;\n" + + " var $doc;\n" + " var $moduleName\n" + " var $moduleBase;\n" + + " var $strongName;\n" + " var $stats;\n" + " var $sessionId;\n" + + " window.prototype.__gwtStatsEvent;\n" + " window.prototype.__gwtStatsSessionId;\n" + + " window.prototype.moduleName;\n" + " window.prototype.sessionId;\n" + + " window.prototype.subSystem;\n" + " window.prototype.evtGroup;\n" + + " window.prototype.millis;\n" + " window.prototype.type;\n" + + " window.prototype.$h;\n" + "\n")); + + // Generate externs + String generatedExterns = "var gwt_externs;\n"; + for (String prop : this.externalProps) { + generatedExterns += "gwt_externs." + prop + ";\n"; + } + + for (String var : this.externalVars) { + generatedExterns += "var " + var + ";\n"; + } + + externs.add(JSSourceFile.fromCode("gwt_generated_externs", generatedExterns)); + + return externs; + } + + private CompilerOptions getClosureCompilerOptions(JsOutputOption jsOutputOption) { + CompilerOptions options = new CompilerOptions(); + WarningLevel.QUIET.setOptionsForWarningLevel(options); + + // Basically, use CompilationLevel.ADVANCED_OPTIMIZATIONS: + + // Build an identity map of variable names to prevent GWT names from + // being renamed while allowing new global variables to be renamed. + HashMap<String, String> varNames = new HashMap<String, String>(); + for (String var : globalVars) { + varNames.put(var, var); + } + options.inputVariableMapSerialized = VariableMap.fromMap(varNames).toBytes(); + if (jsOutputOption == JsOutputOption.OBFUSCATED) { + options.setRenamingPolicy(VariableRenamingPolicy.ALL, PropertyRenamingPolicy.OFF); + options.prettyPrint = false; + // This can help debug renaming policy changes. + // options.generatePseudoNames = true; + } else { + options.setRenamingPolicy(VariableRenamingPolicy.OFF, PropertyRenamingPolicy.OFF); + options.prettyPrint = true; + } + + // All the safe optimizations. + options.closurePass = true; + options.foldConstants = true; + options.coalesceVariableNames = true; + options.deadAssignmentElimination = true; + options.extractPrototypeMemberDeclarations = true; + options.collapseVariableDeclarations = true; + options.convertToDottedProperties = true; + options.rewriteFunctionExpressions = true; + options.labelRenaming = true; + options.removeDeadCode = true; + options.optimizeArgumentsArray = true; + options.collapseObjectLiterals = true; + options.setShadowVariables(true); + + // All the advance optimizations. + options.reserveRawExports = true; + options.removeUnusedPrototypeProperties = true; + options.collapseAnonymousFunctions = true; + options.smartNameRemoval = true; // ? + options.inlineConstantVars = true; + options.setInlineFunctions(Reach.ALL); + options.inlineGetters = true; + options.setInlineVariables(Reach.ALL); + options.flowSensitiveInlineVariables = true; + options.computeFunctionSideEffects = true; + // Remove unused vars also removes unused functions. + options.setRemoveUnusedVariable(Reach.ALL); + options.optimizeParameters = true; + options.optimizeReturns = true; + options.optimizeCalls = true; + + // Maybe turn these off as well + options.collapseProperties = true; // ? + options.crossModuleCodeMotion = true; // ? + options.crossModuleMethodMotion = true; // ? + options.devirtualizePrototypeMethods = true; // ? + + // Advanced optimization, disabled + options.setRemoveClosureAsserts(false); + options.aliasKeywords = false; + options.removeUnusedPrototypePropertiesInExterns = false; + options.checkGlobalThisLevel = CheckLevel.OFF; + options.rewriteFunctionExpressions = false; // Performance hit + + // Kindly tell the user that they have JsDocs that we don't understand. + options.setWarningLevel(DiagnosticGroups.NON_STANDARD_JSDOC, CheckLevel.OFF); + + return options; + } + + private int mapFragmentIndexToModuleIndex(int fragments, int index) { + // + // The fragments are expected in a specific order: + // init, split-1, split-2, ..., + // where the leftovers are dependent on the init module + // and the split modules are dependent on the leftovers + // + // However, Closure Compiler modules must be in dependency order + // + if (index == 0) { + return 0; + } else if (index == fragments - 1) { + return 1; + } else { + return index + 1; + } + } +}
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/CanBooleanEval.java b/dev/core/src/com/google/gwt/dev/js/ast/CanBooleanEval.java index b42b3ee..2ce408d 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/CanBooleanEval.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/CanBooleanEval.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/HasArguments.java b/dev/core/src/com/google/gwt/dev/js/ast/HasArguments.java index 8e4122f..c58477e 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/HasArguments.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/HasArguments.java
@@ -1,16 +1,14 @@ /* * Copyright 2007 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/HasCondition.java b/dev/core/src/com/google/gwt/dev/js/ast/HasCondition.java index fd21feb..2d49acf 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/HasCondition.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/HasCondition.java
@@ -1,16 +1,14 @@ /* * Copyright 2007 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/HasName.java b/dev/core/src/com/google/gwt/dev/js/ast/HasName.java index 86853a1..86273cb 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/HasName.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/HasName.java
@@ -1,16 +1,14 @@ /* * Copyright 2007 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsArrayAccess.java b/dev/core/src/com/google/gwt/dev/js/ast/JsArrayAccess.java index 5ab9e27..368a591 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsArrayAccess.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsArrayAccess.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -30,8 +28,7 @@ super(sourceInfo); } - public JsArrayAccess(SourceInfo sourceInfo, JsExpression arrayExpr, - JsExpression indexExpr) { + public JsArrayAccess(SourceInfo sourceInfo, JsExpression arrayExpr, JsExpression indexExpr) { super(sourceInfo); this.arrayExpr = arrayExpr; this.indexExpr = indexExpr; @@ -46,6 +43,11 @@ } @Override + public NodeKind getKind() { + return NodeKind.ARRAY_ACCESS; + } + + @Override public boolean hasSideEffects() { return arrayExpr.hasSideEffects() || indexExpr.hasSideEffects(); } @@ -68,6 +70,7 @@ this.indexExpr = indexExpr; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { arrayExpr = v.accept(arrayExpr);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsArrayLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsArrayLiteral.java index 8c83b23..dc04ee0 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsArrayLiteral.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsArrayLiteral.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -36,6 +34,11 @@ } @Override + public NodeKind getKind() { + return NodeKind.ARRAY; + } + + @Override public boolean hasSideEffects() { for (JsExpression expr : exprs) { if (expr.hasSideEffects()) { @@ -45,10 +48,12 @@ return false; } + @Override public boolean isBooleanFalse() { return false; } + @Override public boolean isBooleanTrue() { return true; } @@ -63,6 +68,7 @@ return false; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { v.acceptWithInsertRemove(exprs);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperation.java b/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperation.java index 6018e3a..2cfb1d7 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperation.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperation.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -32,8 +30,8 @@ this(sourceInfo, op, null, null); } - public JsBinaryOperation(SourceInfo sourceInfo, JsBinaryOperator op, - JsExpression arg1, JsExpression arg2) { + public JsBinaryOperation(SourceInfo sourceInfo, JsBinaryOperator op, JsExpression arg1, + JsExpression arg2) { super(sourceInfo); this.op = op; this.arg1 = arg1; @@ -48,6 +46,11 @@ return arg2; } + @Override + public NodeKind getKind() { + return NodeKind.BINARY_OP; + } + public JsBinaryOperator getOperator() { return op; } @@ -104,6 +107,7 @@ this.arg2 = arg2; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { if (op.isAssignment()) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperator.java b/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperator.java index 5cac60d..36c4689 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperator.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperator.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -21,30 +19,25 @@ public enum JsBinaryOperator implements JsOperator { /* - * Precedence indices from "JavaScript - The Definitive Guide" 4th Edition - * (page 57) + * 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 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), + 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), + 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), + 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), + EQ("==", 9, LEFT | INFIX), NEQ("!=", 9, LEFT | INFIX), REF_EQ("===", 9, LEFT | INFIX), REF_NEQ( + "!==", 9, LEFT | INFIX), BIT_AND("&", 8, LEFT | INFIX), @@ -59,10 +52,10 @@ // 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), + 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); @@ -78,42 +71,49 @@ 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? + * 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; }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsBlock.java b/dev/core/src/com/google/gwt/dev/js/ast/JsBlock.java index e7de0ed..fc95ff4 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsBlock.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsBlock.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -31,6 +29,11 @@ super(sourceInfo); } + @Override + public NodeKind getKind() { + return NodeKind.BLOCK; + } + public List<JsStatement> getStatements() { return stmts; } @@ -39,6 +42,7 @@ return false; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { v.acceptWithInsertRemove(stmts);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsBooleanLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsBooleanLiteral.java index 24fc9c1..9545e0b 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsBooleanLiteral.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsBooleanLiteral.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -23,11 +21,9 @@ */ public final class JsBooleanLiteral extends JsValueLiteral { - public static final JsBooleanLiteral FALSE = new JsBooleanLiteral( - SourceOrigin.UNKNOWN, false); + public static final JsBooleanLiteral FALSE = new JsBooleanLiteral(SourceOrigin.UNKNOWN, false); - public static final JsBooleanLiteral TRUE = new JsBooleanLiteral( - SourceOrigin.UNKNOWN, true); + public static final JsBooleanLiteral TRUE = new JsBooleanLiteral(SourceOrigin.UNKNOWN, true); public static JsBooleanLiteral get(boolean value) { return value ? TRUE : FALSE; @@ -40,14 +36,21 @@ this.value = value; } + @Override + public NodeKind getKind() { + return NodeKind.BOOLEAN; + } + public boolean getValue() { return value; } + @Override public boolean isBooleanFalse() { return value == false; } + @Override public boolean isBooleanTrue() { return value == true; } @@ -62,6 +65,7 @@ return false; } + @Override public void traverse(JsVisitor v, JsContext ctx) { v.visit(this, ctx); v.endVisit(this, ctx);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsBreak.java b/dev/core/src/com/google/gwt/dev/js/ast/JsBreak.java index 17e7d1b..804db5f 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsBreak.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsBreak.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -33,10 +31,16 @@ this.label = label; } + @Override + public NodeKind getKind() { + return NodeKind.BREAK; + } + public JsNameRef getLabel() { return label; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { if (label != null) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsCase.java b/dev/core/src/com/google/gwt/dev/js/ast/JsCase.java index b7e267e..a6c8490 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsCase.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsCase.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -32,10 +30,16 @@ return caseExpr; } + @Override + public NodeKind getKind() { + return NodeKind.CASE; + } + 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);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsCatch.java b/dev/core/src/com/google/gwt/dev/js/ast/JsCatch.java index 5a932cd..ae24484 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsCatch.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsCatch.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -41,10 +39,16 @@ return body; } + @Override public JsExpression getCondition() { return condition; } + @Override + public NodeKind getKind() { + return NodeKind.BREAK; + } + public JsParameter getParameter() { return param; } @@ -57,10 +61,12 @@ 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);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsCatchScope.java b/dev/core/src/com/google/gwt/dev/js/ast/JsCatchScope.java index 542d398..fdfba9d 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsCatchScope.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsCatchScope.java
@@ -1,16 +1,14 @@ /* * Copyright 2007 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -19,8 +17,8 @@ import java.util.Iterator; /** - * A special scope used only for catch blocks. It only holds a single symbol: - * the catch argument's name. + * A special scope used only for catch blocks. It only holds a single symbol: the catch argument's + * name. */ public class JsCatchScope extends JsNestingScope {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsConditional.java b/dev/core/src/com/google/gwt/dev/js/ast/JsConditional.java index 2d2c213..454fe8c 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsConditional.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsConditional.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -32,8 +30,8 @@ super(sourceInfo); } - public JsConditional(SourceInfo sourceInfo, JsExpression testExpr, - JsExpression thenExpr, JsExpression elseExpr) { + public JsConditional(SourceInfo sourceInfo, JsExpression testExpr, JsExpression thenExpr, + JsExpression elseExpr) { super(sourceInfo); this.testExpr = testExpr; this.thenExpr = thenExpr; @@ -44,6 +42,11 @@ return elseExpr; } + @Override + public NodeKind getKind() { + return NodeKind.CONDITIONAL; + } + public JsExpression getTestExpression() { return testExpr; } @@ -54,8 +57,7 @@ @Override public boolean hasSideEffects() { - return testExpr.hasSideEffects() || thenExpr.hasSideEffects() - || elseExpr.hasSideEffects(); + return testExpr.hasSideEffects() || thenExpr.hasSideEffects() || elseExpr.hasSideEffects(); } @Override @@ -80,6 +82,7 @@ this.thenExpr = thenExpr; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { testExpr = v.accept(testExpr);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsContext.java b/dev/core/src/com/google/gwt/dev/js/ast/JsContext.java index 503538d..ddb1d2c 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsContext.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsContext.java
@@ -1,24 +1,21 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.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. + * 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 {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsContinue.java b/dev/core/src/com/google/gwt/dev/js/ast/JsContinue.java index 2e7490f..ad030a7 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsContinue.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsContinue.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -33,10 +31,16 @@ this.label = label; } + @Override + public NodeKind getKind() { + return NodeKind.CONTINUE; + } + public JsNameRef getLabel() { return label; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { if (label != null) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsDebugger.java b/dev/core/src/com/google/gwt/dev/js/ast/JsDebugger.java index 1cef5a7..2c65e11 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsDebugger.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsDebugger.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -26,9 +24,14 @@ super(sourceInfo); } + @Override + public NodeKind getKind() { + return NodeKind.DEBUGGER; + } + + @Override public void traverse(JsVisitor v, JsContext ctx) { v.visit(this, ctx); v.endVisit(this, ctx); } - }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsDefault.java b/dev/core/src/com/google/gwt/dev/js/ast/JsDefault.java index f81ddf4..06dc3eb 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsDefault.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsDefault.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -26,6 +24,12 @@ super(sourceInfo); } + @Override + public NodeKind getKind() { + return NodeKind.DEFAULT; + } + + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { v.acceptWithInsertRemove(stmts);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsDoWhile.java b/dev/core/src/com/google/gwt/dev/js/ast/JsDoWhile.java index 3c75fdb..03e65c6 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsDoWhile.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsDoWhile.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -30,8 +28,7 @@ super(sourceInfo); } - public JsDoWhile(SourceInfo sourceInfo, JsExpression condition, - JsStatement body) { + public JsDoWhile(SourceInfo sourceInfo, JsExpression condition, JsStatement body) { super(sourceInfo); this.condition = condition; this.body = body; @@ -45,6 +42,11 @@ return condition; } + @Override + public NodeKind getKind() { + return NodeKind.DO; + } + public void setBody(JsStatement body) { this.body = body; } @@ -53,6 +55,7 @@ this.condition = condition; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { body = v.accept(body);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsEmpty.java b/dev/core/src/com/google/gwt/dev/js/ast/JsEmpty.java index 4727008..b122f7c 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsEmpty.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsEmpty.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -26,9 +24,14 @@ super(sourceInfo); } + @Override + public NodeKind getKind() { + return NodeKind.EMPTY; + } + + @Override public void traverse(JsVisitor v, JsContext ctx) { v.visit(this, ctx); v.endVisit(this, ctx); } - }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsExprStmt.java b/dev/core/src/com/google/gwt/dev/js/ast/JsExprStmt.java index 9bdd74d..154ee69 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsExprStmt.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsExprStmt.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -33,6 +31,12 @@ return expr; } + @Override + public NodeKind getKind() { + return NodeKind.EXPR_STMT; + } + + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { expr = v.accept(expr);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsExpression.java b/dev/core/src/com/google/gwt/dev/js/ast/JsExpression.java index 83d5cda..c79373c 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsExpression.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsExpression.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -42,9 +40,8 @@ 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. + * 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.
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsFor.java b/dev/core/src/com/google/gwt/dev/js/ast/JsFor.java index 2703d0f..f2c21da 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsFor.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsFor.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -18,15 +16,14 @@ import com.google.gwt.dev.jjs.SourceInfo; /** - * A <code>for</code> 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. + * A <code>for</code> 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. * * <p> - * Note that any of the parts of the <code>for</code> loop header can be - * <code>null</code>, although the body will never be null. + * Note that any of the parts of the <code>for</code> loop header can be <code>null</code>, although + * the body will never be null. */ public class JsFor extends JsStatement { @@ -64,6 +61,11 @@ return initVars; } + @Override + public NodeKind getKind() { + return NodeKind.FOR; + } + public void setBody(JsStatement body) { this.body = body; } @@ -84,6 +86,7 @@ this.initVars = initVars; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { assert (!(initExpr != null && initVars != null));
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsForIn.java b/dev/core/src/com/google/gwt/dev/js/ast/JsForIn.java index c73a56e..c829f46 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsForIn.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsForIn.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -52,6 +50,11 @@ return iterVarName; } + @Override + public NodeKind getKind() { + return NodeKind.FOR_IN; + } + public JsExpression getObjExpr() { return objExpr; } @@ -68,6 +71,7 @@ this.objExpr = objExpr; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { if (iterExpr != null) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsFunction.java b/dev/core/src/com/google/gwt/dev/js/ast/JsFunction.java index 74f211f..b4b4454 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsFunction.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsFunction.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -60,8 +58,7 @@ /** * Creates a named function, possibly derived from Java source. */ - public JsFunction(SourceInfo sourceInfo, JsScope parent, JsName name, - boolean fromJava) { + public JsFunction(SourceInfo sourceInfo, JsScope parent, JsName name, boolean fromJava) { super(sourceInfo); assert (parent != null); this.fromJava = fromJava; @@ -76,9 +73,8 @@ } /** - * 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. + * 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; @@ -88,6 +84,12 @@ return impliedExecute; } + @Override + public NodeKind getKind() { + return NodeKind.FUNCTION; + } + + @Override public JsName getName() { return name; } @@ -110,10 +112,12 @@ return artificiallyRescued; } + @Override public boolean isBooleanFalse() { return false; } + @Override public boolean isBooleanTrue() { return true; } @@ -165,6 +169,7 @@ this.trace = true; } + @Override public void traverse(JsVisitor v, JsContext ctx) { String before = null; if (trace && v instanceof JsModVisitor) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsGlobalBlock.java b/dev/core/src/com/google/gwt/dev/js/ast/JsGlobalBlock.java index f6dfb25..d087132 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsGlobalBlock.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsGlobalBlock.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsIf.java b/dev/core/src/com/google/gwt/dev/js/ast/JsIf.java index 7f4bdfd..b7c2f58 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsIf.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsIf.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -32,8 +30,7 @@ super(sourceInfo); } - public JsIf(SourceInfo sourceInfo, JsExpression ifExpr, JsStatement thenStmt, - JsStatement elseStmt) { + public JsIf(SourceInfo sourceInfo, JsExpression ifExpr, JsStatement thenStmt, JsStatement elseStmt) { super(sourceInfo); this.ifExpr = ifExpr; this.thenStmt = thenStmt; @@ -48,6 +45,11 @@ return ifExpr; } + @Override + public NodeKind getKind() { + return NodeKind.IF; + } + public JsStatement getThenStmt() { return thenStmt; } @@ -64,6 +66,7 @@ this.thenStmt = thenStmt; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { ifExpr = v.accept(ifExpr); @@ -77,10 +80,8 @@ @Override public boolean unconditionalControlBreak() { - boolean thenBreaks = thenStmt != null - && thenStmt.unconditionalControlBreak(); - boolean elseBreaks = elseStmt != null - && elseStmt.unconditionalControlBreak(); + boolean thenBreaks = thenStmt != null && thenStmt.unconditionalControlBreak(); + boolean elseBreaks = elseStmt != null && elseStmt.unconditionalControlBreak(); if (thenBreaks && elseBreaks) { // both branches have an unconditional break return true;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsInvocation.java b/dev/core/src/com/google/gwt/dev/js/ast/JsInvocation.java index 2a7bd56..213f853 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsInvocation.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsInvocation.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -33,10 +31,16 @@ super(sourceInfo); } + @Override public List<JsExpression> getArguments() { return args; } + @Override + public NodeKind getKind() { + return NodeKind.INVOKE; + } + public JsExpression getQualifier() { return qualifier; } @@ -60,6 +64,7 @@ this.qualifier = qualifier; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { qualifier = v.accept(qualifier);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsLabel.java b/dev/core/src/com/google/gwt/dev/js/ast/JsLabel.java index 85a8fb7..ca0a920 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsLabel.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsLabel.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -31,6 +29,12 @@ this.label = label; } + @Override + public NodeKind getKind() { + return NodeKind.LABEL; + } + + @Override public JsName getName() { return label; } @@ -43,6 +47,7 @@ this.stmt = stmt; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { stmt = v.accept(stmt);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsLiteral.java index 6fc345d..9fdb8ce 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsLiteral.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsLiteral.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsModVisitor.java b/dev/core/src/com/google/gwt/dev/js/ast/JsModVisitor.java index 4577c96..fe78950 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsModVisitor.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsModVisitor.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -31,36 +29,43 @@ 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, (T) node); didChange = true; } + @Override public void insertBefore(JsVisitable node) { checkRemoved(); collection.add(index++, (T) 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); @@ -102,30 +107,37 @@ 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 InternalCompilerException("Node was already replaced"); @@ -143,14 +155,12 @@ } } - protected static void checkReplacement(JsVisitable origNode, - JsVisitable newNode) { + protected static void checkReplacement(JsVisitable origNode, JsVisitable newNode) { if (newNode == null) { throw new InternalCompilerException("Cannot replace with null"); } if (newNode == origNode) { - throw new InternalCompilerException( - "The replacement is the same as the original"); + throw new InternalCompilerException("The replacement is the same as the original"); } } @@ -183,8 +193,7 @@ } @Override - protected <T extends JsVisitable> void doAcceptWithInsertRemove( - List<T> collection) { + protected <T extends JsVisitable> void doAcceptWithInsertRemove(List<T> collection) { new ListContext<T>().traverse(collection); }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsName.java b/dev/core/src/com/google/gwt/dev/js/ast/JsName.java index 2c224d4..460b53e 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsName.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsName.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNameOf.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNameOf.java index 27d7e67..74439f0 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsNameOf.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNameOf.java
@@ -1,16 +1,14 @@ /* * Copyright 2009 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -23,13 +21,18 @@ public class JsNameOf extends JsExpression { private final JsName name; + public JsNameOf(SourceInfo info, HasName node) { + this(info, node.getName()); + } + public JsNameOf(SourceInfo info, JsName name) { super(info); this.name = name; } - public JsNameOf(SourceInfo info, HasName node) { - this(info, node.getName()); + @Override + public NodeKind getKind() { + return NodeKind.NAME_OF; } public JsName getName() { @@ -52,6 +55,7 @@ return false; } + @Override public void traverse(JsVisitor visitor, JsContext ctx) { if (visitor.visit(this, ctx)) { }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNameRef.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNameRef.java index c1e51c3..1845feb 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsNameRef.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNameRef.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -21,8 +19,7 @@ /** * Represents a JavaScript expression that references a name. */ -public final class JsNameRef extends JsExpression implements CanBooleanEval, - HasName { +public final class JsNameRef extends JsExpression implements CanBooleanEval, HasName { private String ident; private JsName name; @@ -42,6 +39,12 @@ return (name == null) ? ident : name.getIdent(); } + @Override + public NodeKind getKind() { + return NodeKind.NAME_REF; + } + + @Override public JsName getName() { return name; } @@ -66,10 +69,12 @@ return qualifier.hasSideEffects(); } + @Override public boolean isBooleanFalse() { return isDefinitelyNull(); } + @Override public boolean isBooleanTrue() { return false; } @@ -107,6 +112,7 @@ this.qualifier = qualifier; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { if (qualifier != null) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNestingScope.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNestingScope.java index 7c148e7..ce8ade3 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsNestingScope.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNestingScope.java
@@ -1,16 +1,14 @@ /* * Copyright 2011 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -25,8 +23,7 @@ public abstract class JsNestingScope extends JsScope { /** - * Transient because children will add themselves to the parent after - * deserialization. + * Transient because children will add themselves to the parent after deserialization. */ private transient List<JsScope> children = Lists.create(); @@ -51,8 +48,7 @@ } /** - * Returns the parent scope of this scope, or <code>null</code> if this is the - * root scope. + * Returns the parent scope of this scope, or <code>null</code> if this is the root scope. */ @Override public final JsScope getParent() {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java index 6bed072..f229988 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -34,6 +32,7 @@ this.ctorExpr = ctorExpr; } + @Override public List<JsExpression> getArguments() { return args; } @@ -43,6 +42,11 @@ } @Override + public NodeKind getKind() { + return NodeKind.NEW; + } + + @Override public boolean hasSideEffects() { return true; } @@ -59,6 +63,7 @@ return false; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { ctorExpr = v.accept(ctorExpr);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNode.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNode.java index d1837cd..30b93fc 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsNode.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNode.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -26,8 +24,7 @@ /** * Base class for all JS AST elements. */ -public abstract class JsNode implements JsVisitable, HasSourceInfo, - Serializable { +public abstract class JsNode implements JsVisitable, HasSourceInfo, Serializable { private SourceInfo sourceInfo; @@ -36,6 +33,9 @@ this.sourceInfo = sourceInfo; } + public abstract NodeKind getKind(); + + @Override public SourceInfo getSourceInfo() { return sourceInfo; } @@ -53,15 +53,13 @@ } /** - * Returns a source code representation of the node using short or long - * identifiers. + * Returns a source code representation of the node using short or long identifiers. * * @param useLongIdents if true, emit all identifiers in long form */ public final String toSource(boolean useLongIdents) { DefaultTextOutput out = new DefaultTextOutput(false); - JsSourceGenerationVisitor v = new JsSourceGenerationVisitor(out, - useLongIdents); + JsSourceGenerationVisitor v = new JsSourceGenerationVisitor(out, useLongIdents); v.accept(this); return out.toString(); }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNormalScope.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNormalScope.java index c27a734..3e54ee6 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsNormalScope.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNormalScope.java
@@ -1,16 +1,14 @@ /* * Copyright 2011 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -57,8 +55,7 @@ } /** - * Attempts to find the name object for the specified ident, searching in this - * scope only. + * Attempts to find the name object for the specified ident, searching in this scope only. * * @return <code>null</code> if the identifier has no associated name */
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNullLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNullLiteral.java index 2774635..5661f72 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsNullLiteral.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNullLiteral.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -23,17 +21,23 @@ */ public final class JsNullLiteral extends JsValueLiteral { - public static final JsNullLiteral INSTANCE = new JsNullLiteral( - SourceOrigin.UNKNOWN); + public static final JsNullLiteral INSTANCE = new JsNullLiteral(SourceOrigin.UNKNOWN); private JsNullLiteral(SourceInfo sourceInfo) { super(sourceInfo); } + @Override + public NodeKind getKind() { + return NodeKind.NULL; + } + + @Override public boolean isBooleanFalse() { return true; } + @Override public boolean isBooleanTrue() { return false; } @@ -48,14 +52,15 @@ return true; } + @Override public void traverse(JsVisitor v, JsContext ctx) { v.visit(this, ctx); v.endVisit(this, ctx); } /** - * Note, if this ever becomes not-a-singleton, we'll need to check the - * SourceInfo == SourceOrigin.UNKNOWN. + * Note, if this ever becomes not-a-singleton, we'll need to check the SourceInfo == + * SourceOrigin.UNKNOWN. */ private Object readResolve() { return INSTANCE;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNumberLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNumberLiteral.java index df3508c..abf88e4 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsNumberLiteral.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNumberLiteral.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -29,14 +27,21 @@ this.value = value; } + @Override + public NodeKind getKind() { + return NodeKind.NUMBER; + } + public double getValue() { return value; } + @Override public boolean isBooleanFalse() { return value == 0.0; } + @Override public boolean isBooleanTrue() { return value != 0.0; } @@ -51,6 +56,7 @@ return false; } + @Override public void traverse(JsVisitor v, JsContext ctx) { v.visit(this, ctx); v.endVisit(this, ctx);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java index 3b3fcfc..e7e12e6 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -31,6 +29,11 @@ super(sourceInfo); } + @Override + public NodeKind getKind() { + return NodeKind.OBJECT; + } + public List<JsPropertyInitializer> getPropertyInitializers() { return props; } @@ -45,10 +48,12 @@ return false; } + @Override public boolean isBooleanFalse() { return false; } + @Override public boolean isBooleanTrue() { return true; } @@ -63,6 +68,7 @@ return false; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { v.acceptWithInsertRemove(props);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsOperator.java b/dev/core/src/com/google/gwt/dev/js/ast/JsOperator.java index 543b6c5..d321f85 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsOperator.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsOperator.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -40,5 +38,6 @@ boolean isValidPrefix(); + @Override String toString(); }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsParameter.java b/dev/core/src/com/google/gwt/dev/js/ast/JsParameter.java index 603b3e4..e0f8575 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsParameter.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsParameter.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -30,10 +28,17 @@ name.setStaticRef(this); } + @Override + public NodeKind getKind() { + return NodeKind.PARAMETER; + } + + @Override public JsName getName() { return name; } + @Override public void traverse(JsVisitor v, JsContext ctx) { v.visit(this, ctx); v.endVisit(this, ctx);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsPostfixOperation.java b/dev/core/src/com/google/gwt/dev/js/ast/JsPostfixOperation.java index 648bf15..c25ff93 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsPostfixOperation.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsPostfixOperation.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -26,12 +24,16 @@ this(sourceInfo, op, null); } - public JsPostfixOperation(SourceInfo sourceInfo, JsUnaryOperator op, - JsExpression arg) { + public JsPostfixOperation(SourceInfo sourceInfo, JsUnaryOperator op, JsExpression arg) { super(sourceInfo, op, arg); } @Override + public NodeKind getKind() { + return NodeKind.POSTFIX_OP; + } + + @Override public boolean isDefinitelyNotNull() { return true; }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsPrefixOperation.java b/dev/core/src/com/google/gwt/dev/js/ast/JsPrefixOperation.java index bc813db..14fe16e 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsPrefixOperation.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsPrefixOperation.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -20,33 +18,36 @@ /** * A JavaScript prefix operation. */ -public final class JsPrefixOperation extends JsUnaryOperation implements - CanBooleanEval { +public final class JsPrefixOperation extends JsUnaryOperation implements CanBooleanEval { public JsPrefixOperation(SourceInfo sourceInfo, JsUnaryOperator op) { this(sourceInfo, op, null); } - public JsPrefixOperation(SourceInfo sourceInfo, JsUnaryOperator op, - JsExpression arg) { + public JsPrefixOperation(SourceInfo sourceInfo, JsUnaryOperator op, JsExpression arg) { super(sourceInfo, op, arg); } + @Override + public NodeKind getKind() { + return NodeKind.PREFIX_OP; + } + + @Override public boolean isBooleanFalse() { if (getOperator() == JsUnaryOperator.VOID) { return true; } - if (getOperator() == JsUnaryOperator.NOT - && getArg() instanceof CanBooleanEval) { + 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) { + if (getOperator() == JsUnaryOperator.NOT && getArg() instanceof CanBooleanEval) { CanBooleanEval eval = (CanBooleanEval) getArg(); return eval.isBooleanFalse(); }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java b/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java index db4358d..a1805bb 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -44,15 +42,9 @@ /** * Constructs a JavaScript program object. - * - * @param soycEnabled Controls whether or not SourceInfo nodes created via the - * JsProgram will record descendant information. Enabling this - * feature will collect extra data during the compilation cycle, but - * at a cost of memory and object allocations. */ public JsProgram(CorrelationFactory correlator) { - super(correlator.makeSourceInfo(SourceOrigin.create(0, - JsProgram.class.getName()))); + super(correlator.makeSourceInfo(SourceOrigin.create(0, JsProgram.class.getName()))); this.correlator = correlator; @@ -61,10 +53,8 @@ setFragmentCount(1); } - public SourceInfo createSourceInfo(int startPos, int endPos, int startLine, - String fileName) { - return correlator.makeSourceInfo(SourceOrigin.create(startPos, endPos, - startLine, fileName)); + public SourceInfo createSourceInfo(int startPos, int endPos, int startLine, String fileName) { + return correlator.makeSourceInfo(SourceOrigin.create(startPos, endPos, startLine, fileName)); } public SourceInfo createSourceInfo(int lineNumber, String location) { @@ -75,6 +65,13 @@ return createSourceInfo(0, caller.getName()); } + public JsProgramFragment getFragment(int fragment) { + if (fragment < 0 || fragment >= fragments.length) { + throw new IllegalArgumentException("Invalid fragment: " + fragment); + } + return fragments[fragment]; + } + public JsBlock getFragmentBlock(int fragment) { if (fragment < 0 || fragment >= fragments.length) { throw new IllegalArgumentException("Invalid fragment: " + fragment); @@ -97,13 +94,17 @@ return indexedFunctions.get(name); } + @Override + public NodeKind getKind() { + return NodeKind.PROGRAM; + } + public JsScope getObjectScope() { return objectScope; } /** - * Gets the top level scope. This is the scope of all the statements in the - * main program. + * Gets the top level scope. This is the scope of all the statements in the main program. */ public JsScope getScope() { return topScope; @@ -112,8 +113,7 @@ public void setFragmentCount(int fragments) { this.fragments = new JsProgramFragment[fragments]; for (int i = 0; i < fragments; i++) { - this.fragments[i] = new JsProgramFragment( - createSourceInfoSynthetic(JsProgram.class)); + this.fragments[i] = new JsProgramFragment(createSourceInfoSynthetic(JsProgram.class)); } } @@ -122,6 +122,7 @@ this.indexedFunctions.putAll(indexedFunctions); } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { for (JsProgramFragment fragment : fragments) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsProgramFragment.java b/dev/core/src/com/google/gwt/dev/js/ast/JsProgramFragment.java index 703a5f0..5591e70 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsProgramFragment.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsProgramFragment.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -32,11 +30,16 @@ return globalBlock; } + @Override + public NodeKind getKind() { + return NodeKind.PROGRAM_FRAGMENT; + } + + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { v.accept(globalBlock); } v.endVisit(this, ctx); } - }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsPropertyInitializer.java b/dev/core/src/com/google/gwt/dev/js/ast/JsPropertyInitializer.java index 23033a6..ae67b25 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsPropertyInitializer.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsPropertyInitializer.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -30,13 +28,17 @@ super(sourceInfo); } - public JsPropertyInitializer(SourceInfo sourceInfo, JsExpression labelExpr, - JsExpression valueExpr) { + public JsPropertyInitializer(SourceInfo sourceInfo, JsExpression labelExpr, JsExpression valueExpr) { super(sourceInfo); this.labelExpr = labelExpr; this.valueExpr = valueExpr; } + @Override + public NodeKind getKind() { + return NodeKind.PROPERTY_INIT; + } + public JsExpression getLabelExpr() { return labelExpr; } @@ -57,6 +59,7 @@ this.valueExpr = valueExpr; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { labelExpr = v.accept(labelExpr);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java b/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java index 49579a3..76b2589 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -34,14 +32,21 @@ return flags; } + @Override + public NodeKind getKind() { + return NodeKind.REGEXP; + } + public String getPattern() { return pattern; } + @Override public boolean isBooleanFalse() { return false; } + @Override public boolean isBooleanTrue() { return true; } @@ -64,6 +69,7 @@ this.pattern = re; } + @Override public void traverse(JsVisitor v, JsContext ctx) { v.visit(this, ctx); v.endVisit(this, ctx);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsReturn.java b/dev/core/src/com/google/gwt/dev/js/ast/JsReturn.java index 9571619..04a94ec 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsReturn.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsReturn.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -37,10 +35,16 @@ return expr; } + @Override + public NodeKind getKind() { + return NodeKind.RETURN; + } + public void setExpr(JsExpression expr) { this.expr = expr; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { if (expr != null) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsRootName.java b/dev/core/src/com/google/gwt/dev/js/ast/JsRootName.java index d32582a..9f70e10 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsRootName.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsRootName.java
@@ -1,16 +1,14 @@ /* * Copyright 2011 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java b/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java index 2589bfd..3ceb8be 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java
@@ -1,16 +1,14 @@ /* * Copyright 2007 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -25,8 +23,8 @@ import java.util.Map; /** - * The root scope is the parent of every scope, it contains a list of browser - * built-in identifiers that we should recognize and never obfuscate into. + * The root scope is the parent of every scope, it contains a list of browser built-in identifiers + * that we should recognize and never obfuscate into. */ public final class JsRootScope extends JsScope { /* @@ -41,7 +39,7 @@ public static final JsRootScope INSTANCE; - private static final String[] COMMON_BUILTINS = new String[]{ + private static final String[] COMMON_BUILTINS = new String[] { // 15.1.1 Value Properties of the Global Object "NaN", "Infinity", @@ -241,7 +239,7 @@ "oncanplaythrough", "onended", "onprogress", - + // extra window methods "uneval", @@ -314,29 +312,24 @@ // 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", + "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. + * 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", + "java", "Packages", "netscape", "sun", "JavaObject", "JavaClass", "JavaArray", "JavaMember", // GWT-defined identifiers - "$wnd", "$doc", "$moduleName", "$moduleBase", "$gwt_version", - "$sessionId", + "$wnd", "$doc", "$moduleName", "$moduleBase", "$gwt_version", "$sessionId", // Identifiers used by JsStackEmulator; later set to obfuscatable "$stack", "$stackDepth", "$location", @@ -387,8 +380,7 @@ @Override protected JsName doCreateName(String ident, String shortIdent) { - throw new UnsupportedOperationException( - "Cannot create new names in the root scope"); + throw new UnsupportedOperationException("Cannot create new names in the root scope"); } @Override
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java b/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java index a1ff03c..269d7db 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -23,29 +21,25 @@ import java.util.List; /** - * A scope is a factory for creating and allocating - * {@link com.google.gwt.dev.js.ast.JsName}s. A JavaScript AST is built in terms - * of abstract name objects without worrying about obfuscation, + * A scope is a factory for creating and allocating {@link com.google.gwt.dev.js.ast.JsName}s. A + * JavaScript AST is built in terms of abstract name objects without worrying about obfuscation, * keyword/identifier blacklisting, and so on. * * <p> * - * Scopes are associated with {@link com.google.gwt.dev.js.ast.JsFunction}s, but - * the two are not equivalent. Functions <i>have</i> scopes, but a scope does - * not necessarily have an associated Function. Examples of this include the - * {@link com.google.gwt.dev.js.ast.JsRootScope} and synthetic scopes that might - * be created by a client. + * Scopes are associated with {@link com.google.gwt.dev.js.ast.JsFunction}s, but the two are not + * equivalent. Functions <i>have</i> scopes, but a scope does not necessarily have an associated + * Function. Examples of this include the {@link com.google.gwt.dev.js.ast.JsRootScope} and + * synthetic scopes that might be created by a client. * * <p> * - * 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 com.google.gwt.dev.js.ast.JsProgram#getGlobalScope()}), 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. + * 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 com.google.gwt.dev.js.ast.JsProgram#getGlobalScope()}), 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 abstract class JsScope implements Serializable { @@ -66,8 +60,7 @@ } /** - * Gets a name object associated with the specified ident in this scope, - * creating it if necessary. + * Gets a name object associated with the specified ident in this scope, creating it if necessary. * * @param ident An identifier that is unique within this scope. */ @@ -81,13 +74,12 @@ } /** - * Gets a name object associated with the specified ident in this scope, - * creating it if necessary. + * Gets a name object associated with the specified ident in this scope, creating it if necessary. * * @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. + * @throws IllegalArgumentException if ident already exists in this scope but the requested short + * name does not match the existing short name. */ public final JsName declareName(String ident, String shortIdent) { ident = maybeMangleKeyword(ident); @@ -96,8 +88,8 @@ if (name != null) { if (!name.getShortIdent().equals(shortIdent)) { throw new IllegalArgumentException("Requested short name " + shortIdent - + " conflicts with preexisting short name " + name.getShortIdent() - + " for identifier " + ident); + + " conflicts with preexisting short name " + name.getShortIdent() + " for identifier " + + ident); } return name; } @@ -105,8 +97,8 @@ } /** - * Attempts to find the name object for the specified ident, searching in this - * scope, and if not found, in the parent scopes. + * Attempts to find the name object for the specified ident, searching in this scope, and if not + * found, in the parent scopes. * * @return <code>null</code> if the identifier has no associated name */ @@ -120,8 +112,8 @@ } /** - * Attempts to find an unobfuscatable name object for the specified ident, - * searching in this scope, and if not found, in the parent scopes. + * Attempts to find an unobfuscatable name object for the specified ident, searching in this + * scope, and if not found, in the parent scopes. * * @return <code>null</code> if the identifier has no associated name */ @@ -148,8 +140,7 @@ public abstract List<JsScope> getChildren(); /** - * Returns the parent scope of this scope, or <code>null</code> if this is the - * root scope. + * Returns the parent scope of this scope, or <code>null</code> if this is the root scope. */ public abstract JsScope getParent(); @@ -170,8 +161,7 @@ protected abstract JsName doCreateName(String ident, String shortIdent); /** - * Attempts to find the name object for the specified ident, searching in this - * scope only. + * Attempts to find the name object for the specified ident, searching in this scope only. * * @return <code>null</code> if the identifier has no associated name */
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsSeedIdOf.java b/dev/core/src/com/google/gwt/dev/js/ast/JsSeedIdOf.java index e7c1778..01cd160 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsSeedIdOf.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsSeedIdOf.java
@@ -1,16 +1,14 @@ /* * Copyright 2011 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -29,10 +27,16 @@ this.seedId = seedId; } + @Override + public NodeKind getKind() { + return NodeKind.SEED_ID_OF; + } + public int getSeedId() { return seedId; } + @Override public void traverse(JsVisitor visitor, JsContext ctx) { if (visitor.visit(this, ctx)) { }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsStatement.java b/dev/core/src/com/google/gwt/dev/js/ast/JsStatement.java index 6691c76..c0a91eb 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsStatement.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsStatement.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -27,8 +25,7 @@ } /** - * Returns true if this statement definitely causes an abrupt change in flow - * control. + * Returns true if this statement definitely causes an abrupt change in flow control. */ public boolean unconditionalControlBreak() { return false;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsStringLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsStringLiteral.java index 7eba50f..d5738c7 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsStringLiteral.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsStringLiteral.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -30,14 +28,21 @@ this.value = StringInterner.get().intern(value); } + @Override + public NodeKind getKind() { + return NodeKind.STRING; + } + public String getValue() { return value; } + @Override public boolean isBooleanFalse() { return value.length() == 0; } + @Override public boolean isBooleanTrue() { return value.length() != 0; } @@ -52,6 +57,7 @@ return false; } + @Override public void traverse(JsVisitor v, JsContext ctx) { v.visit(this, ctx); v.endVisit(this, ctx);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsSuperVisitor.java b/dev/core/src/com/google/gwt/dev/js/ast/JsSuperVisitor.java index 231437f..f5d1c44 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsSuperVisitor.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsSuperVisitor.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -18,9 +16,9 @@ import com.google.gwt.dev.js.ast.JsVars.JsVar; /** - * A visitor that walks up the type hierarchy. By default, if a subclass has no - * specific override for a concrete node type, this visitor will call a - * visit/endVisit for its super class, and so on up the type heirarchy. + * A visitor that walks up the type hierarchy. By default, if a subclass has no specific override + * for a concrete node type, this visitor will call a visit/endVisit for its super class, and so on + * up the type heirarchy. */ public class JsSuperVisitor extends JsVisitor {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsSwitch.java b/dev/core/src/com/google/gwt/dev/js/ast/JsSwitch.java index 16341ab..748dd77 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsSwitch.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsSwitch.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -41,10 +39,16 @@ return expr; } + @Override + public NodeKind getKind() { + return NodeKind.SWITCH; + } + 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);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsSwitchMember.java b/dev/core/src/com/google/gwt/dev/js/ast/JsSwitchMember.java index 113901d..a856fe8 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsSwitchMember.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsSwitchMember.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsThisRef.java b/dev/core/src/com/google/gwt/dev/js/ast/JsThisRef.java index 3f4ed82..99b6ff8 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsThisRef.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsThisRef.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -26,10 +24,17 @@ super(sourceInfo); } + @Override + public NodeKind getKind() { + return NodeKind.THIS; + } + + @Override public boolean isBooleanFalse() { return false; } + @Override public boolean isBooleanTrue() { return true; } @@ -37,9 +42,8 @@ @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. + * 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; } @@ -49,6 +53,7 @@ return false; } + @Override public void traverse(JsVisitor v, JsContext ctx) { v.visit(this, ctx); v.endVisit(this, ctx);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsThrow.java b/dev/core/src/com/google/gwt/dev/js/ast/JsThrow.java index 6b45f97..3944b0b 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsThrow.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsThrow.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -37,10 +35,16 @@ return expr; } + @Override + public NodeKind getKind() { + return NodeKind.THROW; + } + 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);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsTry.java b/dev/core/src/com/google/gwt/dev/js/ast/JsTry.java index 35ca695..9d1dbe3 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsTry.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsTry.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -43,6 +41,11 @@ return finallyBlock; } + @Override + public NodeKind getKind() { + return NodeKind.TRY; + } + public JsBlock getTryBlock() { return tryBlock; } @@ -55,6 +58,7 @@ tryBlock = block; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { tryBlock = v.accept(tryBlock);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperation.java b/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperation.java index bf323ce..571b714 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperation.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperation.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -30,8 +28,7 @@ this(sourceInfo, op, null); } - public JsUnaryOperation(SourceInfo sourceInfo, JsUnaryOperator op, - JsExpression arg) { + public JsUnaryOperation(SourceInfo sourceInfo, JsUnaryOperator op, JsExpression arg) { super(sourceInfo); this.op = op; this.arg = arg; @@ -54,11 +51,12 @@ 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. + * 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 {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java b/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java index 454a1df..0c0ea4e 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -20,14 +18,12 @@ */ public enum JsUnaryOperator implements JsOperator { /* - * Precedence indices from "JavaScript - The Definitive Guide" 4th Edition - * (page 57) + * 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); + 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; @@ -41,18 +37,22 @@ 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; } @@ -61,18 +61,22 @@ 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; }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsValueLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsValueLiteral.java index ba6dcd3..fac9228 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsValueLiteral.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsValueLiteral.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsVars.java b/dev/core/src/com/google/gwt/dev/js/ast/JsVars.java index 2e55e33..6fdb3cd 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsVars.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsVars.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -44,6 +42,12 @@ return initExpr; } + @Override + public NodeKind getKind() { + return NodeKind.VAR; + } + + @Override public JsName getName() { return name; } @@ -52,6 +56,7 @@ this.initExpr = initExpr; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { if (initExpr != null) { @@ -72,6 +77,11 @@ vars.add(var); } + @Override + public NodeKind getKind() { + return NodeKind.VARS; + } + public int getNumVars() { return vars.size(); } @@ -81,10 +91,12 @@ } // Iterator returns JsVar objects + @Override public Iterator<JsVar> iterator() { return vars.iterator(); } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { v.acceptWithInsertRemove(vars);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsVisitable.java b/dev/core/src/com/google/gwt/dev/js/ast/JsVisitable.java index cd37d2f..4d55475 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsVisitable.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsVisitable.java
@@ -1,16 +1,14 @@ /* * Copyright 2007 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsVisitor.java b/dev/core/src/com/google/gwt/dev/js/ast/JsVisitor.java index 142e462..ba5396c 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsVisitor.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsVisitor.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -30,30 +28,37 @@ 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(); } @@ -61,30 +66,37 @@ 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(); } @@ -105,8 +117,7 @@ return doAcceptLvalue(expr); } - public final <T extends JsVisitable> void acceptWithInsertRemove( - List<T> collection) { + public final <T extends JsVisitable> void acceptWithInsertRemove(List<T> collection) { doAcceptWithInsertRemove(collection); } @@ -439,8 +450,7 @@ return expr; } - protected <T extends JsVisitable> void doAcceptWithInsertRemove( - List<T> collection) { + protected <T extends JsVisitable> void doAcceptWithInsertRemove(List<T> collection) { for (Iterator<T> it = collection.iterator(); it.hasNext();) { doTraverse(it.next(), UNMODIFIABLE_CONTEXT); } @@ -454,8 +464,7 @@ } } - private InternalCompilerException translateException(JsVisitable node, - Throwable e) { + private InternalCompilerException translateException(JsVisitable node, Throwable e) { if (e instanceof VirtualMachineError) { // Always rethrow VM errors (an attempt to wrap may fail). throw (VirtualMachineError) e;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsWhile.java b/dev/core/src/com/google/gwt/dev/js/ast/JsWhile.java index af2b9d0..d1d6afb 100644 --- a/dev/core/src/com/google/gwt/dev/js/ast/JsWhile.java +++ b/dev/core/src/com/google/gwt/dev/js/ast/JsWhile.java
@@ -1,16 +1,14 @@ /* * Copyright 2008 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at + * 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 + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.js.ast; @@ -44,6 +42,11 @@ return condition; } + @Override + public NodeKind getKind() { + return NodeKind.WHILE; + } + public void setBody(JsStatement body) { this.body = body; } @@ -52,6 +55,7 @@ this.condition = condition; } + @Override public void traverse(JsVisitor v, JsContext ctx) { if (v.visit(this, ctx)) { condition = v.accept(condition);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/NodeKind.java b/dev/core/src/com/google/gwt/dev/js/ast/NodeKind.java new file mode 100644 index 0000000..85b3095 --- /dev/null +++ b/dev/core/src/com/google/gwt/dev/js/ast/NodeKind.java
@@ -0,0 +1,22 @@ +/* + * Copyright 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.gwt.dev.js.ast; + +/** + * NodeKind used to simplify direct AST iteration. + */ +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, NAME_OF, NEW, NULL, NUMBER, OBJECT, PARAMETER, POSTFIX_OP, PREFIX_OP, PROGRAM, PROGRAM_FRAGMENT, PROPERTY_INIT, REGEXP, RETURN, SEED_ID_OF, STRING, SWITCH, THIS, THROW, TRY, VARS, VAR, WHILE +}
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableClosureCompiler.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableClosureCompiler.java new file mode 100644 index 0000000..206cccd --- /dev/null +++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerEnableClosureCompiler.java
@@ -0,0 +1,46 @@ +/* + * Copyright 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.gwt.dev.util.arg; + +import com.google.gwt.util.tools.ArgHandlerFlag; + +/** + * An ArgHandler to provide the -enableClosureCompiler flag. + */ +public class ArgHandlerEnableClosureCompiler extends ArgHandlerFlag { + + private final OptionEnableClosureCompiler option; + + public ArgHandlerEnableClosureCompiler(OptionEnableClosureCompiler option) { + this.option = option; + } + + @Override + public String getPurpose() { + return "EXPERIMENTAL: Enables Closure Compiler optimizations"; + } + + @Override + public String getTag() { + return "-XenableClosureCompiler"; + } + + @Override + public boolean setFlag() { + option.setClosureCompilerEnabled(true); + return true; + } +}
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/OptionEnableClosureCompiler.java b/dev/core/src/com/google/gwt/dev/util/arg/OptionEnableClosureCompiler.java new file mode 100644 index 0000000..77649db --- /dev/null +++ b/dev/core/src/com/google/gwt/dev/util/arg/OptionEnableClosureCompiler.java
@@ -0,0 +1,25 @@ +/* + * Copyright 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.gwt.dev.util.arg; + +/** + * Encapsulates a compiler option to enable Closure Compiler optimizations. + */ +public interface OptionEnableClosureCompiler { + boolean isClosureCompilerEnabled(); + + void setClosureCompilerEnabled(boolean enabled); +}