I have applied the additional tweaks for resolving function types from
nested expressions that I mentioned previously. I confirmed that your
additions of function types in royale-asjs still compile correctly after my
change.

There are no further known issues with function types on my end at this
time.

--
Josh Tynjala
Bowler Hat LLC
https://bowlerhat.dev/


On Fri, Feb 6, 2026 at 5:50 PM Josh Tynjala <[email protected]>
wrote:

> This bug, and another one that a ternary in your code would have triggered
> after fixing the first one, is fixed. I still have some additional tweaks
> to make to support certain nested syntax, but it should unblock you for now.
>
> --
> Josh Tynjala
> Bowler Hat LLC
> https://bowlerhat.dev/
>
>
> On Sat, Jan 31, 2026 at 3:22 PM Harbs <[email protected]> wrote:
>
>> Yes. The second one does seem to be a bug.
>>
>> Here’s a corrected patch to reproduce that:
>>
>>
>> diff --git
>> a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ISort.as
>> b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ISort.as
>> index 14073e1da9..d39c9a3b46 100644
>> ---
>> a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ISort.as
>> +++
>> b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ISort.as
>> @@ -123,13 +123,13 @@ public interface ISort {
>>       *  @playerversion AIR 2.6
>>       *  @productversion Flex 4.5
>>       */
>> -    function get compareFunction():Function;
>> +    function get compareFunction():(a:Object, b:Object,
>> fields?:Array)=>int;
>>
>>      /**
>>       *  @deprecated A future release of Apache Flex SDK will remove this
>> function. Please use the constructor
>>       *  argument instead.
>>       */
>> -    function set compareFunction(value:Function):void;
>> +    function set compareFunction(value:(a:Object, b:Object,
>> fields?:Array)=>int):void;
>>
>>      /**
>>       *  An <code>Array</code> of <code>ISortField</code> objects that
>> @@ -280,7 +280,7 @@ public interface ISort {
>>              values:Object,
>>              mode:String,
>>              returnInsertionIndex:Boolean = false,
>> -            compareFunction:Function = null):int;
>> +            compareFunction:(a:Object, b:Object, fields?:Array)=>int =
>> null):int;
>>
>>      /**
>>       *  Return whether the specified property is used to control the
>> sort.
>>
>>
>>
>> diff --git
>> a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as
>> b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as
>> index d16869fa1f..caf80b6559 100644
>> ---
>> a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as
>> +++
>> b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as
>> @@ -186,7 +186,7 @@ public class Sort extends EventDispatcher implements
>> ISort
>>       *  @playerversion AIR 2.6
>>       *  @productversion Royale 0.0
>>       */
>> -    public function Sort(fields:Array = null,
>> customCompareFunction:Function = null, unique:Boolean = false)
>> +    public function Sort(fields:Array = null,
>> customCompareFunction:(a:Object, b:Object, fields?:Array)=>int = null,
>> unique:Boolean = false)
>>      {
>>          super();
>>
>> @@ -236,7 +236,7 @@ public class Sort extends EventDispatcher implements
>> ISort
>>       *  @private
>>       *  Storage for the compareFunction property.
>>       */
>> -    private var _compareFunction:Function;
>> +    private var _compareFunction:(a:Object, b:Object,
>> fields?:Array)=>int;
>>
>>      /**
>>       *  @private
>> @@ -253,7 +253,7 @@ public class Sort extends EventDispatcher implements
>> ISort
>>       *  @playerversion AIR 2.6
>>       *  @productversion Royale 0.0
>>       */
>> -    public function get compareFunction():Function
>> +    public function get compareFunction():(a:Object, b:Object,
>> fields?:Array)=>int
>>      {
>>          return usingCustomCompareFunction ? _compareFunction :
>> internalCompare;
>>      }
>> @@ -261,7 +261,7 @@ public class Sort extends EventDispatcher implements
>> ISort
>>      /**
>>       *  @private
>>       */
>> -    public function set compareFunction(value:Function):void
>> +    public function set compareFunction(value:(a:Object, b:Object,
>> fields?:Array)=>int):void
>>      {
>>          _compareFunction = value;
>>          usingCustomCompareFunction = _compareFunction != null;
>> @@ -376,9 +376,9 @@ public class Sort extends EventDispatcher implements
>> ISort
>>                               values:Object,
>>                               mode:String,
>>                               returnInsertionIndex:Boolean = false,
>> -                             compareFunction:Function = null):int
>> +                             compareFunction:(a:Object, b:Object,
>> fields?:Array)=>int = null):int
>>      {
>> -        var compareForFind:Function;
>> +        var compareForFind:(a:Object, b:Object, fields?:Array)=>int;
>>          var fieldsForCompare:Array;
>>          var message:String;
>>
>> @@ -615,7 +615,7 @@ public class Sort extends EventDispatcher implements
>> ISort
>>              // the Sort.internalCompare function knows to use
>> Sort._fields; that same logic
>>              // needs to be part of calling a custom compareFunction. Of
>> course, a user shouldn't
>>              // be doing this -- so I wrap calls to compareFunction with
>> _fields as the last parameter
>> -            const fixedCompareFunction:Function =
>> +            const fixedCompareFunction:(a:Object, b:Object)=>int =
>>                      function (a:Object, b:Object):int
>>                      {
>>                          // append our fields to the call, since
>> items.sort() won't
>> @@ -760,7 +760,7 @@ public class Sort extends EventDispatcher implements
>> ISort
>>              var len:int = fields ? fields.length : _fields.length;
>>              while (result == 0 && (i < len))
>>              {
>> -                var sf:ISortField = ISortField(_fields[i]);
>> +                var sf:ISortField = (_fields[i] as ISortField);
>>                  result = sf.compareFunction(a, b);
>>                  if (sf.descending)
>>                      result *= -1;
>>
>>
>>
>> > On Jan 30, 2026, at 5:17 PM, Josh Tynjala <[email protected]>
>> wrote:
>> >
>> >> Error: Implicit coercion of a value of type (a:Object,b:Object)=>int to
>> > an unrelated type
>> (values:Object,obj:Object,fieldsForCompare?:Array)=>int.
>> >
>> > This error appears to be correct because you have omitted the third
>> > parameter. The argument may be omitted only when calling the function.
>> It
>> > can’t be omitted when defining the function. You’d have a similar error
>> if
>> > an interface had an optional parameter, and you tried to define a
>> method on
>> > an implementing class that didn’t include the optional parameter.
>> >
>> >> Error: Implicit coercion of a value of type Function to an unrelated
>> type
>> > (values:Object,obj:Object,fieldsForCompare?:Array)=>int.
>> >
>> > This one seems like it might be a bug, though. The compiler may be
>> ignoring
>> > the function type expression somewhere.
>> >
>> >
>> > --
>> > Josh Tynjala
>> > Bowler Hat LLC
>> > https://bowlerhat.dev/
>> >
>> >
>> > On Fri, Jan 30, 2026 at 5:10 AM Harbs <[email protected]> wrote:
>> >
>> >> I tried to use them in the Sort classes, and I got the following error.
>> >>
>> >> Is this user error or a bug?
>> >>
>> >>
>> >>     [java]
>> >>
>> /Users/harbs/Apache/royale-asjs/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as(397):
>> >> col: 30 Error: Implicit coercion of a value of type Function to an
>> >> unrelated type (values:Object,obj:Object,fieldsForCompare?:Array)=>int.
>> >>     [java]
>> >>     [java]             compareForFind = this.compareFunction;
>> >>     [java]                              ^
>> >>     [java]
>> >>     [java]
>> >>
>> /Users/harbs/Apache/royale-asjs/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as(619):
>> >> col: 21 Error: Implicit coercion of a value of type
>> >> (a:Object,b:Object)=>int to an unrelated type
>> >> (values:Object,obj:Object,fieldsForCompare?:Array)=>int.
>> >>     [java]
>> >>     [java]                     function (a:Object, b:Object):int
>> >>     [java]                     ^
>> >>     [java]
>> >>     [java]
>> >>
>> /Users/harbs/Apache/royale-asjs/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as(397):
>> >> col: 30 Implicit coercion of a value of type Function to an unrelated
>> type
>> >> (values:Object,obj:Object,fieldsForCompare?:Array)=>int.
>> >>     [java]
>> >>     [java]             compareForFind = this.compareFunction;
>> >>     [java]                              ^
>> >>     [java]
>> >>     [java]
>> >>
>> /Users/harbs/Apache/royale-asjs/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as(619):
>> >> col: 21 Implicit coercion of a value of type (a:Object,b:Object)=>int
>> to an
>> >> unrelated type (values:Object,obj:Object,fieldsForCompare?:Array)=>int.
>> >>     [java]
>> >>     [java]                     function (a:Object, b:Object):int
>> >>     [java]                     ^
>> >>
>> >>
>> >> Changes:
>> >>
>> >> diff --git
>> >>
>> a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ISort.as
>> >>
>> b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ISort.as
>> >> index 14073e1da9..02a7bcc86d 100644
>> >> ---
>> >>
>> a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ISort.as
>> >> +++
>> >>
>> b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ISort.as
>> >> @@ -123,13 +123,13 @@ public interface ISort {
>> >>      *  @playerversion AIR 2.6
>> >>      *  @productversion Flex 4.5
>> >>      */
>> >> -    function get compareFunction():Function;
>> >> +    function get compareFunction():(values:Object, obj:Object,
>> >> fieldsForCompare?:Array) => int;
>> >>
>> >>     /**
>> >>      *  @deprecated A future release of Apache Flex SDK will remove
>> this
>> >> function. Please use the constructor
>> >>      *  argument instead.
>> >>      */
>> >> -    function set compareFunction(value:Function):void;
>> >> +    function set compareFunction(value:(values:Object, obj:Object,
>> >> fieldsForCompare?:Array) => int):void;
>> >>
>> >>     /**
>> >>      *  An <code>Array</code> of <code>ISortField</code> objects that
>> >>
>> >>
>> >> diff --git
>> >>
>> a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as
>> >>
>> b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as
>> >> index d16869fa1f..abec999093 100644
>> >> ---
>> >>
>> a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as
>> >> +++
>> >>
>> b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/Sort.as
>> >> @@ -186,7 +186,7 @@ public class Sort extends EventDispatcher
>> implements
>> >> ISort
>> >>      *  @playerversion AIR 2.6
>> >>      *  @productversion Royale 0.0
>> >>      */
>> >> -    public function Sort(fields:Array = null,
>> >> customCompareFunction:Function = null, unique:Boolean = false)
>> >> +    public function Sort(fields:Array = null,
>> >> customCompareFunction:(values:Object, obj:Object,
>> fieldsForCompare?:Array)
>> >> => int = null, unique:Boolean = false)
>> >>     {
>> >>         super();
>> >>
>> >> @@ -236,7 +236,7 @@ public class Sort extends EventDispatcher
>> implements
>> >> ISort
>> >>      *  @private
>> >>      *  Storage for the compareFunction property.
>> >>      */
>> >> -    private var _compareFunction:Function;
>> >> +    private var _compareFunction:(values:Object, obj:Object,
>> >> fieldsForCompare?:Array) => int;
>> >>
>> >>     /**
>> >>      *  @private
>> >> @@ -253,7 +253,7 @@ public class Sort extends EventDispatcher
>> implements
>> >> ISort
>> >>      *  @playerversion AIR 2.6
>> >>      *  @productversion Royale 0.0
>> >>      */
>> >> -    public function get compareFunction():Function
>> >> +    public function get compareFunction():(values:Object, obj:Object,
>> >> fieldsForCompare?:Array) => int
>> >>     {
>> >>         return usingCustomCompareFunction ? _compareFunction :
>> >> internalCompare;
>> >>     }
>> >> @@ -261,7 +261,7 @@ public class Sort extends EventDispatcher
>> implements
>> >> ISort
>> >>     /**
>> >>      *  @private
>> >>      */
>> >> -    public function set compareFunction(value:Function):void
>> >> +    public function set compareFunction(value:(values:Object,
>> obj:Object,
>> >> fieldsForCompare?:Array) => int):void
>> >>     {
>> >>         _compareFunction = value;
>> >>         usingCustomCompareFunction = _compareFunction != null;
>> >> @@ -376,9 +376,9 @@ public class Sort extends EventDispatcher
>> implements
>> >> ISort
>> >>                              values:Object,
>> >>                              mode:String,
>> >>                              returnInsertionIndex:Boolean = false,
>> >> -                             compareFunction:Function = null):int
>> >> +                             compareFunction:(values:Object,
>> obj:Object,
>> >> fieldsForCompare?:Array) => int = null):int
>> >>     {
>> >> -        var compareForFind:Function;
>> >> +        var compareForFind:(values:Object, obj:Object,
>> >> fieldsForCompare?:Array) => int;
>> >>         var fieldsForCompare:Array;
>> >>         var message:String;
>> >>
>> >> @@ -615,7 +615,7 @@ public class Sort extends EventDispatcher
>> implements
>> >> ISort
>> >>             // the Sort.internalCompare function knows to use
>> >> Sort._fields; that same logic
>> >>             // needs to be part of calling a custom compareFunction. Of
>> >> course, a user shouldn't
>> >>             // be doing this -- so I wrap calls to compareFunction with
>> >> _fields as the last parameter
>> >> -            const fixedCompareFunction:Function =
>> >> +            const fixedCompareFunction:(values:Object, obj:Object,
>> >> fieldsForCompare?:Array) => int =
>> >>                     function (a:Object, b:Object):int
>> >>                     {
>> >>                         // append our fields to the call, since
>> >> items.sort() won't
>> >>
>> >>
>>
>>

Reply via email to