language icon indicating copy to clipboard operation
language copied to clipboard

Macro API can't generate new types based on methods and properties from the base class

Open tilucasoli opened this issue 9 months ago • 7 comments

I was trying to use the new dart feature Macro to generate the repetitive code in the Mix framework (@leoafarias). Initially, I aimed to simplify the API by generating new classes from a base class. For instance:

@GenerateModifier()
class OpacityModifier {
  final double opacity;

  const OpacityModifier(this.opacity);

  @override
  Widget build(Widget child) {
    assert(
      opacity >= 0.0 && opacity <= 1.0,
      'The opacity must be between 0.0 and 1.0 (inclusive).',
    );

    return Opacity(opacity: opacity, child: child);
  }
}

and then it will generate three more classes based on these properties and methods, OpacityModifierSpec, OpacityModifierAttribute, and OpacityUtility, they will be like:

class OpacityModifierSpec extends WidgetModifierSpec<OpacityModifierSpec> {
  final double opacity;
  const OpacityModifierSpec(this.opacity);

  @override
  OpacityModifierSpec lerp(OpacityModifierSpec? other, double t) {
    return OpacityModifierSpec(
      lerpDouble(opacity, other?.opacity, t) ?? opacity,
    );
  }

  @override
  OpacityModifierSpec copyWith({double? opacity}) {
    return OpacityModifierSpec(opacity ?? this.opacity);
  }

  @override
  get props => [opacity];

  @override
  Widget build(Widget child) {
    assert(
      opacity >= 0.0 && opacity <= 1.0,
      'The opacity must be between 0.0 and 1.0 (inclusive).',
    );

    return Opacity(opacity: opacity, child: child);
  }
}

class OpacityModifierAttribute extends WidgetModifierAttribute<
    OpacityModifierAttribute, OpacityModifierSpec> {
  final double opacity;
  const OpacityModifierAttribute(this.opacity);

  @override
  OpacityModifierAttribute merge(OpacityModifierAttribute? other) {
    return OpacityModifierAttribute(other?.opacity ?? opacity);
  }

  @override
  OpacityModifierSpec resolve(MixData mix) {
    return OpacityModifierSpec(opacity);
  }

  @override
  get props => [opacity];
}

class OpacityUtility<T extends Attribute>
    extends MixUtility<T, OpacityModifierAttribute> {
  const OpacityUtility(super.builder);
  T call(double value) => builder(OpacityModifierAttribute(value));
}

The problem is that the ClassTypeBuilder on ClassTypesMacro can't return the properties and methods. Why can't ClassTypesMacro access these values? What do you suggest to solve this?

tilucasoli avatar May 23 '24 19:05 tilucasoli