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