My latest improvements to the compiler should resolve these 5 issues with 
coercion.

- Josh

On 2019/02/19 16:03:05, Josh Tynjala <joshtynj...@apache.org> wrote: 
> 1. b.moveTo(Number(path.pathPoints[0].anchor.x), 
> Number(path.pathPoints[0].anchor.y));
> 
> I have determined that the compiler is not correctly resolving the type of 
> pathPoints[0]. It should be PathPointVO because we're dealing with a Vector, 
> but it's being resolved as * instead, which is how regular Arrays are handled.
> 
> I can see that this issue with resolving the type also affects code 
> intelligence in VSCode. Members of PathPointVO are not available in the 
> completion list for pathPoints[0].
> 
> I have checked Flash Builder, and the type of a Vector item seems to be known 
> because the correct completion items are suggested. Additionally, a compiler 
> error is created for the following code in Flash Builder, but not from Royale:
> 
> var firstItem:SomeOtherType = pathPoints[0];
> 
> > Error: Implicit coercion of a value with static type PathPointVO to a 
> > possibly unrelated type SomeOtherType.
> 
> This indicates to me that Adobe fixed this issue in ASC 2.0 after the 
> donation of "Falcon" to Apache, and we should do the same.
> 
> Once the correct type is resolved here, there won't be any coercion emitted.
> 
>  2. paragraph.setStyle("tabXML", 
> escape(org.apache.royale.utils.Language.string(para.tabXML.toXMLString())));
> 
> Confirmed.
> 
> Interestingly, in VSCode, toXMLString() is provided in the completion list, 
> but hover and goto definition are not working on it. This indicates to me 
> that the compiler is not correctly resolving toXMLString(), so it's falling 
> back to * for the type.
> 
> Also interestingly, Flash Builder provides hover for toXMLString(), but no 
> compiler error when assigning to another type. I suspect that XML is getting 
> special treatment in FB, and ASC 2.0 does not resolve the type of anything on 
> XML either.
> 
> It looks like the emitter needs a special case for XML and I can manually 
> resolve certain types. There may be some logic for this already in one of the 
> emitters. I'll make sure that it works the same everywhere.
> 
> 3. 
> doc.retrieveFile(org.apache.royale.utils.Language.string(file.attribute('loc').toString()));
> 
> This is basically the same as 2. Lack of type resolution for XML.
> 
> 4. stroke.setLineStyle(1, 65535, 1);
> 
> This was a result of ensuring that numeric literals are emitted correctly for 
> integers. The value is the same, but it's just formatted a different way. I 
> think that I had the option of emitting the literal with a specific radix, so 
> I may be able to detect and preserve the 0x formatting.
> 
> 5. 
> xml.setNodeKind(org.apache.royale.utils.Language.string(this.XML__nodeKind));
> 
> This looks to be the same as 2 and 3. Again, lack of type resolution for XML.
> 
> - Josh
> 
> On 2019/02/10 10:02:53, Harbs <harbs.li...@gmail.com> wrote: 
> > The commit seems to break some things for me.
> > 
> > I’m working on finding the exact problem, but I’m noticing issues along the 
> > way:
> > 
> > 1.
> > In function:
> > function drawPath(path:BezierPathVO,b:PathBuilder):void
> > 
> > The following:
> > b.moveTo(path.pathPoints[0].anchor.x,path.pathPoints[0].anchor.y);
> > 
> > compiles to:
> > b.moveTo(Number(path.pathPoints[0].anchor.x), 
> > Number(path.pathPoints[0].anchor.y));
> > 
> > pathPoints is of type Vector.<PathPointVO>
> > and PathPointVO anchor is of type Point
> > 
> > x and y should be inferrable that they are Numbers and it should compile 
> > unchanged.
> > 
> > 2.
> > paragraph.setStyle("tabXML", escape(para.tabXML.toXMLString()));
> > 
> > Compiles to:
> > paragraph.setStyle("tabXML", 
> > escape(org.apache.royale.utils.Language.string(para.tabXML.toXMLString())));
> > 
> > para.tabXML is typed as XML and toXMLString() should be recognizable as a 
> > String and Language.string() should not be called.
> > 
> > 3.
> > var file:XML = files[i];
> > doc.retrieveFile(file.@loc.toString());
> > 
> > Compiles to:
> > doc.retrieveFile(org.apache.royale.utils.Language.string(file.attribute('loc').toString()));
> > 
> > The compiler should know that toString() is a string and doesn’t need 
> > Language.string()
> > 
> > 4.
> > Another interesting change:
> > stroke.setLineStyle(1,0x00FFFF,1);
> > 
> > Now becomes:
> > stroke.setLineStyle(1, 65535, 1);
> > 
> > I’m not sure whether this is something we should be concerned about or not.
> > 
> > 5.
> > XML has many cases where you have something like this:
> > xml.setNodeKind(_nodeKind);
> > becomes
> > xml.setNodeKind(org.apache.royale.utils.Language.string(this.XML__nodeKind));
> > 
> > Although everything is strings…
> > 
> > 
> > 
> > 
> > 
> > 
> > > On Feb 6, 2019, at 6:40 PM, joshtynj...@apache.org wrote:
> > > 
> > > This is an automated email from the ASF dual-hosted git repository.
> > > 
> > > joshtynjala pushed a commit to branch develop
> > > in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
> > > 
> > > commit fd7b81f4448db0f5eb70f22208c9144549cc4806
> > > Author: Josh Tynjala <joshtynj...@apache.org>
> > > AuthorDate: Wed Feb 6 08:36:10 2019 -0800
> > > 
> > >    ParametersEmitter: fixed automatic type coercion and added some tests 
> > > (closes #74)
> > > ---
> > > .../js/jx/FunctionCallArgumentsEmitter.java        | 10 +++++--
> > > .../codegen/js/royale/TestRoyaleExpressions.java   | 34 
> > > +++++++++++++++++++++-
> > > 2 files changed, 40 insertions(+), 4 deletions(-)
> > > 
> > > diff --git 
> > > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java
> > >  
> > > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java
> > > index 40b6302..c92f189 100644
> > > --- 
> > > a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java
> > > +++ 
> > > b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/FunctionCallArgumentsEmitter.java
> > > @@ -61,17 +61,21 @@ public class FunctionCallArgumentsEmitter extends 
> > > JSSubEmitter implements
> > >         for (int i = 0; i < len; i++)
> > >         {
> > >             IExpressionNode argumentNode = (IExpressionNode) 
> > > node.getChild(i);
> > > -            IParameterDefinition paramDef = null;
> > > +            IDefinition paramTypeDef = null;
> > >             if (paramDefs != null && paramDefs.length > i)
> > >             {
> > > -                paramDef = paramDefs[i];
> > > +                IParameterDefinition paramDef = paramDefs[i];
> > >                 if (paramDef.isRest())
> > >                 {
> > >                     paramDef = null;
> > >                 }
> > > +                if (paramDef != null)
> > > +                {
> > > +                    paramTypeDef = paramDef.resolveType(getProject());
> > > +                }
> > >             }
> > > 
> > > -            getEmitter().emitAssignmentCoercion(argumentNode, paramDef);
> > > +            getEmitter().emitAssignmentCoercion(argumentNode, 
> > > paramTypeDef);
> > > 
> > >             if (i < len - 1)
> > >             {
> > > diff --git 
> > > a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
> > >  
> > > b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
> > > index 93db140..56b6363 100644
> > > --- 
> > > a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
> > > +++ 
> > > b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleExpressions.java
> > > @@ -1523,7 +1523,7 @@ public class TestRoyaleExpressions extends 
> > > TestGoogExpressions
> > >     @Test
> > >     public void testVisitCallFunctionReturnedFromFunction()
> > >     {
> > > -        IFunctionCallNode node = (IFunctionCallNode) getNode("function 
> > > foo(a:String, b:String):Function { return null }; return foo(3, 4)(1, 
> > > 2);", 
> > > +        IFunctionCallNode node = (IFunctionCallNode) getNode("function 
> > > foo(a:int, b:int):Function { return null }; return foo(3, 4)(1, 2);", 
> > >                                                           
> > > IFunctionCallNode.class);
> > >         asBlockWalker.visitFunctionCall(node);
> > >         assertOut("foo(3, 4)(1, 2)");
> > > @@ -1571,6 +1571,38 @@ public class TestRoyaleExpressions extends 
> > > TestGoogExpressions
> > >         assertOut("return 4294967173");
> > >     }
> > > 
> > > +    @Test
> > > +    public void testVisitFunctionCallWithIntParameterNegative()
> > > +    {
> > > +        IFunctionCallNode node = (IFunctionCallNode) getNode("function 
> > > a(foo:int):void {}; a(-123)", IFunctionCallNode.class);
> > > +        asBlockWalker.visitFunctionCall(node);
> > > +        assertOut("a(-123)");
> > > +    }
> > > +
> > > +    @Test
> > > +    public void testVisitFunctionCallWithIntParameterDecimal()
> > > +    {
> > > +        IFunctionCallNode node = (IFunctionCallNode) getNode("function 
> > > a(foo:int):void {}; a(123.4)", IFunctionCallNode.class);
> > > +        asBlockWalker.visitFunctionCall(node);
> > > +        assertOut("a(123)");
> > > +    }
> > > +
> > > +    @Test
> > > +    public void testVisitFunctionCallWithUintParameterNegative()
> > > +    {
> > > +        IFunctionCallNode node = (IFunctionCallNode) getNode("function 
> > > a(foo:uint):void {}; a(-123)", IFunctionCallNode.class);
> > > +        asBlockWalker.visitFunctionCall(node);
> > > +        assertOut("a(4294967173)");
> > > +    }
> > > +
> > > +    @Test
> > > +    public void testVisitFunctionCallWithUintParameterDecimal()
> > > +    {
> > > +        IFunctionCallNode node = (IFunctionCallNode) getNode("function 
> > > a(foo:uint):void {}; a(123.4)", IFunctionCallNode.class);
> > > +        asBlockWalker.visitFunctionCall(node);
> > > +        assertOut("a(123)");
> > > +    }
> > > +
> > >     protected IBackend createBackend()
> > >     {
> > >         return new RoyaleBackend();
> > > 
> > 
> > 
> 

Reply via email to