| /* |
| * Copyright 2014 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.dev.jjs.impl; |
| |
| import com.google.gwt.core.ext.UnableToCompleteException; |
| import com.google.gwt.dev.CompilerContext; |
| import com.google.gwt.dev.PrecompileTaskOptions; |
| import com.google.gwt.dev.PrecompileTaskOptionsImpl; |
| import com.google.gwt.dev.cfg.BindingProperty; |
| import com.google.gwt.dev.cfg.ConditionNone; |
| import com.google.gwt.dev.cfg.ConfigurationProperty; |
| import com.google.gwt.dev.jjs.JsOutputOption; |
| import com.google.gwt.dev.js.ast.JsFunction; |
| import com.google.gwt.dev.js.ast.JsName; |
| import com.google.gwt.dev.js.ast.JsNode; |
| import com.google.gwt.thirdparty.guava.common.base.Joiner; |
| import com.google.gwt.thirdparty.guava.common.collect.Iterables; |
| import com.google.gwt.thirdparty.guava.common.collect.Sets; |
| |
| import java.util.Set; |
| |
| /** |
| * Unit test for {@link GenerateJavaScriptAST}. |
| */ |
| public class GenerateJavaScriptAstTest extends FullCompileTestBase { |
| |
| // Compilation Configuration Properties. |
| @Override |
| public void setUp() throws Exception { |
| // Compilation Configuration Properties. |
| BindingProperty stackMode = new BindingProperty("compiler.stackMode"); |
| stackMode.addDefinedValue(new ConditionNone(), "STRIP"); |
| setProperties(new BindingProperty[]{stackMode}, new String[]{"STRIP"}, |
| new ConfigurationProperty[]{}); |
| super.setUp(); |
| } |
| |
| public void testInlineJSNIMethod() throws UnableToCompleteException { |
| String code = Joiner.on('\n').join( |
| "package test;", |
| "import com.google.gwt.core.client.GWT;", |
| "import com.google.gwt.core.client.RunAsyncCallback;", |
| "public class EntryPoint {", |
| " public static native void inlinableJSNI() /*-{ $wnd; }-*/; ", |
| " public static void functionA() { onModuleLoad(); }", |
| " public static void onModuleLoad() {", |
| " inlinableJSNI();", |
| " }", |
| "}"); |
| |
| Set<JsNode> functionForJsInlining = compileSnippetToJS(code).getRight(); |
| assertContainsAll(functionForJsInlining, "onModuleLoad", "inlinableJSNI"); |
| assertDoesNotContainsAny(functionForJsInlining, "functionA"); |
| } |
| |
| public void testInlineFunctionDefinedInJSNI() throws UnableToCompleteException { |
| String code = Joiner.on('\n').join( |
| "package test;", |
| "import com.google.gwt.core.client.GWT;", |
| "import com.google.gwt.core.client.RunAsyncCallback;", |
| "public class EntryPoint {", |
| " public static native void inlinableJSNI() /*-{ (function () { return $wnd;})(); }-*/;", |
| " public static void functionA() { onModuleLoad(); }", |
| " public static void onModuleLoad() {", |
| " inlinableJSNI();", |
| " }", |
| "}"); |
| |
| Set<JsNode> functionForJsInlining = compileSnippetToJS(code.toString()).getRight(); |
| assertContainsAll(functionForJsInlining, "onModuleLoad", "inlinableJSNI", |
| "function(){ return $wnd; }"); |
| assertDoesNotContainsAny(functionForJsInlining, "functionA"); |
| } |
| |
| private void assertContainsAll(Set<JsNode> functionsForJsInlining, |
| String... functionNamesorContents) { |
| Set<String> remainingFunctions = Sets.newHashSet(functionNamesorContents); |
| for (JsFunction function : Iterables.filter(functionsForJsInlining, JsFunction.class)) { |
| JsName name = function.getName(); |
| if (name == null) { |
| remainingFunctions.remove(function.toString().replaceAll("\\s+"," ").trim()); |
| continue; |
| } |
| remainingFunctions.remove(name.getShortIdent()); |
| } |
| assertTrue("{" + (Joiner.on(",").join(remainingFunctions)) + "} not marked for consideration in " |
| + "JsInliner", remainingFunctions.isEmpty()); |
| } |
| |
| private void assertDoesNotContainsAny(Set<JsNode> functionsForJsInlining, |
| String... functionNames) { |
| Set<String> remainingFunctions = Sets.newHashSet(functionNames); |
| for (JsFunction function : Iterables.filter(functionsForJsInlining, JsFunction.class)) { |
| JsName name = function.getName(); |
| if (name == null) { |
| continue; |
| } |
| assertFalse(name.getShortIdent() + " should not be considered for JsInliner", |
| remainingFunctions.contains(name.getShortIdent())); |
| } |
| } |
| |
| @Override |
| protected void optimizeJava() { |
| } |
| |
| @Override |
| protected CompilerContext provideCompilerContext() { |
| PrecompileTaskOptions options = new PrecompileTaskOptionsImpl(); |
| options.setOutput(JsOutputOption.PRETTY); |
| options.setRunAsyncEnabled(false); |
| return new CompilerContext.Builder().options(options).build(); |
| } |
| } |