You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2016/10/04 05:34:31 UTC

git commit: [flex-falcon] [refs/heads/develop] - add keep-code-with-metadata option to generate exportSymbol and exportProperty calls that prevent methods with metadata from being removed by the GCC dead code removal

Repository: flex-falcon
Updated Branches:
  refs/heads/develop 506025f4d -> f84ae9ae2


add keep-code-with-metadata option to generate exportSymbol and exportProperty calls that prevent methods with metadata from being removed by the GCC dead code removal


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/f84ae9ae
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/f84ae9ae
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/f84ae9ae

Branch: refs/heads/develop
Commit: f84ae9ae271215bb78f0ac102fdd6492d082b46a
Parents: 506025f
Author: Alex Harui <ah...@apache.org>
Authored: Mon Oct 3 22:34:18 2016 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Mon Oct 3 22:34:18 2016 -0700

----------------------------------------------------------------------
 .../js/flexjs/JSFlexJSEmitterTokens.java        |   1 +
 .../codegen/js/jx/PackageFooterEmitter.java     | 102 ++++++++++++++++++-
 .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java  |  50 +++++++++
 .../driver/js/goog/JSGoogConfiguration.java     |  25 +++++
 .../codegen/js/flexjs/TestFlexJSPackage.java    |  70 +++++++++++++
 5 files changed, 245 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f84ae9ae/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
index 7c62278..4431407 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
@@ -31,6 +31,7 @@ public enum JSFlexJSEmitterTokens implements IEmitterTokens
     FLEXJS_CLASS_INFO_KIND("kind"),
     FLEXJS_CLASS_INFO_CLASS_KIND("class"),
     FLEXJS_CLASS_INFO_INTERFACE_KIND("interface"),
+    GOOG_EXPORT_PROPERTY("goog.exportProperty"),
     GOOG_EXPORT_SYMBOL("goog.exportSymbol"),
     INDENT("  "),
     INTERFACES("interfaces"),

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f84ae9ae/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
index 7509699..feaceb0 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
@@ -209,6 +209,8 @@ public class PackageFooterEmitter extends JSSubEmitter implements
 	    		accessorData,
 	    		methodData,
 	    		metadata);
+	    
+	    emitExportProperties(typeName, exportProperties, exportSymbols);
     }
 
     public enum ReflectionKind{
@@ -243,11 +245,22 @@ public class PackageFooterEmitter extends JSSubEmitter implements
     private ArrayList<AccessorData> accessorData;
     private ArrayList<MethodData> methodData;
 	private ReflectionKind reflectionKind;
+    private ArrayList<String> exportProperties;
+    private ArrayList<String> exportSymbols;
     
     public void collectReflectionData(ITypeNode tnode)
     {
     	JSFlexJSEmitter fjs = (JSFlexJSEmitter)getEmitter();
-    	
+    	exportProperties = new ArrayList<String>();
+    	exportSymbols = new ArrayList<String>();
+		ICompilerProject project = getWalker().getProject();
+    	Set<String> exportMetadata = Collections.<String> emptySet();
+    	if (project instanceof FlexJSProject)
+    	{
+    		FlexJSProject fjsp = ((FlexJSProject)project);
+    		if (fjsp.config != null)
+    			exportMetadata = fjsp.config.getCompilerKeepCodeWithMetadata();
+    	}
     	varData = new ArrayList<VariableData>();
     	accessorData = new ArrayList<AccessorData>();
     	methodData = new ArrayList<MethodData>();
@@ -260,7 +273,6 @@ public class PackageFooterEmitter extends JSSubEmitter implements
 		String name;
 		//bindables:
 		HashMap<String, BindableVarInfo> bindableVars = getModel().getBindableVars();
-		ICompilerProject project = getWalker().getProject();
         boolean isInterface = tnode instanceof IInterfaceNode;
 	    if (!isInterface)
 	        dnodes = ((IClassNode) tnode).getAllMemberNodes();
@@ -322,7 +334,20 @@ public class PackageFooterEmitter extends JSSubEmitter implements
             	    {
             	    	IMetaTagNode[] tags = metaData.getAllTags();
             	    	if (tags.length > 0)
+            	    	{
             	    		data.metaData = tags;
+            	    		for (IMetaTagNode tag : tags)
+            	    		{
+            	    			String tagName =  tag.getTagName();
+            	    			if (exportMetadata.contains(tagName))
+            	    			{
+            	    				if (data.isStatic)
+            	    					exportSymbols.add(data.name);
+            	    				else
+                	    				exportProperties.add(data.name);
+            	    			}
+            	    		}
+            	    	}
             	    }
                 }
             }
