Repository: flex-falcon Updated Branches: refs/heads/develop 7edc0343e -> f8b724e46
initial support for modules Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/f8b724e4 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/f8b724e4 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/f8b724e4 Branch: refs/heads/develop Commit: f8b724e46af9a8d7916bdb95a44369eab7273121 Parents: 7edc034 Author: Alex Harui <aha...@apache.org> Authored: Tue Aug 15 10:20:53 2017 -0700 Committer: Alex Harui <aha...@apache.org> Committed: Tue Aug 15 10:23:24 2017 -0700 ---------------------------------------------------------------------- .../javascript/jscomp/CompilerMapFetcher.java | 53 +++++ .../mxml/flexjs/MXMLFlexJSPublisher.java | 91 +++++++-- .../utils/JSClosureCompilerWrapper.java | 204 ++++++++++++++++++- 3 files changed, 329 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f8b724e4/compiler-jx/src/main/java/com/google/javascript/jscomp/CompilerMapFetcher.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/com/google/javascript/jscomp/CompilerMapFetcher.java b/compiler-jx/src/main/java/com/google/javascript/jscomp/CompilerMapFetcher.java new file mode 100644 index 0000000..5fbb7ae --- /dev/null +++ b/compiler-jx/src/main/java/com/google/javascript/jscomp/CompilerMapFetcher.java @@ -0,0 +1,53 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.javascript.jscomp; + +public class CompilerMapFetcher +{ + + private static final long serialVersionUID = 2021530437904249081L; + + public CompilerMapFetcher() + { + super(); + } + + public static VariableMap getVariableMap(Compiler compiler) + { + return compiler.getVariableMap(); + } + + public static VariableMap getPropertyMap(Compiler compiler) + { + return compiler.getPropertyMap(); + } + + public static void setVariableMap(CompilerOptions options, VariableMap input) + { + options.inputVariableMap = input; + } + + public static void setPropertyMap(CompilerOptions options, VariableMap input) + { + options.inputPropertyMap = input; + } + + +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f8b724e4/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java index a46c9ba..0683573 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java @@ -323,24 +323,35 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher implements IJSPublisher // is generated here so it can be used for outputting the html templates. String depsFileData = gdw.generateDeps(project, problems); - File template = ((JSGoogConfiguration)configuration).getHtmlTemplate(); - // Create the index.html for the debug-js version. - if (!((JSGoogConfiguration)configuration).getSkipTranspile()) { - if (template != null) { - writeTemplate(template, "intermediate", projectName, intermediateDir, depsFileData, gdw.additionalHTML); - } else { - writeHTML("intermediate", projectName, intermediateDir, depsFileData, gdw.additionalHTML); - } - } - // Create the index.html for the release-js version. - if (configuration.release()) { - if (template != null) { - writeTemplate(template, "release", projectName, releaseDir, depsFileData, gdw.additionalHTML); - } else { - writeHTML("release", projectName, releaseDir, null, gdw.additionalHTML); - } + if (depsFileData.contains("UIModule.js")) + { + // need better test someday + depsFileData += "\ngoog.require('" + projectName + "');\n"; + writeFile(new File(intermediateDir, projectName + "__deps.js"), depsFileData, false); + Set<String> provideds = computeProvideds(depsFileData); + compilerWrapper.setProvideds(provideds); + gdw.needCSS = true; } - + else + { + File template = ((JSGoogConfiguration)configuration).getHtmlTemplate(); + // Create the index.html for the debug-js version. + if (!((JSGoogConfiguration)configuration).getSkipTranspile()) { + if (template != null) { + writeTemplate(template, "intermediate", projectName, intermediateDir, depsFileData, gdw.additionalHTML); + } else { + writeHTML("intermediate", projectName, intermediateDir, depsFileData, gdw.additionalHTML); + } + } + // Create the index.html for the release-js version. + if (configuration.release()) { + if (template != null) { + writeTemplate(template, "release", projectName, releaseDir, depsFileData, gdw.additionalHTML); + } else { + writeHTML("release", projectName, releaseDir, null, gdw.additionalHTML); + } + } + } ///////////////////////////////////////////////////////////////////////////////// // Generate or copy the main CSS resources. @@ -378,6 +389,23 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher implements IJSPublisher return true; } + private Set<String> computeProvideds(String data) + { + HashSet<String> set = new HashSet<String>(); + String[] lines = data.split("\n"); + for (String line : lines) + { + int c = line.indexOf("['"); + if (c != -1) + { + int c2 = line.indexOf("'", c + 2); + String name = line.substring(c + 2, c2); + set.add(name); + } + } + return set; + } + protected List<SourceFile> closureFilesInOrder(String path, List<SourceFile> files, String entryPoint) { ArrayList<String> sortedFiles = new ArrayList<String>(); @@ -768,6 +796,11 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher implements IJSPublisher return true; } + private String[] reservedFunctions = { + "org['apache']['flex']['core']['UIBase'] = function(){};", + "org['apache']['flex']['html']['Label'] = function(){};", + }; + private void writeExportedNames(JSClosureCompilerWrapper compilerWrapper) { if (!googConfiguration.getExportPublicSymbols()) @@ -801,6 +834,30 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher implements IJSPublisher compilerWrapper.addJSExternsFile(exportsFile.getAbsolutePath()); } } + else + { + StringBuilder sb = new StringBuilder(); + sb.append("/**\n"); + sb.append(" * generated by Apache FlexJS compiler\n"); + sb.append(" * @externs\n"); + sb.append(" */\n"); + for (String name : reservedFunctions) + { + sb.append("\n\n"); + sb.append("/**\n"); + sb.append(" */\n"); + sb.append(name + "\n"); + } + File exportsFile = new File(outputFolder, "dontrename.js"); + try { + writeFile(exportsFile, sb.toString(), false); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //compilerWrapper.addJSExternsFile(exportsFile.getAbsolutePath()); + + } } } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f8b724e4/compiler-jx/src/main/java/org/apache/flex/compiler/utils/JSClosureCompilerWrapper.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/utils/JSClosureCompilerWrapper.java b/compiler-jx/src/main/java/org/apache/flex/compiler/utils/JSClosureCompilerWrapper.java index 42ad2b3..05c791b 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/utils/JSClosureCompilerWrapper.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/utils/JSClosureCompilerWrapper.java @@ -19,18 +19,26 @@ package org.apache.flex.compiler.utils; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import com.google.javascript.jscomp.CheckLevel; import com.google.javascript.jscomp.CommandLineRunner; import com.google.javascript.jscomp.CompilationLevel; import com.google.javascript.jscomp.Compiler; +import com.google.javascript.jscomp.CompilerMapFetcher; import com.google.javascript.jscomp.CompilerOptions; import com.google.javascript.jscomp.CompilerOptions.LanguageMode; import com.google.javascript.jscomp.DependencyOptions; @@ -39,6 +47,7 @@ import com.google.javascript.jscomp.FlexJSDiagnosticGroups; import com.google.javascript.jscomp.ModuleIdentifier; import com.google.javascript.jscomp.SourceFile; import com.google.javascript.jscomp.SourceMap; +import com.google.javascript.jscomp.VariableMap; import com.google.javascript.jscomp.WarningLevel; public class JSClosureCompilerWrapper @@ -49,7 +58,8 @@ public class JSClosureCompilerWrapper Compiler.setLoggingLevel(Level.INFO); compiler_ = new Compiler(); - + filterOptions(args); + ArrayList<String> splitArgs = new ArrayList<String>(); for (String s : args) { @@ -77,6 +87,11 @@ public class JSClosureCompilerWrapper private CompilerOptions options_; private List<SourceFile> jsExternsFiles_; private List<SourceFile> jsSourceFiles_; + private String variableMapOutputPath; + private String propertyMapOutputPath; + private String variableMapInputPath; + private String propertyMapInputPath; + private Set<String> provideds; public String targetFilePath; @@ -100,12 +115,45 @@ public class JSClosureCompilerWrapper jsSourceFiles_.add(file); } + public void setProvideds(Set<String> set) + { + provideds = set; + } + public void compile() { System.out.println("list of source files"); for (SourceFile file : jsSourceFiles_) System.out.println(file.getName()); System.out.println("end of list of source files"); + File outputFolder = new File(targetFilePath).getParentFile(); + if (variableMapInputPath != null) + { + File inputFile = new File(outputFolder, variableMapInputPath); + try { + VariableMap map = VariableMap.load(inputFile.getAbsolutePath()); + CompilerMapFetcher.setVariableMap(options_, map); + Set<String> usedVars = getUsedVars(inputFile); + compiler_.addExportedNames(usedVars); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if (propertyMapInputPath != null) + { + File inputFile = new File(outputFolder, propertyMapInputPath); + try { + VariableMap map = VariableMap.load(inputFile.getAbsolutePath()); + CompilerMapFetcher.setPropertyMap(options_, map); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + compiler_.compile(jsExternsFiles_, jsSourceFiles_, options_); try @@ -123,6 +171,30 @@ public class JSClosureCompilerWrapper System.out.println(error); } + if (variableMapOutputPath != null) + { + File outputFile = new File(outputFolder, variableMapOutputPath); + VariableMap map = CompilerMapFetcher.getVariableMap(compiler_); + try { + map.save(outputFile.getAbsolutePath()); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + if (propertyMapOutputPath != null) + { + File outputFile = new File(outputFolder, propertyMapOutputPath); + VariableMap map = CompilerMapFetcher.getPropertyMap(compiler_); + try { + map.save(outputFile.getAbsolutePath()); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + /* for (JSError message : compiler_.getWarnings()) { @@ -136,6 +208,64 @@ public class JSClosureCompilerWrapper */ } + private Set<String> getUsedVars(File file) + { + HashMap<String, String> vars = new HashMap<String, String>(); + + try + { + BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF8")); + + String line = in.readLine(); + + while (line != null) + { + int c = line.indexOf(":"); + if (c != -1) + { + String name = line.substring(0, c); + + String var = line.substring(c + 1).trim(); + vars.put(name, var); + } + line = in.readLine(); + } + + // remove all vars that are used by this module + // that way they will re-use the names in the + // loader + for (String name : provideds) + { + name = name.replace('.', '$'); + Set<String> keys = vars.keySet(); + ArrayList<String> remKeys = new ArrayList<String>(); + for (String key : keys) + { + if (key.contains(name)) + { + remKeys.add(key); + } + } + for (String key : remKeys) + { + vars.remove(key); + } + } + in.close(); + } + catch (Exception e) + { + // nothing to see, move along... + } + HashSet<String> usedVars = new HashSet<String>(); + Set<String> keys = vars.keySet(); + for (String key : keys) + { + usedVars.add(vars.get(key)); + } + return usedVars; + } + @SuppressWarnings( "deprecation" ) private void initExterns() { @@ -153,10 +283,62 @@ public class JSClosureCompilerWrapper } } + private void filterOptions(List<String> args) + { + final String PROPERTY_MAP = "--property_map_output_file "; + final String VARIABLE_MAP = "--variable_map_output_file "; + final String PROPERTY_INPUT_MAP = "--property_map_input_file "; + final String VARIABLE_INPUT_MAP = "--variable_map_input_file "; + String propEntry = null; + String varEntry = null; + String propInputEntry = null; + String varInputEntry = null; + + for (String s : args) + { + if (s.startsWith(PROPERTY_MAP)) + { + propEntry = s; + propertyMapOutputPath = s.substring(PROPERTY_MAP.length()); + } + + if (s.startsWith(PROPERTY_INPUT_MAP)) + { + propInputEntry = s; + propertyMapInputPath = s.substring(PROPERTY_INPUT_MAP.length()); + } + + if (s.startsWith(VARIABLE_MAP)) + { + varEntry = s; + variableMapOutputPath = s.substring(VARIABLE_MAP.length()); + } + + if (s.startsWith(VARIABLE_INPUT_MAP)) + { + varInputEntry = s; + variableMapInputPath = s.substring(VARIABLE_INPUT_MAP.length()); + } + } + if (varEntry != null) + args.remove(varEntry); + if (propEntry != null) + args.remove(propEntry); + if (varInputEntry != null) + args.remove(varInputEntry); + if (propInputEntry != null) + args.remove(propInputEntry); + + } + private void initOptions(List<String> args) { final String JS_FLAG = "--js "; - + final String PROPERTY_MAP = "--property_map_output_file "; + final String VARIABLE_MAP = "--variable_map_output_file "; + String propEntry = null; + String varEntry = null; + boolean hasCompilationLevel = false; boolean hasWarningLevel = false; for (String s : args) @@ -171,7 +353,25 @@ public class JSClosureCompilerWrapper if (s.startsWith("--warning_level ") || s.startsWith("-W ")) hasWarningLevel = true; + + if (s.startsWith(PROPERTY_MAP)) + { + propEntry = s; + propertyMapOutputPath = s.substring(PROPERTY_MAP.length()); + } + + if (s.startsWith(VARIABLE_MAP)) + { + varEntry = s; + variableMapOutputPath = s.substring(VARIABLE_MAP.length()); + } + } + if (varEntry != null) + args.remove(varEntry); + if (propEntry != null) + args.remove(propEntry); + if (!hasCompilationLevel) CompilationLevel.ADVANCED_OPTIMIZATIONS.setOptionsForCompilationLevel( options_);