You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@royale.apache.org by Harbs <ha...@gmail.com> on 2019/02/10 10:02:53 UTC

Re: [royale-compiler] 05/05: ParametersEmitter: fixed automatic type coercion and added some tests (closes #74)

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, joshtynjala@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 <jo...@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();
> 


Re: [royale-compiler] 05/05: ParametersEmitter: fixed automatic type coercion and added some tests (closes #74)

Posted by Alex Harui <ah...@adobe.com.INVALID>.
SWF output might do more error checking and coercion than JS output, so if you were having trouble figuring out what to change for Vector, I was suggesting that you look in some of that code.  Sounds like you got it working?  Then my email doesn’t matter.

-Alex

On 2/19/19, 8:53 AM, "Josh Tynjala" <jo...@apache.org> wrote:

    I'm not exactly sure what you'd like me to check in SWF output. Can you add some more detail?
    
    - Josh
    
    On 2019/02/19 16:37:04, Alex Harui <ah...@adobe.com.INVALID> wrote: 
    > For #1, did you test using SWF output?  There's a small chance it will do more checks than the JS output.
    > 
    > -Alex
    > 
    > On 2/19/19, 8:03 AM, "Josh Tynjala" <jo...@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 <ha...@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, joshtynjala@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://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-compiler.git&amp;data=02%7C01%7Caharui%40adobe.com%7Ca3378935a8af439a803d08d6968ab69d%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636861919842373102&amp;sdata=9LFUv%2BcojCmmDuHM3ls1IwzesIWH4APTbFsDLrx8Gfc%3D&amp;reserved=0
    >     > > 
    >     > > commit fd7b81f4448db0f5eb70f22208c9144549cc4806
    >     > > Author: Josh Tynjala <jo...@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();
    >     > > 
    >     > 
    >     > 
    >     
    > 
    > 
    


Re: [royale-compiler] 05/05: ParametersEmitter: fixed automatic type coercion and added some tests (closes #74)

Posted by Josh Tynjala <jo...@apache.org>.
I'm not exactly sure what you'd like me to check in SWF output. Can you add some more detail?

- Josh

On 2019/02/19 16:37:04, Alex Harui <ah...@adobe.com.INVALID> wrote: 
> For #1, did you test using SWF output?  There's a small chance it will do more checks than the JS output.
> 
> -Alex
> 
> On 2/19/19, 8:03 AM, "Josh Tynjala" <jo...@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 <ha...@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, joshtynjala@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://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-compiler.git&data=02%7C01%7Caharui%40adobe.com%7C8dd70313e04b4d06b2f508d69683bd15%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636861889891622738&sdata=%2FUR6fVUN08Ajun9nCjcaO4w0jfHBnXMO9FHxa%2B7rtm8%3D&reserved=0
>     > > 
>     > > commit fd7b81f4448db0f5eb70f22208c9144549cc4806
>     > > Author: Josh Tynjala <jo...@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();
>     > > 
>     > 
>     > 
>     
> 
> 

Re: [royale-compiler] 05/05: ParametersEmitter: fixed automatic type coercion and added some tests (closes #74)

Posted by Alex Harui <ah...@adobe.com.INVALID>.
For #1, did you test using SWF output?  There's a small chance it will do more checks than the JS output.

-Alex

On 2/19/19, 8:03 AM, "Josh Tynjala" <jo...@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 <ha...@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, joshtynjala@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://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-compiler.git&amp;data=02%7C01%7Caharui%40adobe.com%7C8dd70313e04b4d06b2f508d69683bd15%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636861889891622738&amp;sdata=%2FUR6fVUN08Ajun9nCjcaO4w0jfHBnXMO9FHxa%2B7rtm8%3D&amp;reserved=0
    > > 
    > > commit fd7b81f4448db0f5eb70f22208c9144549cc4806
    > > Author: Josh Tynjala <jo...@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();
    > > 
    > 
    > 
    


Re: [royale-compiler] 05/05: ParametersEmitter: fixed automatic type coercion and added some tests (closes #74)

Posted by Josh Tynjala <jo...@apache.org>.
I meant that this comment is exactly the substance that I was looking for.

- Josh

On 2019/02/19 20:59:30, Alex Harui <ah...@adobe.com.INVALID> wrote: 
> What kind of substance are you looking for?  Did you see the isXMLIsh() code?
> 
> -Alex
> 
> On 2/19/19, 12:08 PM, "Josh Tynjala" <jo...@apache.org> wrote:
> 
>     I discovered the following comment in IdentifierNode.resolveMemberRef():
>     
>     // If the base type is XML or XMLList,
>     // don't resolve a member reference to any definition.
>     // As in the old compiler, this avoids possibly bogus
>     // -strict type-coercion errors.                   
>     // For example, we don't want a declared property like .name
>     // to resolve to the method slot, because it might actually
>     // be referring to a dynamically-defined XML attribute or child tag.
>     // And if we did resolve it to the name() method, which returns Object,
>     // then when doing s = x.name() where s is type String
>     // 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.
>     
>     In short, types of XML members are not resolved on purpose.
>     
>     That's basically what I expected, but I thought it would be best to find something of substance in the compiler code or comments, if I could.
>     
>     As I mentioned before, the emitter should be able to make some more intelligent choices about what can be resolved, since it's closer to run-time.
>     
>     I just tested the following code in Flash:
>     
>     var xml:XML = <root>
>          <toXMLString>hello</toXMLString>
>     </root>;
>     trace(xml.toXMLString());
>     trace(xml.toXMLString);
>     
>     The first trace() call prints the correct result of toXMLString(). The second trace() call prints the "hello" text inside the child element. It does not access a reference to the function. So, the emitter should have a special case for calling XML/XMLList methods, but not referencing them without a call.
>     
>     - Josh
>     
>     On 2019/02/19 16:03:05, Josh Tynjala <jo...@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 <ha...@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, joshtynjala@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://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-compiler.git&data=02%7C01%7Caharui%40adobe.com%7C11e86e4784fc43331e1208d696a60614%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636862037140997434&sdata=Xx1OzMKWtnUXuVKKyGZt4inrO%2FS6mv4lOW66w0hztLU%3D&reserved=0
>     > > > 
>     > > > commit fd7b81f4448db0f5eb70f22208c9144549cc4806
>     > > > Author: Josh Tynjala <jo...@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();
>     > > > 
>     > > 
>     > > 
>     > 
>     
> 
> 

Re: [royale-compiler] 05/05: ParametersEmitter: fixed automatic type coercion and added some tests (closes #74)

Posted by Alex Harui <ah...@adobe.com.INVALID>.
What kind of substance are you looking for?  Did you see the isXMLIsh() code?

-Alex

On 2/19/19, 12:08 PM, "Josh Tynjala" <jo...@apache.org> wrote:

    I discovered the following comment in IdentifierNode.resolveMemberRef():
    
    // If the base type is XML or XMLList,
    // don't resolve a member reference to any definition.
    // As in the old compiler, this avoids possibly bogus
    // -strict type-coercion errors.                   
    // For example, we don't want a declared property like .name
    // to resolve to the method slot, because it might actually
    // be referring to a dynamically-defined XML attribute or child tag.
    // And if we did resolve it to the name() method, which returns Object,
    // then when doing s = x.name() where s is type String
    // 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.
    
    In short, types of XML members are not resolved on purpose.
    
    That's basically what I expected, but I thought it would be best to find something of substance in the compiler code or comments, if I could.
    
    As I mentioned before, the emitter should be able to make some more intelligent choices about what can be resolved, since it's closer to run-time.
    
    I just tested the following code in Flash:
    
    var xml:XML = <root>
         <toXMLString>hello</toXMLString>
    </root>;
    trace(xml.toXMLString());
    trace(xml.toXMLString);
    
    The first trace() call prints the correct result of toXMLString(). The second trace() call prints the "hello" text inside the child element. It does not access a reference to the function. So, the emitter should have a special case for calling XML/XMLList methods, but not referencing them without a call.
    
    - Josh
    
    On 2019/02/19 16:03:05, Josh Tynjala <jo...@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 <ha...@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, joshtynjala@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://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-compiler.git&amp;data=02%7C01%7Caharui%40adobe.com%7C11e86e4784fc43331e1208d696a60614%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636862037140997434&amp;sdata=Xx1OzMKWtnUXuVKKyGZt4inrO%2FS6mv4lOW66w0hztLU%3D&amp;reserved=0
    > > > 
    > > > commit fd7b81f4448db0f5eb70f22208c9144549cc4806
    > > > Author: Josh Tynjala <jo...@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();
    > > > 
    > > 
    > > 
    > 
    


Re: [royale-compiler] 05/05: ParametersEmitter: fixed automatic type coercion and added some tests (closes #74)

Posted by Josh Tynjala <jo...@apache.org>.
I discovered the following comment in IdentifierNode.resolveMemberRef():

// If the base type is XML or XMLList,
// don't resolve a member reference to any definition.
// As in the old compiler, this avoids possibly bogus
// -strict type-coercion errors.                   
// For example, we don't want a declared property like .name
// to resolve to the method slot, because it might actually
// be referring to a dynamically-defined XML attribute or child tag.
// And if we did resolve it to the name() method, which returns Object,
// then when doing s = x.name() where s is type String
// 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.

In short, types of XML members are not resolved on purpose.

That's basically what I expected, but I thought it would be best to find something of substance in the compiler code or comments, if I could.

As I mentioned before, the emitter should be able to make some more intelligent choices about what can be resolved, since it's closer to run-time.

I just tested the following code in Flash:

var xml:XML = <root>
     <toXMLString>hello</toXMLString>
</root>;
trace(xml.toXMLString());
trace(xml.toXMLString);

The first trace() call prints the correct result of toXMLString(). The second trace() call prints the "hello" text inside the child element. It does not access a reference to the function. So, the emitter should have a special case for calling XML/XMLList methods, but not referencing them without a call.

- Josh

On 2019/02/19 16:03:05, Josh Tynjala <jo...@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 <ha...@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, joshtynjala@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 <jo...@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();
> > > 
> > 
> > 
> 

Re: [royale-compiler] 05/05: ParametersEmitter: fixed automatic type coercion and added some tests (closes #74)

Posted by Josh Tynjala <jo...@apache.org>.
My latest improvements to the compiler should resolve these 5 issues with coercion.

- Josh

On 2019/02/19 16:03:05, Josh Tynjala <jo...@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 <ha...@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, joshtynjala@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 <jo...@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();
> > > 
> > 
> > 
> 

Re: [royale-compiler] 05/05: ParametersEmitter: fixed automatic type coercion and added some tests (closes #74)

Posted by Josh Tynjala <jo...@apache.org>.
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 <ha...@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, joshtynjala@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 <jo...@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();
> > 
> 
> 

Re: [royale-compiler] 05/05: ParametersEmitter: fixed automatic type coercion and added some tests (closes #74)

Posted by Josh Tynjala <jo...@apache.org>.
I'll take a look at these when I'm back in action next week!

- Josh

On 2019/02/10 10:02:53, Harbs <ha...@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, joshtynjala@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 <jo...@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();
> > 
> 
>