@@ -386,7 +411,22 @@ public class PackageFooterEmitter extends JSSubEmitter implements
             	    {
             	    	IMetaTagNode[] tags = metaData.getAllTags();
             	    	if (tags.length > 0)
-                    		data.metaData = tags;
+            	    	{
+            	    		data.metaData = tags;
+        	    			/* accessors don't need exportProp since they are referenced via the defineProp data structure
+            	    		for (IMetaTagNode tag : tags)
+            	    		{
+            	    			String tagName =  tag.getTagName();
+            	    			if (exportMetadata.contains(tagName))
+            	    			{
+            	    				if (data.isStatic)
+            	    					exportSymbols.add(data.name);
+            	    				else
+                	    				exportProperties.add(data.name);
+            	    			}
+            	    		}
+            	    		*/
+            	    	}
             	    }
                 }
             }
@@ -425,7 +465,20 @@ public class PackageFooterEmitter extends JSSubEmitter implements
             	    {
             	    	IMetaTagNode[] tags = metaData.getAllTags();
             	    	if (tags.length > 0)
+            	    	{
             	    		data.metaData = tags;
+            	    		for (IMetaTagNode tag : tags)
+            	    		{
+            	    			String tagName =  tag.getTagName();
+            	    			if (exportMetadata.contains(tagName))
+            	    			{
+            	    				if (data.isStatic)
+            	    					exportSymbols.add(data.name);
+            	    				else
+                	    				exportProperties.add(data.name);
+            	    			}
+            	    		}
+            	    	}
             	    }
 					IParameterNode[] paramNodes = fnNode.getParameterNodes();
 					if (paramNodes != null) {
@@ -908,4 +961,47 @@ public class PackageFooterEmitter extends JSSubEmitter implements
     	value = value.replace("'","\\'");
     	return value;
 	}
+    
+    public void emitExportProperties(String typeName, ArrayList<String> exportProperties, ArrayList<String> exportSymbols)
+    {
+    	for (String prop : exportSymbols)
+    	{
+    		write(JSFlexJSEmitterTokens.GOOG_EXPORT_SYMBOL);
+    		write(ASEmitterTokens.PAREN_OPEN);
+    		write(ASEmitterTokens.SINGLE_QUOTE);
+    		write(typeName);
+    		write(ASEmitterTokens.MEMBER_ACCESS);
+    		write(prop);
+    		write(ASEmitterTokens.SINGLE_QUOTE);
+    		write(ASEmitterTokens.COMMA);
+    		write(ASEmitterTokens.SPACE);
+    		write(typeName);
+    		write(ASEmitterTokens.MEMBER_ACCESS);
+    		write(prop);
+    		write(ASEmitterTokens.PAREN_CLOSE);
+    		writeNewline(ASEmitterTokens.SEMICOLON);
+    	}
+    	for (String prop : exportProperties)
+    	{
+    		write(JSFlexJSEmitterTokens.GOOG_EXPORT_PROPERTY);
+    		write(ASEmitterTokens.PAREN_OPEN);
+    		write(typeName);
+    		write(ASEmitterTokens.MEMBER_ACCESS);
+    		write(JSEmitterTokens.PROTOTYPE);
+    		write(ASEmitterTokens.COMMA);
+    		write(ASEmitterTokens.SPACE);
+    		write(ASEmitterTokens.SINGLE_QUOTE);
+    		write(prop);
+    		write(ASEmitterTokens.SINGLE_QUOTE);
+    		write(ASEmitterTokens.COMMA);
+    		write(ASEmitterTokens.SPACE);
+    		write(typeName);
+    		write(ASEmitterTokens.MEMBER_ACCESS);
+    		write(JSEmitterTokens.PROTOTYPE);
+    		write(ASEmitterTokens.MEMBER_ACCESS);
+    		write(prop);
+    		write(ASEmitterTokens.PAREN_CLOSE);
+    		writeNewline(ASEmitterTokens.SEMICOLON);
+    	}
+    }
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f84ae9ae/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
index dd02e85..f42692f 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
@@ -665,6 +665,11 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
     {
         JSFlexJSEmitter asEmitter = (JSFlexJSEmitter)((IMXMLBlockWalker) getMXMLWalker()).getASEmitter();
         FlexJSProject fjs = (FlexJSProject) getMXMLWalker().getProject();
+    	ArrayList<String> exportProperties = new ArrayList<String>();
+    	ArrayList<String> exportSymbols = new ArrayList<String>();
+    	Set<String> exportMetadata = Collections.<String> emptySet();
+    	if (fjs.config != null)
+    		exportMetadata = fjs.config.getCompilerKeepCodeWithMetadata();
         ArrayList<PackageFooterEmitter.VariableData> varData = new ArrayList<PackageFooterEmitter.VariableData>();
         // vars can only come from script blocks?
         List<IVariableNode> vars = asEmitter.getModel().getVars();
@@ -684,7 +689,20 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         	    {
         	    	IMetaTagNode[] tags = metaData.getAllTags();
         	    	if (tags.length > 0)
+        	    	{
         	    		data.metaData = tags;
+        	    		for (IMetaTagNode tag : tags)
+        	    		{
+        	    			String tagName =  tag.getTagName();
+        	    			if (exportMetadata.contains(tagName))
+        	    			{
+        	    				if (data.isStatic)
+        	    					exportSymbols.add(data.name);
+        	    				else
+            	    				exportProperties.add(data.name);
+        	    			}
+        	    		}
+        	    	}
         	    }
             }
         }
