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 >> >> >> >> >> >>
