Skip to content

Generated Dart code doesn't allow combining NS_OPTIONS #1518

Open
@stuartmorgan-g

Description

@stuartmorgan-g

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:

  • First, it doesn't define 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:

    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.

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    Todo

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions