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/04/06 17:02:17 UTC

[08/50] git commit: [flex-falcon] [refs/heads/master] - first attempt at Proxy support

first attempt at Proxy support


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

Branch: refs/heads/master
Commit: c71abdbfa5f23c4ecfa751b860554cefeeaf591f
Parents: f05767e
Author: Alex Harui <ah...@apache.org>
Authored: Fri Feb 19 06:57:14 2016 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Fri Feb 19 06:57:14 2016 -0800

----------------------------------------------------------------------
 .../js/flexjs/TestFlexJSGlobalClasses.java      | 64 ++++++++++++++++++++
 .../flex/compiler/internal/test/TestBase.java   |  3 +
 .../codegen/js/flexjs/JSFlexJSEmitter.java      | 51 ++++++++++++++++
 .../codegen/js/jx/BinaryOperatorEmitter.java    | 38 ++++++++++++
 .../internal/codegen/js/jx/ForEachEmitter.java  | 17 ++++++
 .../codegen/js/jx/MemberAccessEmitter.java      | 33 ++++++++++
 .../flex/compiler/config/Configuration.java     | 46 ++++++++++++--
 .../compiler/internal/projects/FlexProject.java | 17 ++++++
 .../projects/FlexProjectConfigurator.java       |  2 +
 .../internal/tree/as/IdentifierNode.java        |  4 +-
 10 files changed, 268 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c71abdbf/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
index 547a9ed..b67ded1 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
@@ -27,6 +27,7 @@ import org.apache.flex.compiler.internal.projects.FlexJSProject;
 import org.apache.flex.compiler.internal.tree.as.VariableNode;
 import org.apache.flex.compiler.tree.as.IASNode;
 import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
+import org.apache.flex.compiler.tree.as.IExpressionNode;
 import org.apache.flex.compiler.tree.as.IForLoopNode;
 import org.apache.flex.compiler.tree.as.IFunctionNode;
 import org.apache.flex.compiler.tree.as.IUnaryOperatorNode;
@@ -44,6 +45,7 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
     {
     	project = new FlexJSProject(workspace);
     	((FlexJSProject)project).config = new JSGoogConfiguration();
+    	project.setProxyBaseClass("flash.utils.Proxy");
         super.setUp();
     }
 
@@ -469,4 +471,66 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
         asBlockWalker.visitVariable(node);
         assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
     }
