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/20 19:43:59 UTC

[royale-compiler] 03/05: externs-report seems to work

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 3c577e240b65c4f7be27b7af45a340f97e737793
Author: Alex Harui <ah...@apache.org>
AuthorDate: Tue Nov 20 11:24:33 2018 -0800

    externs-report seems to work
---
 .../royale/compiler/clients/MXMLJSCRoyale.java     | 199 ++++++++++++++++++++-
 1 file changed, 196 insertions(+), 3 deletions(-)

diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyale.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyale.java
index 8d0e167..2e9686d 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyale.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyale.java
@@ -32,6 +32,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -49,19 +50,31 @@ import org.apache.royale.compiler.config.Configuration;
 import org.apache.royale.compiler.config.ConfigurationBuffer;
 import org.apache.royale.compiler.config.Configurator;
 import org.apache.royale.compiler.config.ICompilerSettingsConstants;
+import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.driver.IBackend;
 import org.apache.royale.compiler.driver.js.IJSApplication;
 import org.apache.royale.compiler.exceptions.ConfigurationException;
 import org.apache.royale.compiler.exceptions.ConfigurationException.IOError;
 import org.apache.royale.compiler.exceptions.ConfigurationException.MustSpecifyTarget;
 import org.apache.royale.compiler.exceptions.ConfigurationException.OnlyOneSource;
+import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
+import org.apache.royale.compiler.internal.codegen.js.goog.JSGoogDocEmitter;
+import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter;
 import org.apache.royale.compiler.internal.config.FlashBuilderConfigurator;
+import org.apache.royale.compiler.internal.definitions.AccessorDefinition;
+import org.apache.royale.compiler.internal.definitions.ClassDefinition;
+import org.apache.royale.compiler.internal.definitions.FunctionDefinition;
+import org.apache.royale.compiler.internal.definitions.InterfaceDefinition;
+import org.apache.royale.compiler.internal.definitions.ParameterDefinition;
+import org.apache.royale.compiler.internal.definitions.ScopedDefinitionBase;
 import org.apache.royale.compiler.internal.driver.js.goog.JSGoogConfiguration;
 import org.apache.royale.compiler.internal.driver.mxml.royale.MXMLRoyaleBackend;
 import org.apache.royale.compiler.internal.parsing.as.RoyaleASDocDelegate;
 import org.apache.royale.compiler.internal.projects.CompilerProject;
 import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
 import org.apache.royale.compiler.internal.projects.ISourceFileHandler;
+import org.apache.royale.compiler.internal.scopes.ASProjectScope.DefinitionPromise;
+import org.apache.royale.compiler.internal.scopes.ASScope;
 import org.apache.royale.compiler.internal.targets.RoyaleJSTarget;
 import org.apache.royale.compiler.internal.targets.JSTarget;
 import org.apache.royale.compiler.internal.units.ResourceBundleCompilationUnit;
@@ -74,6 +87,7 @@ import org.apache.royale.compiler.problems.InternalCompilerProblem;
 import org.apache.royale.compiler.problems.UnableToBuildSWFProblem;
 import org.apache.royale.compiler.problems.UnexpectedExceptionProblem;
 import org.apache.royale.compiler.projects.ICompilerProject;
+import org.apache.royale.compiler.scopes.IDefinitionSet;
 import org.apache.royale.compiler.targets.ITarget;
 import org.apache.royale.compiler.targets.ITarget.TargetType;
 import org.apache.royale.compiler.targets.ITargetSettings;
