You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ah...@apache.org on 2018/11/22 01:50:11 UTC
[royale-compiler] 02/02: fix deps writing when we promote requires
from static initializers
This is an automated email from the ASF dual-hosted git repository.
aharui pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit 3252eb312b09cbf5270d78aadc785d757743d323
Author: Alex Harui <ah...@apache.org>
AuthorDate: Wed Nov 21 17:49:40 2018 -0800
fix deps writing when we promote requires from static initializers
---
.../codegen/js/royale/JSRoyaleEmitter.java | 5 +-
.../codegen/mxml/royale/MXMLRoyaleEmitter.java | 29 +++++----
.../compiler/internal/graph/GoogDepsWriter.java | 72 ++++++++++++++++++++--
3 files changed, 89 insertions(+), 17 deletions(-)
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
index f258b16..a1a114b 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
@@ -303,7 +303,7 @@ public class JSRoyaleEmitter extends JSGoogEmitter implements IJSRoyaleEmitter
sb.append(JSGoogEmitterTokens.ROYALE_STATIC_DEPENDENCY_LIST.getToken());
boolean firstDependency = true;
for (String staticName : staticUsedNames)
- {
+ {
if (!firstDependency)
sb.append(",");
firstDependency = false;
@@ -569,7 +569,8 @@ public class JSRoyaleEmitter extends JSGoogEmitter implements IJSRoyaleEmitter
else if (!isDoc)
{
if (getModel().inStaticInitializer)
- if (!staticUsedNames.contains(name) && !NativeUtils.isJSNative(name) && !isExternal(name))
+ if (!staticUsedNames.contains(name) && !NativeUtils.isJSNative(name)
+ && !isExternal(name) && !getModel().getCurrentClass().getQualifiedName().equals(name))
staticUsedNames.add(name);
if (!usedNames.contains(name) && !isExternal(name))
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
index 2d1baf3..e2bf763 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
@@ -482,19 +482,26 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements
}
if (staticUsedNames.size() > 0)
{
- StringBuilder sb = new StringBuilder();
- sb.append(JSGoogEmitterTokens.ROYALE_STATIC_DEPENDENCY_LIST.getToken());
- boolean firstDependency = true;
- for (String staticName : staticUsedNames)
+ if (staticUsedNames.size() > 1 ||
+ !staticUsedNames.get(0).equals(currentClassName))
{
- if (!firstDependency)
- sb.append(",");
- firstDependency = false;
- sb.append(staticName);
+ StringBuilder sb = new StringBuilder();
+ sb.append(JSGoogEmitterTokens.ROYALE_STATIC_DEPENDENCY_LIST.getToken());
+ boolean firstDependency = true;
+ for (String staticName : staticUsedNames)
+ {
+ if (currentClassName.equals(staticName))
+ continue;
+
+ if (!firstDependency)
+ sb.append(",");
+ firstDependency = false;
+ sb.append(staticName);
+ }
+ sb.append("*/");
+ finalLines.add(provideIndex, sb.toString());
+ addLineToMappings(provideIndex);
}
- sb.append("*/");
- finalLines.add(provideIndex, sb.toString());
- addLineToMappings(provideIndex);
}
return Joiner.on("\n").join(finalLines);
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/graph/GoogDepsWriter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/graph/GoogDepsWriter.java
index c78f56e..44bdf9d 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/graph/GoogDepsWriter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/graph/GoogDepsWriter.java
@@ -145,6 +145,7 @@ public class GoogDepsWriter {
return "";
dps = sort();
}
+ ArrayList<String> usedDeps = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
int n = dps.size();
for (int i = n - 1; i >= 0; i--)
@@ -156,13 +157,20 @@ public class GoogDepsWriter {
{
ArrayList <String> deps = new ArrayList<String>();
if (gd.fileInfo.impls != null)
+ {
deps.addAll(gd.fileInfo.impls);
+ for (String dep : gd.fileInfo.impls)
+ if (!usedDeps.contains(dep))
+ usedDeps.add(dep);
+ }
if (gd.fileInfo.staticDeps != null)
{
for (String dep : gd.fileInfo.staticDeps)
{
if (!deps.contains(dep))
deps.add(dep);
+ if (!usedDeps.contains(dep))
+ usedDeps.add(dep);
}
}
sb.append("goog.addDependency('").append(relativePath(gd.filePath)).append("', ['")
@@ -171,10 +179,12 @@ public class GoogDepsWriter {
.append("]);\n");
}
else
+ {
sb.append("goog.addDependency('").append(relativePath(gd.filePath)).append("', ['")
.append(gd.className).append("'], [")
.append(getDependencies(gd.deps))
- .append("]);\n");
+ .append("]);\n");
+ }
}
}
if (removeCirculars)
@@ -185,17 +195,22 @@ public class GoogDepsWriter {
.append(mainDep.className).append("'], [");
ArrayList<String> restOfDeps = new ArrayList<String>();
restOfDeps.addAll(mainDep.deps);
+ if (mainDep.fileInfo.impls != null)
+ restOfDeps.addAll(mainDep.fileInfo.impls);
DependencyTypeSet dependencyTypes = DependencyTypeSet.allOf();
// get the list of all units not referenced by other units
for (GoogDep gd : depMap.values())
{
+// if (usedDeps.contains(gd.className))
+// continue;
+
if (gd.className.equals(mainName))
{
if (gd.fileInfo.impls != null)
{
for (String d : gd.fileInfo.impls)
{
- if (!restOfDeps.contains(d) && !gd.fileInfo.isExtern && !isExternal(d))
+ if (!restOfDeps.contains(d) && !gd.fileInfo.isExtern && !isExternal(d) && !usedDeps.contains(d))
restOfDeps.add(d);
}
}
@@ -204,14 +219,14 @@ public class GoogDepsWriter {
ICompilationUnit unit = requireMap.get(gd.className);
if (unit == null)
{
- if (!restOfDeps.contains(gd.className) && !gd.fileInfo.isExtern && !isExternal(gd.className))
+ if (!restOfDeps.contains(gd.className) && !gd.fileInfo.isExtern && !isExternal(gd.className) && !usedDeps.contains(gd.className))
restOfDeps.add(gd.className);
continue;
}
Set<ICompilationUnit> deps = graph.getDirectReverseDependencies(unit, dependencyTypes);
if (deps.size() == 0)
{
- if (!restOfDeps.contains(gd.className) && !gd.fileInfo.isExtern && !isExternal(gd.className))
+ if (!restOfDeps.contains(gd.className) && !gd.fileInfo.isExtern && !isExternal(gd.className) && !usedDeps.contains(gd.className))
restOfDeps.add(gd.className);
}
}
@@ -281,7 +296,30 @@ public class GoogDepsWriter {
for (String dep : info.fileInfo.deps)
{
if (!info.fileInfo.staticDeps.contains(dep))
+ {
info.fileInfo.staticDeps.add(dep);
+ if (!isGoogClass(dep))
+ {
+ System.out.println(staticClass + " used in static initializers so make " + dep + "a static dependency");
+ ICompilationUnit depcu = requireMap.get(dep);
+ if (depcu == null)
+ {
+ depcu = new JSCompilationUnit(project, dep, DefinitionPriority.BasePriority.SOURCE_LIST, dep);
+ graph.addCompilationUnit(depcu);
+ requireMap.put(dep, depcu);
+ requireMap2.put(depcu, dep);
+ }
+ ICompilationUnit cu = requireMap.get(staticClass);
+ if (cu == null)
+ {
+ cu = new JSCompilationUnit(project, staticClass, DefinitionPriority.BasePriority.SOURCE_LIST, staticClass);
+ graph.addCompilationUnit(cu);
+ requireMap.put(staticClass, cu);
+ requireMap2.put(cu, staticClass);
+ }
+ graph.addDependency(cu, depcu, DependencyType.INHERITANCE);
+ }
+ }
}
}
}
@@ -562,6 +600,7 @@ public class GoogDepsWriter {
StringBuilder sb = new StringBuilder();
sb.append(JSGoogEmitterTokens.ROYALE_DEPENDENCY_LIST.getToken());
+ int staticDepsLine = -1;
FileInfo fi = gd.fileInfo;
int suppressCount = 0;
int i = 0;
@@ -575,6 +614,9 @@ public class GoogDepsWriter {
int c = line.indexOf(JSGoogEmitterTokens.ROYALE_DEPENDENCY_LIST.getToken());
if (c > -1)
return; // already been processed
+ c = line.indexOf(JSGoogEmitterTokens.ROYALE_STATIC_DEPENDENCY_LIST.getToken());
+ if (c > -1)
+ staticDepsLine = i;
c = line.indexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
if (c > -1)
{
@@ -676,6 +718,28 @@ public class GoogDepsWriter {
sb.append("*/");
finalLines.add(gd.fileInfo.googProvideLine + 1, sb.toString());
sourceMapConsumer = addLineToSourceMap(sourceMapConsumer, depFile.getName(), gd.fileInfo.googProvideLine + 1);
+ if (staticInitializers.contains(className) && gd.fileInfo.staticDeps != null)
+ {
+ // add or rewrite static deps cache since we may have mucked with the list.
+ sb = new StringBuilder();
+ sb.append(JSGoogEmitterTokens.ROYALE_STATIC_DEPENDENCY_LIST.getToken());
+ boolean firstOne = true;
+ for (String dep : gd.fileInfo.staticDeps)
+ {
+ if (!firstOne)
+ sb.append(",");
+ firstOne = false;
+ sb.append(dep);
+ }
+ sb.append("*/");
+ if (staticDepsLine == -1)
+ {
+ finalLines.add(gd.fileInfo.googProvideLine + 2, sb.toString());
+ sourceMapConsumer = addLineToSourceMap(sourceMapConsumer, depFile.getName(), gd.fileInfo.googProvideLine + 2);
+ }
+ else
+ finalLines.set(staticDepsLine, sb.toString());
+ }
PrintWriter out = new PrintWriter(new FileWriter(depFile));
for (String s : finalLines)