+    
+    
+    @Test
+    public void testProxy()
+    {
+        IFunctionNode node = (IFunctionNode) getNode(
+                "import flash.utils.Proxy; public class B {public function b() { var a:Proxy = new Proxy();a.foo = 'bar'; }}",
+                IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
+        asBlockWalker.visitFunction(node);
+        assertOut("/**\n * @export\n */\nfoo.bar.B.prototype.b = function() {\n  var /** @type {flash.utils.Proxy} */ a = new flash.utils.Proxy();\n  a.setProperty('foo', 'bar');\n}");
+    }
+    
+    @Test
+    public void testProxyGet()
+    {
+        IFunctionNode node = (IFunctionNode) getNode(
+                "import flash.utils.Proxy; public class B {public function b() { var a:Proxy = new Proxy();var bar:* = a.foo; }}",
+                IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
+        asBlockWalker.visitFunction(node);
+        assertOut("/**\n * @export\n */\nfoo.bar.B.prototype.b = function() {\n  var /** @type {flash.utils.Proxy} */ a = new flash.utils.Proxy();\n  var /** @type {*} */ bar = a.getProperty('foo');\n}");
+    }
+    
+    @Test
+    public void testProxyConcat()
+    {
+        IFunctionNode node = (IFunctionNode) getNode(
+                "import flash.utils.Proxy; public class B {public function b() { var a:Proxy = new Proxy();var baz:String = a.foo + 'bar'; }}",
+                IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
+        asBlockWalker.visitFunction(node);
+        assertOut("/**\n * @export\n */\nfoo.bar.B.prototype.b = function() {\n  var /** @type {flash.utils.Proxy} */ a = new flash.utils.Proxy();\n  var /** @type {string} */ baz = a.getProperty('foo') + 'bar';\n}");
+    }
+    
+    @Test
+    public void testProxyAddAndAssign()
+    {
+        IFunctionNode node = (IFunctionNode) getNode(
+                "import flash.utils.Proxy; public class B {public function b() { var a:Proxy = new Proxy();a.foo += 'bar'; }}",
+                IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
+        asBlockWalker.visitFunction(node);
+        assertOut("/**\n * @export\n */\nfoo.bar.B.prototype.b = function() {\n  var /** @type {flash.utils.Proxy} */ a = new flash.utils.Proxy();\n  a.setProperty('foo', a.getProperty('foo') + 'bar');\n}");
+    }
+    
+    @Test
+    public void testProxyForLoop()
+    {
+    	IForLoopNode node = (IForLoopNode) getNode(
+                "import flash.utils.Proxy; public class B {public function b() { var a:Proxy = new Proxy();for (var p:* in a) delete a[p];; }}",
+                IForLoopNode.class, WRAP_LEVEL_PACKAGE, true);
+        asBlockWalker.visitForLoop(node);
+        assertOut("for (var /** @type {*} */ p in a.propertyNames())\n  a.deleteProperty(p);");
+    }
+    
+    @Test
+    public void testProxyForEachLoop()
+    {
+    	IForLoopNode node = (IForLoopNode) getNode(
+                "import flash.utils.Proxy; public class B {public function b() { var a:Proxy = new Proxy();for each (var p:String in a) var i:int = p.length; }}",
+                IForLoopNode.class, WRAP_LEVEL_PACKAGE, true);
+        asBlockWalker.visitForLoop(node);
+        assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in foreachiter0_target.propertyNames()) \n{\nvar p = foreachiter0_target.getProperty(foreachiter0);\n\n  var /** @type {number} */ i = p.length;}\n");
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c71abdbf/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
index 7b83e79..edaa29f 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
@@ -110,7 +110,10 @@ public class TestBase implements ITestBase
         errors = new ArrayList<ICompilerProblem>();
 
         if (project == null)
+        {
         	project = new FlexProject(workspace);
+        	project.setProxyBaseClass("flash.utils.Proxy");
+        }
         project.setProblems(errors);
         FlexProjectConfigurator.configure(project);
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c71abdbf/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index 6fb1f11..70dbb58 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -28,6 +28,7 @@ import org.apache.flex.compiler.codegen.js.goog.IJSGoogDocEmitter;
 import org.apache.flex.compiler.definitions.IClassDefinition;
 import org.apache.flex.compiler.definitions.IDefinition;
 import org.apache.flex.compiler.definitions.IPackageDefinition;
+import org.apache.flex.compiler.definitions.ITypeDefinition;
 import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
 import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitter;
 import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
@@ -667,6 +668,21 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         		            write(ASEmitterTokens.PAREN_CLOSE);
         		        return;        				
         			}
+        			else if (isProxy((IdentifierNode)(node.getChild(0).getChild(0))))
+        			{
+        		        if (ASNodeUtils.hasParenOpen(node))
+        		            write(ASEmitterTokens.PAREN_OPEN);
+        		        
+        	            getWalker().walk(node.getChild(0).getChild(0));
+        	            DynamicAccessNode dan = (DynamicAccessNode)(node.getChild(0));
+        	            IASNode indexNode = dan.getChild(1);
+        	            write(".deleteProperty(");
+        	            getWalker().walk(indexNode);
+        	            write(")");
+        		        if (ASNodeUtils.hasParenClose(node))
+        		            write(ASEmitterTokens.PAREN_CLOSE);
+        		        return;        				
+        			}
         		}
 
         	}
@@ -758,6 +774,41 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
      * @param obj
      * @return
      */
+    public boolean isProxy(IExpressionNode obj)
+    {
+		FlexJSProject project = (FlexJSProject)getWalker().getProject();
+		// See if it is Proxy
+		ITypeDefinition leftDef = obj.resolveType(project);
+		if (leftDef == null)
+		{
+			if (obj.getNodeID() == ASTNodeID.MemberAccessExpressionID)
+			{
+				IExpressionNode leftNode = ((MemberAccessExpressionNode)obj).getLeftOperandNode();
+				leftDef = leftNode.resolveType(project);
+				if (leftDef != null && leftDef.isInstanceOf(project.getProxyBaseClass(), project))
+					return true;
+				while (leftNode.getNodeID() == ASTNodeID.MemberAccessExpressionID)
+				{
+					// walk up chain looking for a proxy
+					leftNode = ((MemberAccessExpressionNode)obj).getLeftOperandNode();
+					leftDef = leftNode.resolveType(project);
+					if (leftDef != null && leftDef.isInstanceOf(project.getProxyBaseClass(), project))
+						return true;
+				}
+			}
+			return false;
+		}
+		return leftDef.isInstanceOf(project.getProxyBaseClass(), project);
+    }
+    
+    /**
+     * resolveType on an XML expression returns null
+     * (see IdentiferNode.resolveType).
+     * So, we have to walk the tree ourselves and resolve
+     * individual pieces.
+     * @param obj
+     * @return
+     */
     public boolean isXML(IExpressionNode obj)
     {
 		// See if the left side is XML or XMLList

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c71abdbf/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
index 5b200de..03a0f2c 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
@@ -184,6 +184,39 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
 	                    return;
                 	}
                 }
+                else if (((JSFlexJSEmitter)getEmitter()).isProxy((MemberAccessExpressionNode)leftSide))
+                {
+                	MemberAccessExpressionNode proxyNode = (MemberAccessExpressionNode)leftSide;
+                	if (node.getNodeID() == ASTNodeID.Op_AssignId)
+                	{
+	                    getWalker().walk(proxyNode.getLeftOperandNode());
+	                    IExpressionNode rightSide = proxyNode.getRightOperandNode();
+	                    write(".setProperty('");
+	                    getWalker().walk(rightSide);
+	                    write("', ");
+	                    getWalker().walk(node.getRightOperandNode());
+	                    write(ASEmitterTokens.PAREN_CLOSE);
+	                    return;
+                	}
+                	else if (node.getNodeID() == ASTNodeID.Op_AddAssignID)
+                	{
+	                    IExpressionNode rightSide = proxyNode.getRightOperandNode();
+	                    getWalker().walk(proxyNode.getLeftOperandNode());
+	                    write(".setProperty('");
+	                    getWalker().walk(rightSide);
+	                    write("', ");
+	                    getWalker().walk(proxyNode.getLeftOperandNode());
+	                    write(".getProperty(");
+	                    write(ASEmitterTokens.SINGLE_QUOTE);
+	                    getWalker().walk(rightSide);
+	                    write(ASEmitterTokens.SINGLE_QUOTE);
+	                    write(ASEmitterTokens.PAREN_CLOSE);
+	                    write(" + ");
+	                    getWalker().walk(node.getRightOperandNode());
+	                    write(ASEmitterTokens.PAREN_CLOSE);
+	                    return;
+                	}
+                }
             }
 
             super_emitBinaryOperator(node);
@@ -325,6 +358,11 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
                 {
                 	write(".elementNames()");
                 }   
+                else if (node.getNodeID() == ASTNodeID.Op_InID &&
+                        ((JSFlexJSEmitter)getEmitter()).isProxy(node.getRightOperandNode()))
+                {
+                	write(".propertyNames()");
+                }   
         }
 
         if (ASNodeUtils.hasParenOpen(node))

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c71abdbf/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
index 62382fe..501f5ae 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ForEachEmitter.java
@@ -86,6 +86,7 @@ public class ForEachEmitter extends JSSubEmitter implements
         write(ASEmitterTokens.SPACE);
         write(targetName);
         boolean isXML = false;
+        boolean isProxy = false;
         if (obj.getNodeID() == ASTNodeID.IdentifierID)
         {
         	if (((JSFlexJSEmitter)getEmitter()).isXML((IdentifierNode)obj))
@@ -93,6 +94,11 @@ public class ForEachEmitter extends JSSubEmitter implements
         		write(".elementNames()");
         		isXML = true;
         	}
+            if (((JSFlexJSEmitter)getEmitter()).isProxy((IdentifierNode)obj))
+            {
+                write(".propertyNames()");
+                isProxy = true;
+            }
         }
         else if (obj.getNodeID() == ASTNodeID.MemberAccessExpressionID)
         {
@@ -101,6 +107,11 @@ public class ForEachEmitter extends JSSubEmitter implements
                 write(".elementNames()");
                 isXML = true;
             }
+            if (((JSFlexJSEmitter)getEmitter()).isProxy((MemberAccessExpressionNode)obj))
+            {
+                write(".propertyNames()");
+                isXML = true;
+            }
         }
         writeToken(ASEmitterTokens.PAREN_CLOSE);
         writeNewline();
@@ -124,6 +135,12 @@ public class ForEachEmitter extends JSSubEmitter implements
         	write(iterName);
         	write(")");
         }
+        else if (isProxy)
+        {
+            write(".getProperty(");
+            write(iterName);
+            write(")");
+        }
         else
         {
 	        write(ASEmitterTokens.SQUARE_OPEN);

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c71abdbf/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
index 2f5aa55..518def2 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
@@ -70,10 +70,15 @@ public class MemberAccessEmitter extends JSSubEmitter implements
         	// could be XML
         	JSFlexJSEmitter fjs = (JSFlexJSEmitter)getEmitter();
         	boolean isXML = false;
+        	boolean isProxy = false;
         	if (leftNode instanceof MemberAccessExpressionNode)
         		isXML = fjs.isXMLList((MemberAccessExpressionNode)leftNode);
         	else if (leftNode instanceof IExpressionNode)
         		isXML = fjs.isXML((IExpressionNode)leftNode);
+        	if (leftNode instanceof MemberAccessExpressionNode)
+        		isProxy = fjs.isProxy((MemberAccessExpressionNode)leftNode);
+        	else if (leftNode instanceof IExpressionNode)
+        		isProxy = fjs.isProxy((IExpressionNode)leftNode);
         	if (isXML)
         	{
         		boolean descendant = (node.getOperator() == OperatorType.DESCENDANT_ACCESS);
@@ -105,6 +110,34 @@ public class MemberAccessEmitter extends JSSubEmitter implements
 	        		return;
 	        	}
         	}
+        	else if (isProxy)
+        	{
+        		boolean child = (node.getOperator() == OperatorType.MEMBER_ACCESS) && 
+        							(!(parentNode instanceof FunctionCallNode)) &&
+        							rightNode.getNodeID() != ASTNodeID.Op_AtID;
+        		if (child)
+	        	{
+	        		writeLeftSide(node, leftNode, rightNode);
+	        		if (child)
+	        			write(".getProperty('");
+	        		String s = fjs.stringifyNode(rightNode);
+	        		int dot = s.indexOf('.');
+	        		if (dot != -1)
+	        		{
+	        			String name = s.substring(0, dot);
+	        			String afterDot = s.substring(dot);
+	        			write(name);
+	        			write("')");
+	        			write(afterDot);
+	        		}
+	        		else
+	        		{
+	        			write(s);
+	        			write("')");
+	        		}
+	        		return;
+	        	}
+        	}
         }
         boolean isStatic = false;
         if (def != null && def.isStatic())

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c71abdbf/compiler/src/org/apache/flex/compiler/config/Configuration.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/config/Configuration.java b/compiler/src/org/apache/flex/compiler/config/Configuration.java
index 35d2c4a..79c98be 100644
--- a/compiler/src/org/apache/flex/compiler/config/Configuration.java
+++ b/compiler/src/org/apache/flex/compiler/config/Configuration.java
@@ -1720,6 +1720,26 @@ public class Configuration
     }
 
     //
+    // 'compiler.proxy-base-class' option
+    //
+
+    private String proxyBaseClass = "org.apache.flex.utils.Proxy";
+
+    public String getProxyBaseClass()
+    {
+        return proxyBaseClass;
+    }
+
+    /**
+     * The class for proxy code generation
+     */
+    @Config(advanced = true)
+    public void setCompilerProxyBaseClass(ConfigurationValue cv, String b)
+    {
+        proxyBaseClass = b;
+    }
+
+    //
     // 'compiler.component-factory-class' option
     //
 