@@ -442,10 +456,189 @@ public class MXMLJSCRoyale implements JSCompilerEntryPoint, ProblemQueryProvider
 
     private void generateExternsReport(File externsReportFile,
 			List<ICompilationUnit> reachableCompilationUnits,
-			ProblemQuery problems2) {
-		// TODO Auto-generated method stub
-		
+			ProblemQuery problems) {
+    	
+        System.out.println("Generating externs report: " + externsReportFile.getAbsolutePath());
+        
+    	ArrayList<String> packageNames = new ArrayList<String>();
+    	
+    	StringBuilder sb = new StringBuilder();
+        sb.append("/**\n");
+        sb.append(" * Generated by Apache Royale Compiler\n");
+        sb.append(" *\n");
+        sb.append(" * @fileoverview\n");
+        sb.append(" * @externs\n");
+        sb.append(" *\n");
+        // need to suppress access controls so access to protected/private from defineProperties
+        // doesn't generate warnings.
+        sb.append(" * @suppress {checkTypes|accessControls}\n");
+        sb.append(" */\n");
+
+    	for (ICompilationUnit cu : reachableCompilationUnits)
+    	{
+    		if (project.isExternalLinkage(cu)) continue;
+    		
+            List<IDefinition> dp = cu.getDefinitionPromises();
+
+            if (dp.size() == 0)
+                return;
+
+            IDefinition def = dp.get(0);
+            IDefinition actualDef = ((DefinitionPromise) def).getActualDefinition();
+            if (actualDef instanceof ClassDefinition)
+            {
+            	sb.append("\n\n");
+            	ClassDefinition cdef = (ClassDefinition)actualDef;
+            	String pkgName = cdef.getPackageName();
+            	if (pkgName.length() > 0 && !packageNames.contains(pkgName))
+            	{
+            		packageNames.add(pkgName);
+            		String[] parts = pkgName.split("\\.");
+            		String current = "";
+            		boolean firstOne = true;
+            		for (String part : parts)
+            		{
+            			current += part;
+        				sb.append("/** @const */\n");
+            			if (firstOne)
+            			{
+            				sb.append("var ");
+            				firstOne = false;
+            			}
+            			sb.append(current);
+            			sb.append(" = {}");
+            			sb.append(ASEmitterTokens.SEMICOLON.getToken() + "\n");
+    	                current += ".";
+            		}
+            	}
+            	sb.append("\n\n");
+            	sb.append("/**\n");
+            	sb.append(" * @constructor\n");
+            	String baseString = cdef.getBaseClassAsDisplayString();
+            	if (baseString.length() > 0)
+            		sb.append(" * @extends {" + baseString + "}\n");
+            	String[] ifaces = cdef.getImplementedInterfacesAsDisplayStrings();
+            	for (String iface : ifaces)
+            		sb.append(" * @implements {" + iface + "}\n");
+            	sb.append(" */\n");
+                sb.append("function " + cdef.getQualifiedName() + "() {}\n");
+                
+            	ASScope cscope = cdef.getContainedScope();
+            	Collection<IDefinitionSet> defSets = cscope.getAllLocalDefinitionSets();
+            	IDefinitionSet[] arrayOfDefSets = new IDefinitionSet[defSets.size()];
+            	defSets.toArray(arrayOfDefSets);
+            	for (IDefinitionSet defSet : arrayOfDefSets)
+            	{
+            		int n = defSet.getSize();
+            		for (int i = 0; i < n; i++)
+            		{
+            			IDefinition api = defSet.getDefinition(i);
+            			if (!api.isOverride() && (api.isProtected() || api.isPublic()))
+            			{
+            				if (!(api instanceof FunctionDefinition) ||
+            						api instanceof AccessorDefinition)
+            				{
+                            	sb.append("\n\n");
+                            	sb.append("/**\n");
+                            	sb.append(" * @type {" + getJSType(api.getTypeAsDisplayString()) + "}\n");
+                            	sb.append(" */\n");
+                            	sb.append(cdef.getQualifiedName() + ".");
+                            	if (!api.isStatic())
+                            		sb.append("prototype.");
+                            	sb.append(api.getBaseName() + ";\n");            					
+            				}
+            				else
+            				{
+            					FunctionDefinition method = (FunctionDefinition)api;
+            					ParameterDefinition[] params = method.getParameters();
+                            	sb.append("\n\n");
+                            	sb.append("/**\n");
+                            	for (ParameterDefinition param : params)
+                            		sb.append(" * @param {" + getJSType(param.getTypeAsDisplayString()) + "} " + param.getBaseName() + "\n");
+                            	String ret = getJSType(method.getReturnTypeAsDisplayString());
+                            	if (!ret.equals("void"))
+                            		sb.append(" * @returns {" + ret + "}\n");
+                            	sb.append(" */\n");
+                            	sb.append(cdef.getQualifiedName() + ".");
+                            	if (!api.isStatic())
+                            		sb.append("prototype.");
+                            	sb.append(api.getBaseName());
+                            	sb.append(" = function(");
+                            	int m = params.length;
+                            	for (int j = 0; j < m; j++)
+                            	{
+                            		if (j > 0)
+                            			sb.append(",");
+                            		sb.append(params[j].getBaseName());
+                            	}
+                            	sb.append(") {");
+                            	if (!ret.equals("void"))
+                            	{
+                            		if (ret.equals("number"))
+                            			sb.append(" return 0; ");
+                            		else if (ret.equals("boolean"))
+                            			sb.append(" return false; ");
+                            		else
+                            			sb.append(" return null; ");
+                            	}
+                            	sb.append("};\n");
+            				}
+            			}
+            		}
+            	}            	
+            }
+            else if (actualDef instanceof InterfaceDefinition)
+            {
+            	sb.append("\n\n");
+            	InterfaceDefinition cdef = (InterfaceDefinition)actualDef;
+            	String pkgName = cdef.getPackageName();
+            	if (pkgName.length() > 0 && !packageNames.contains(pkgName))
+            	{
+            		packageNames.add(pkgName);
+            		String[] parts = pkgName.split("\\.");
+            		String current = "";
+            		boolean firstOne = true;
+            		for (String part : parts)
+            		{
+            			current += part;
+        				sb.append("/** @const */\n");
+            			if (firstOne)
+            			{
+            				sb.append("var ");
+            				firstOne = false;
+            			}
+            			sb.append(current);
+            			sb.append(" = {}");
+            			sb.append(ASEmitterTokens.SEMICOLON.getToken() + "\n");
+    	                current += ".";
+            		}
+            	}
+            	sb.append("\n\n");
+            	sb.append("/**\n");
+            	sb.append(" * @interface\n");
+            	String[] ifaces = cdef.getExtendedInterfacesAsDisplayStrings();
+            	for (String iface : ifaces)
+            		sb.append(" * @extends {" + iface + "}\n");
+            	sb.append(" */\n");
+                sb.append("function " + cdef.getQualifiedName() + "() {}\n");
+            }
+    	}
+        System.out.println("Writing externs report: " + externsReportFile.getAbsolutePath());
+        FileWriter fw;
+		try {
+			fw = new FileWriter(externsReportFile, false);
+            fw.write(sb.toString());
+            fw.close();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
 	}
+    
+    private String getJSType(String s)
+    {
+    	return JSGoogDocEmitter.convertASTypeToJSType(s, "");
+    }
 
 	private void outputResourceBundle(ResourceBundleCompilationUnit cu, File outputFolder) {
 		// TODO Auto-generated method stub