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)