@@ -3952,19 +3972,35 @@ public class Configuration
             {
                 try
                 {
-                    File f = new File("unittest.properties");
+                    File f = new File("../env.properties");
                     in = new FileInputStream(f);
                     properties = new Properties();
                     properties.load(in);
                     in.close();
-                    properties.setProperty("env.PLAYERGLOBAL_HOME", properties.getProperty("PLAYERGLOBAL_HOME"));
-                    properties.setProperty("env.AIR_HOME", properties.getProperty("AIR_HOME"));
-                    properties.setProperty("env.PLAYERGLOBAL_VERSION", properties.getProperty("PLAYERGLOBAL_VERSION"));
                     return properties;
                 }
                 catch (FileNotFoundException e)
                 {
-                    return null;
+                    try
+                    {
+                        File f = new File("unittest.properties");
+                        in = new FileInputStream(f);
+                        properties = new Properties();
+                        properties.load(in);
+                        in.close();
+                        properties.setProperty("env.PLAYERGLOBAL_HOME", properties.getProperty("PLAYERGLOBAL_HOME"));
+                        properties.setProperty("env.AIR_HOME", properties.getProperty("AIR_HOME"));
+                        properties.setProperty("env.PLAYERGLOBAL_VERSION", properties.getProperty("PLAYERGLOBAL_VERSION"));
+                        return properties;
+                    }
+                    catch (FileNotFoundException e1)
+                    {
+                        return null;
+                    }
+                    catch (IOException e1)
+                    {
+                        return null;
+                    }
                 }
                 catch (IOException e)
                 {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c71abdbf/compiler/src/org/apache/flex/compiler/internal/projects/FlexProject.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/projects/FlexProject.java b/compiler/src/org/apache/flex/compiler/internal/projects/FlexProject.java
index 5c98e5e..574285d 100644
--- a/compiler/src/org/apache/flex/compiler/internal/projects/FlexProject.java
+++ b/compiler/src/org/apache/flex/compiler/internal/projects/FlexProject.java
@@ -255,6 +255,13 @@ public class FlexProject extends ASProject implements IFlexProject
     private String factoryInterface;
     
     /**
+     * The fully-qualified name of the proxy base class
+     * that causes the compiler to generate getProperty/setProperty calls.
+     * Currently this is "flash.utils.Proxy".
+     */
+    private String proxyBaseClass;
+    
+    /**
      * The fully-qualified name of the runtime class
      * that creates an IFactory from a class.
      * Currently this is "mx.core.ClassFactory".
@@ -741,6 +748,16 @@ public class FlexProject extends ASProject implements IFlexProject
         this.mxmlObjectInterface = mxmlObjectInterface;
     }
 
+    public String getProxyBaseClass()
+    {
+        return proxyBaseClass;
+    }
+    
+    public void setProxyBaseClass(String proxyBaseClass)
+    {
+        this.proxyBaseClass = proxyBaseClass;
+    }
+    
     public String getClassFactoryClass()
     {
         return classFactoryClass;

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c71abdbf/compiler/src/org/apache/flex/compiler/internal/projects/FlexProjectConfigurator.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/projects/FlexProjectConfigurator.java b/compiler/src/org/apache/flex/compiler/internal/projects/FlexProjectConfigurator.java
index 13b1fd4..04f385b 100644
--- a/compiler/src/org/apache/flex/compiler/internal/projects/FlexProjectConfigurator.java
+++ b/compiler/src/org/apache/flex/compiler/internal/projects/FlexProjectConfigurator.java
@@ -240,6 +240,8 @@ public class FlexProjectConfigurator
             configValue = configuration.getComponentFactoryClass();
             project.setClassFactoryClass(configValue);
 
+            configValue = configuration.getProxyBaseClass();
+            project.setProxyBaseClass(configValue);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c71abdbf/compiler/src/org/apache/flex/compiler/internal/tree/as/IdentifierNode.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/tree/as/IdentifierNode.java b/compiler/src/org/apache/flex/compiler/internal/tree/as/IdentifierNode.java
index c47a48a..1d18923 100644
--- a/compiler/src/org/apache/flex/compiler/internal/tree/as/IdentifierNode.java
+++ b/compiler/src/org/apache/flex/compiler/internal/tree/as/IdentifierNode.java
@@ -842,8 +842,8 @@ public class IdentifierNode extends ExpressionNodeBase implements IIdentifierNod
                     // and x is type XML you would get a can't-convert-Object-to-String
                     // problem, but there is lots of existing source code that expects
                     // this to compile with no cast.
-                    if (isXMLish(baseType, project))
-                        return null;
+                    //if (isXMLish(baseType, project))
+                    //    return null;
                     
                     if (baseExpr instanceof IdentifierNode)
                     {