zengen 0.2.2 zengen: ^0.2.2 copied to clipboard
A transformer to generate boilerplate code.
ZenGen #
This project provides a pub transformer to generate boilerplate code.
This library is inspired from the project Lombok in the Java world.
Warning #
Dart file modifications are not yet well integrated in the Dart editor.
If you run a web app use pub serve
and launch dartium with localhost:8080
instead of Run in Dartium on your original file.
If you run a server app launch the built version of your dart file after a pub build
instead of Run on your original file.
Features #
@ToString() #
Annotating a class with @ToString()
will generate an implementation of String toString()
built by default with its public getters.
For instance :
@ToString()
class A {
final a;
final int b;
A(this.a, this.b);
}
will be transformed to :
@ToString()
class A {
final a;
final int b;
A(this.a, this.b);
@generated @override String toString() => "A(a=$a, b=$b)";
}
The code generated can be customized with the following optional parameters:
callSuper
: if set totrue
the result oftoString
will contains the result ofsuper.toString()
.exclude
: a list of getter names can be exclude with this argument.includePrivate
: if set totrue
the generation will include private getters.
@EqualsAndHashCode() #
Annotating a class with @EqualsAndHashCode()
will generate an implementation of bool operator ==(o)
and int get hashCode
built by default with its public getters.
For instance :
@EqualsAndHashCode()
class A {
final a;
final int b;
A(this.a, this.b);
}
will be transformed to :
@EqualsAndHashCode()
class A {
final a;
final int b;
A(this.a, this.b);
@generated @override int get hashCode => hashObjects([a, b]);
@generated @override bool operator ==(o) => identical(this, o) || o.runtimeType == runtimeType && o.a == a && o.b == b;
}
The code generated can be customize with the following optional parameters:
callSuper
: if set totrue
the generated code will use additionnallysuper.hashCode
andsuper == o
.exclude
: a list of getter names can be exclude with this argument.includePrivate
: if set totrue
the generation will include private getters.
@DefaultConstructor() #
Annotating a class with @DefaultConstructor()
will generate a default constructor with uninitialized final fields as required parameters and mutable fields as optional named parameters.
If the class contains only final fields the generated constructor will be a const constructor.
For instance :
@DefaultConstructor()
class B {
var a;
final b;
}
will be transformed to :
@DefaultConstructor()
class B {
var a;
final b;
@generated B(this.b, {this.a});
}
@Value() #
Annotating a class with @Value()
is the same as annotating the class with @DefaultConstructor()
, @EqualsAndHashCode()
and @ToString()
.
For instance :
@Value()
class A {
final int a;
final b, c;
final List d;
}
will be transformed to :
@Value()
class A {
final int a;
final b, c;
final List d;
@generated const A(this.a, this.b, this.c, this.d);
@generated @override String toString() => "A(a=$a, b=$b, c=$c, d=$d)";
@generated @override int get hashCode => hashObjects([a, b, c, d]);
@generated @override bool operator ==(o) => identical(this, o) || o.runtimeType == runtimeType && o.a == a && o.b == b && o.c == c && o.d == d;
}
Note that you can customize @EqualsAndHashCode()
and @ToString()
by using the annotation with the custom parameters.
@Delegate() #
Annotating a field/getter with @Delegate()
will add to the enclosing class all the public methods available on the type of the field/getter.
For instance :
import 'package:zengen/zengen.dart';
abstract class A {
m1();
}
class B {
@Delegate() A _a;
}
will be transformed to :
import 'package:zengen/zengen.dart';
abstract class A {
m1();
}
class B {
@Delegate() A _a;
@generated dynamic m1() => _a.m1();
}
The code generated can be customize with the following optional parameters:
exclude
: a list of members can be exclude with this argument.
@Lazy() #
Annotating a field with @Lazy()
will make it lazy computed.
For instance :
import 'package:zengen/zengen.dart';
class A {
@Lazy() var a = "String";
}
will be transformed to :
import 'package:zengen/zengen.dart';
class A {
@generated dynamic get a => _lazyFields.putIfAbsent(#a, () => "String");
@generated set a(dynamic v) => _lazyFields[#a] = v;
@generated final _lazyFields = <Symbol, dynamic>{};
}
The lazy fields are stored into _lazyFields
by field names. If the field is final no setter will be generated.
Usage #
To use this library in your code :
- add a dependency in your
pubspec.yaml
:
dependencies:
zengen: any
- add the transformer in your
pubspec.yaml
:
transformers:
- zengen
- add import in your
dart
code :
import 'package:zengen/zengen.dart';
License #
Apache 2.0