@@ -725,7 +743,22 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         	    {
         	    	IMetaTagNode[] tags = metaData.getAllTags();
         	    	if (tags.length > 0)
+        	    	{
         	    		data.metaData = tags;
+        	    		for (IMetaTagNode tag : tags)
+        	    		{
+        	    			String tagName =  tag.getTagName();
+        	    			/* accessors don't need exportProp since they are referenced via the defineProp data structure
+        	    			if (exportMetadata.contains(tagName))
+        	    			{
+        	    				if (data.isStatic)
+        	    					exportSymbols.add(data.name);
+        	    				else
+            	    				exportProperties.add(data.name);
+        	    			}
+        	    			*/
+        	    		}
+        	    	}
         	    }
             }
         }
@@ -797,7 +830,20 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         	    {
         	    	IMetaTagNode[] tags = metaData.getAllTags();
         	    	if (tags.length > 0)
+        	    	{
         	    		data.metaData = tags;
+        	    		for (IMetaTagNode tag : tags)
+        	    		{
+        	    			String tagName =  tag.getTagName();
+        	    			if (exportMetadata.contains(tagName))
+        	    			{
+        	    				if (data.isStatic)
+        	    					exportSymbols.add(data.name);
+        	    				else
+            	    				exportProperties.add(data.name);
+        	    			}
+        	    		}
+        	    	}
         	    }
             }
         }
@@ -839,6 +885,10 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         		accessorData,
                 methodData,
                 metadataTagNodes.toArray(metaDataTags));
+        asEmitter.packageFooterEmitter.emitExportProperties(
+                formatQualifiedName(cdef.getQualifiedName()),
+                exportProperties,
+                exportSymbols);
     }
 
     //--------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f84ae9ae/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/js/goog/JSGoogConfiguration.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/js/goog/JSGoogConfiguration.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/js/goog/JSGoogConfiguration.java
index 40bdcfc..0c6df76 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/js/goog/JSGoogConfiguration.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/js/goog/JSGoogConfiguration.java
@@ -23,7 +23,10 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URLDecoder;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.flex.compiler.clients.JSConfiguration;
 import org.apache.flex.compiler.clients.MXMLJSC;
@@ -373,5 +376,27 @@ public class JSGoogConfiguration extends JSConfiguration
         this.htmlOutputFileName = filename;
     }
 
