code_builder 1.0.0-alpha+2 code_builder: ^1.0.0-alpha+2 copied to clipboard
A fluent API for generating Dart code
code_builder #
code_builder
is a fluent Dart API for generating valid Dart source code.
Code generation was traditionally done through a series of package-specific string concatenations which usually results in messy and sometimes invalid Dart code that is not easily readable and is very difficult to refactor.
code_builder
uses the analyzer package to create real Dart
language ASTs, which, while not guaranteed to be correct, always follows
the analyzer's own understood format.
Experimental #
While code_builder
is considered stable, the APIs are subject to
frequent breaking change - a number of Dart language features are not
yet implemented that make it unsuitable for all forms of code
generation.
Contributions are welcome!
Usage #
Code builder has a narrow and user-friendly API.
For example creating a class with a method:
var base = reference('Organism');
var clazz = new ClassBuilder('Animal', asExtends: base);
clazz.addMethod(
new MethodBuilder.returnVoid(
'eat',
returns: reference('print').call([literal('Yum')]),
),
);
Outputs:
class Animal extends Organism {
void eat() => print('Yum!');
}
Have a complicated set of dependencies for your generated code?
code_builder
supports automatic scoping of your ASTs to automatically
use prefixes to avoid symbol conflicts:
var lib = new LibraryBuilder.scope()
..addMembers([
new MethodBuilder(
'doThing',
returnType: reference('Thing', 'package:thing/thing.dart'),
),
new MethodBuilder(
'doOtherThing',
returnType: reference('Thing', 'package:thing/alternative.dart'),
),
]);
Outputs:
import 'package:thing/thing.dart' as _i1;
import 'package:thing/alternative.dart' as _i2;
_i1.Thing doThing() {}
_i2.Thing doOtherThing() {}