Open stuartmorgan opened 2 weeks ago
I was attempting to migrate the following Obj-C code to Dart:
[item addObserver:observer forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:NULL];
Where the options are defined by:
typedef NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) { NSKeyValueObservingOptionNew = 0x01, NSKeyValueObservingOptionOld = 0x02, NSKeyValueObservingOptionInitial = 0x04, NSKeyValueObservingOptionPrior = 0x08 };
The generated code is:
enum NSKeyValueObservingOptions { NSKeyValueObservingOptionNew(1), NSKeyValueObservingOptionOld(2), NSKeyValueObservingOptionInitial(4), NSKeyValueObservingOptionPrior(8); final int value; const NSKeyValueObservingOptions(this.value); static NSKeyValueObservingOptions fromValue(int value) => switch (value) { 1 => NSKeyValueObservingOptionNew, 2 => NSKeyValueObservingOptionOld, 4 => NSKeyValueObservingOptionInitial, 8 => NSKeyValueObservingOptionPrior, _ => throw ArgumentError( "Unknown value for NSKeyValueObservingOptions: $value"), }; }
which is essentially unusable:
operator |
Second, and worse, that can't be worked around. Before I looked at the full implementation when I just got the error about |, I tried:
|
NSKeyValueObservingOptions.fromValue( NSKeyValueObservingOptions.NSKeyValueObservingOptionInitial.value | NSKeyValueObservingOptions.NSKeyValueObservingOptionNew.value)
but that throws the ArgumentError at runtime because, of course, the combination of two values is not one of the values.
ArgumentError
Since the whole point of NS_OPTIONS as distinct from NS_ENUM is to allow combining values, the generator needs to make different code for NS_OPTIONS.
NS_OPTIONS
NS_ENUM
Use the enums.as-int option to choose which enums to generate as int constants instead of Dart enums.
enums.as-int
I was attempting to migrate the following Obj-C code to Dart:
Where the options are defined by:
The generated code is:
which is essentially unusable:
operator |
, so they can't be directly combined.Second, and worse, that can't be worked around. Before I looked at the full implementation when I just got the error about
|
, I tried:but that throws the
ArgumentError
at runtime because, of course, the combination of two values is not one of the values.Since the whole point of
NS_OPTIONS
as distinct fromNS_ENUM
is to allow combining values, the generator needs to make different code forNS_OPTIONS
.