Cool. I added quite a few expressions in my own code as well. It seems to all work correctly.
Excellent work! :-) Harbs > On Feb 18, 2026, at 2:02 AM, Josh Tynjala <[email protected]> wrote: > > 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 >>>>> >>>>> >>> >>>