+    //
+    // 'compiler.keep-code-with-metadata' option
+    //
+
+    private Set<String> keepCodeWithMetadata = null;
+
+    public Set<String> getCompilerKeepCodeWithMetadata()
+    {
+        return keepCodeWithMetadata == null ? Collections.<String> emptySet() : keepCodeWithMetadata;
+    }
+
+    @Config(advanced = true, allowMultiple = true)
+    @Mapping({ "compiler", "keep-code-with-metadata" })
+    @Arguments("name")
+    @InfiniteArguments
+    public void setCompilerKeepCodeWithMetadata(ConfigurationValue cv, List<String> values)
+    {
+        if (keepCodeWithMetadata == null)
+        	keepCodeWithMetadata = new HashSet<String>();
+        keepCodeWithMetadata.addAll(values);
+    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/f84ae9ae/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
index e1b8cad..7230646 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
@@ -41,7 +41,11 @@ public class TestFlexJSPackage extends TestGoogPackage
     	JSGoogConfiguration config = new JSGoogConfiguration();
     	ArrayList<String> values = new ArrayList<String>();
     	values.add("Event");
+    	values.add("Before");
     	config.setCompilerKeepAs3Metadata(null, values);
+    	ArrayList<String> values2 = new ArrayList<String>();
+    	values2.add("Before");
+    	config.setCompilerKeepCodeWithMetadata(null, values2);
     	((FlexJSProject)project).config = config;
         super.setUp();
     }
@@ -343,6 +347,72 @@ public class TestFlexJSPackage extends TestGoogPackage
     }
 
     @Test
+    public void testPackageQualified_ExportPropertyForMetadata()
+    {
+        IFileNode node = compileAS("package foo.bar.baz {[Event(name='add', type='mx.events.FlexEvent')]\npublic class A{public function A(){}\n[Before]\npublic function foo() {}}}");
+        asBlockWalker.visitFile(node);
+        assertOutWithMetadata("/**\n" +
+        		" * foo.bar.baz.A\n" +
+        		" *\n" +
+        		" * @fileoverview\n" +
+        		" *\n" +
+        		" * @suppress {checkTypes|accessControls}\n" +
+        		" */\n" +
+        		"\n" +
+        		"goog.provide('foo.bar.baz.A');\n" +
+        		"\n" +
+        		"\n" +
+        		"\n" +
+        		"/**\n" +
+        		" * @constructor\n" +
+        		" */\n" +
+        		"foo.bar.baz.A = function() {\n" +
+        		"};\n" +
+        		"\n" +
+        		"\n" +
+        		"/**\n" +
+        		" * @export\n" +
+        		" */\n" +
+        		"foo.bar.baz.A.prototype.foo = function() {\n};\n" +
+        		"\n" +
+        		"\n" +
+        		"/**\n" +
+        		" * Metadata\n" +
+        		" *\n" +
+        		" * @type {Object.<string, Array.<Object>>}\n" +
+        		" */\n" +
+        		"foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A', kind: 'class' }] };\n" +
+        		"\n" +
+        		"\n" +
+        		"/**\n" +
+        		" * Prevent renaming of class. Needed for reflection.\n" +
+        		" */\n" +
+        		"goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+        		"\n" +
+        		"\n" +
+        		"\n" +
+        		"/**\n" +
+        		" * Reflection\n" +
+        		" *\n" +
+        		" * @return {Object.<string, Function>}\n" +
+        		" */\n" +
+        		"foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+        		"  return {\n" +
+				"    variables: function () {return {};},\n" +
+				"    accessors: function () {return {};},\n" +
+        		"    methods: function () {\n" +
+        		"      return {\n" +
+        		"        'A': { type: '', declaredBy: 'foo.bar.baz.A'},\n" +
+        		"        'foo': { type: '', declaredBy: 'foo.bar.baz.A', metadata: function () { return [ { name: 'Before' } ]; }}\n" +
+        		"      };\n" +
+        		"    },\n" +
+        		"    metadata: function () { return [ { name: 'Event', args: [ { key: 'name', value: 'add' }, { key: 'type', value: 'mx.events.FlexEvent' } ] } ]; }\n" +
+        		"  };\n" +
+        		"};\n" +
+        		"goog.exportProperty(foo.bar.baz.A.prototype, 'foo', foo.bar.baz.A.prototype.foo);\n");
+    }
+
+    @Test
     public void testPackageQualified_ClassAndInternalClass()
     {
         IFileNode node = compileAS("package foo.bar.baz {\n" +