blob: 5e5521cfb343043c46c5a4afc8e599822790369a [file] [log] [blame] [view]
## 4.10.1
* Require Dart `^3.5.0`
* Upgrade to `dart_style` 2.3.7.
* Move to `dart-lang/tools` monorepo.
## 4.10.0
* Add `Library.docs` to support emitting doc comments on libraries.
* Export `RepresentationDeclaration` and `RepresentationDeclarationBuilder` so
they can be used when generating extension types.
* Upgrade to `dart_style` 2.3.4.
## 4.9.0
* Add `Library.generatedByComment` to support emitting 'generated by' comments.
* Support emitting an unnamed library with annotations.
## 4.8.0
* Add `Expression.operatorSubtract`
* Deprecate `Expression.operatorSubstract`
* Add `Expression.operatorIntDivide`
* Add `Expression.operatorUnaryPrefixIncrement`
* Add `Expression.operatorUnaryPostfixIncrement`
* Add `Expression.operatorUnaryMinus`
* Add `Expression.operatorUnaryPrefixDecrement`
* Add `Expression.operatorUnaryPostfixDecrement`
* Add `Expression.operatorBitwiseAnd`
* Add `Expression.operatorBitwiseOr`
* Add `Expression.operatorBitwiseXor`
* Add `Expression.operatorUnaryBitwiseComplement`
* Add `Expression.operatorShiftLeft`
* Add `Expression.operatorShiftRight`
* Add `Expression.operatorShiftRightUnsigned`
* Add `Expression.addAssign`
* Add `Expression.subtractAssign`
* Add `Expression.multiplyAssign`
* Add `Expression.divideAssign`
* Add `Expression.intDivideAssign`
* Add `Expression.euclideanModuloAssign`
* Add `Expression.shiftLeftAssign`
* Add `Expression.shiftRightAssign`
* Add `Expression.shiftRightUnsignedAssign`
* Add `Expression.bitwiseAndAssign`
* Add `Expression.bitwiseXorAssign`
* Add `Expression.bitwiseOrAssign`
* Allow passing an `Expression` through `literal` without an exception.
* Add support for extension types.
* Update SDK version constraints to `>=3.0.0`.
## 4.7.0
* Add a newline after lambdas.
## 4.6.0
* Add support for named arguments in `enum` classes
* Add support for external keyword on fields.
* Add `Expression.parenthesized` to manually wrap an expression in parenthesis.
## 4.5.0
* Require Dart 2.19
* Add support for emitting type parameters for typedefs.
* Add support for class modifiers.
* Add support for records (both types and record literals).
* Add `literalSpread` and `literalNullSafeSpread` to support adding spreads to
`literalMap`.
```dart
void main() {
// Creates a map
// {
// ...one,
// 2: two,
// ...?three,
// }
final map = literalMap({
literalSpread(): refer('one'),
2: refer('two'),
literalNullSafeSpread(): refer('three'),
});
}
```
## 4.4.0
* Mention how the `allocator` argument relates to imports in the `DartEmitter`
constructor doc.
* Add support for emitting typedefs.
* Add support for emitting leading line comments for libraries.
* Add support for emitting `ignore_for_file` analyzer directive comments.
## 4.3.0
* Add support for adding more implementation in `enum` classes.
* Only emit `late` keyword when using null safety syntax.
* Use implicit `const` when assigning to a `declareConst` variable.
* Deprecate `assignVar`, `assignConst`, and `assignFinal`.
* Add trailing commas to any parameter list, argument list, or collection
literal which has more than one element.
## 4.2.0
* Add an ignore for a lint from the `package:lints` recommended set. The lint,
`no_leading_underscores_for_library_prefixes` is most useful for hand edited
code where the appearance of a private name that is already not visible
outside the library is confusing.
* Fix the docs for `Expression.assign`, `ifNullThen`, and `assignNullAware`
which had the argument and receiver flipped.
* Add `declareConst`, `declareFinal`, and `declareVar` to replace
`Expression.assignConst`, `assignFinal`, and `assignVar`. Add support for late
variables with the `declare*` utilities.
* Add `ParameterBuilder.toSuper` so support super formal parameters language
feature.
## 4.1.0
* Add `Expression.spread` for the spread operator `...`.
* Add support 'late' field modifier.
* Add support for `Expression.nullChecked` to add a null assertion operator.
* Add support for creating `mixin`s.
* Add `Expression.nullSafeSpread` for the null aware spread operator `...?`.
* A `Library` can now be annotated.
## 4.0.0
* Migrate to null safety.
* Changed the `DartEmitter` constructor to use named optional parameters.
* Add `ParenthesizedExpression` and
`ExpressionVisitor.visitParenthesizedExpression.`
## 3.7.0
* Add support for converting a Method to a generic closure, with
`Method.genericClosure`.
## 3.6.0
* Add support for creating `extension` methods.
* Expand constraint on `built_value` to allow null safe migrated version.
## 3.5.0
* Add support for defining enums.
* Fix keyword ordering for `const factory` constructors.
## 3.4.1
* Fix confusing mismatch description from `equalsDart`.
https://github.com/dart-lang/code_builder/issues/293
## 3.4.0
* Introduce `Expression.thrown` for throwing an expression.
* Introduce `FunctionType.isNullable`.
* Update SDK requirement to `>=2.7.0 <3.0.0`.
## 3.3.0
* Add `??` null-aware operator.
* Add `..` cascade assignment operator.
* Add `part` directive.
* Introduce `TypeReference.isNullable`.
* Add an option in `DartEmitter` to emit nullable types with trailing `?`
characters.
## 3.2.2
* Require minimum Dart SDK of `2.6.0`.
## 3.2.1
* Escape newlines in String literals.
* Introduce `Expression.or` for boolean OR.
* Introduce `Expression.negate` for boolean NOT.
* No longer emits redundant `,`s in `FunctionType`s.
* Added support for `literalSet` and `literalConstSet`.
* Depend on the latest `package:built_value`.
## 3.2.0
* Emit `=` instead of `:` for named parameter default values.
* The `new` keyword will not be used in generated code.
* The `const` keyword will be omitted when it can be inferred.
* Add an option in `DartEmitter` to order directives.
* `DartEmitter` added a `startConstCode` function to track the creation of
constant expression trees.
* `BinaryExpression` added the `final bool isConst` field.
## 3.1.3
* Bump dependency on built_collection to include v4.0.0.
## 3.1.2
* Set max SDK version to `<3.0.0`.
## 3.1.1
* `Expression.asA` is now wrapped with parenthesis so that further calls may be
made on it as an expression.
## 3.1.0
* Added `Expression.asA` for creating explicit casts:
```dart
void main() {
test('should emit an explicit cast', () {
expect(
refer('foo').asA(refer('String')),
equalsDart('foo as String'),
);
});
}
```
## 3.0.3
* Fix a bug that caused all downstream users of `code_builder` to crash due to
`build_runner` trying to import our private builder (in `tool/`). Sorry for
the inconvenience.
## 3.0.2
* Require `source_gen: ^0.7.5`.
## 3.0.1
* Upgrade to `built_value` 5.1.0.
* Export the `literalNum` function.
* **BUG FIX**: `literal` supports a `Map`.
## 3.0.0
* Also infer `Constructor.lambda` for `factory` constructors.
## 3.0.0-alpha
* Using `equalsDart` no longer formats automatically with `dartfmt`.
* Removed deprecated `Annotation` and `File` classes.
* `Method.lambda` is inferred based on `Method.body` where possible and now
defaults to `null`.
## 2.4.0
* Add `equalTo`, `notEqualTo`, `greaterThan`, `lessThan`, `greateOrEqualTo`, and
`lessOrEqualTo` to `Expression`.
## 2.3.0
* Using `equalsDart` and expecting `dartfmt` by default is *deprecated*. This
requires this package to have a direct dependency on specific versions of
`dart_style` (and transitively `analyzer`), which is problematic just for
testing infrastructure. To future proof, we've exposed the `EqualsDart` class
with a `format` override:
```dart
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:code_builder/code_builder.dart';
import 'package:dart_style/dart_style.dart';
final DartFormatter _dartfmt = new DartFormatter();
String _format(String source) {
try {
return _dartfmt.format(source);
} on FormatException catch (_) {
return _dartfmt.formatStatement(source);
}
}
/// Should be invoked in `main()` of every test in `test/**_test.dart`.
void useDartfmt() => EqualsDart.format = _format;
```
* Added `Expression.isA` and `Expression.isNotA`:
```dart
void main() {
test('should emit an is check', () {
expect(
refer('foo').isA(refer('String')),
equalsDart('foo is String'),
);
});
}
```
* Deprecated `Annotation`. It is now legal to simply pass any `Expression` as
a metadata annotation to `Class`, `Method`, `Field,` and `Parameter`. In
`3.0.0`, the `Annotation` class will be completely removed:
```dart
void main() {
test('should create a class with a annotated constructor', () {
expect(
new Class((b) => b
..name = 'Foo'
..constructors.add(
new Constructor((b) => b..annotations.add(refer('deprecated'))))),
equalsDart(r'''
class Foo {
@deprecated
Foo();
}
'''),
);
});
}
```
* Added inference support for `Method.lambda` and `Constructor.lambda`. If not
explicitly provided and the body of the function originated from an
`Expression` then `lambda` is inferred to be true. This is not a breaking
change yet, as it requires an explicit `null` value. In `3.0.0` this will be
the default:
```dart
void main() {
final animal = new Class((b) => b
..name = 'Animal'
..extend = refer('Organism')
..methods.add(new Method.returnsVoid((b) => b
..name = 'eat'
// In 3.0.0, this may be omitted and still is inferred.
..lambda = null
..body = refer('print').call([literalString('Yum!')]).code)));
final emitter = new DartEmitter();
print(new DartFormatter().format('${animal.accept(emitter)}'));
}
```
* Added `nullSafeProperty` to `Expression` to access properties with `?.`
* Added `conditional` to `Expression` to use the ternary operator `? : `
* Methods taking `positionalArguments` accept `Iterable<Expression>`
* **BUG FIX**: Parameters can take a `FunctionType` as a `type`.
`Reference.type` now returns a `Reference`. Note that this change is
technically breaking but should not impacts most clients.
## 2.2.0
* Imports are prefixed with `_i1` rather than `_1` which satisfies the lint
`lowercase_with_underscores`. While not a strictly breaking change you may
have to fix/regenerate golden file-like tests. We added documentation that
the specific prefix is not considered stable.
* Added `Expression.index` for accessing the `[]` operator:
```dart
void main() {
test('should emit an index operator', () {
expect(
refer('bar').index(literalTrue).assignVar('foo').statement,
equalsDart('var foo = bar[true];'),
);
});
test('should emit an index operator set', () {
expect(
refer('bar')
.index(literalTrue)
.assign(literalFalse)
.assignVar('foo')
.statement,
equalsDart('var foo = bar[true] = false;'),
);
});
}
```
* `literalList` accepts an `Iterable` argument.
* Fixed an NPE when a method had a return type of a `FunctionType`:
```dart
void main() {
test('should create a method with a function type return type', () {
expect(
new Method((b) => b
..name = 'foo'
..returns = new FunctionType((b) => b
..returnType = refer('String')
..requiredParameters.addAll([
refer('int'),
]))),
equalsDart(r'''
String Function(int) foo();
'''),
);
});
}
```
## 2.1.0
We now require the Dart 2.0-dev branch SDK (`>= 2.0.0-dev`).
* Added support for raw `String` literals.
* Automatically escapes single quotes in now-raw `String` literals.
* Deprecated `File`, which is now a redirect to the preferred class, `Library`.
This helps avoid symbol clashes when used with `dart:io`, a popular library. It
is now safe to do the following and get full access to the `code_builder` API:
```dart
import 'dart:io';
import 'package:code_builder/code_builder.dart' hide File;
```
We will remove `File` in `3.0.0`, so use `Library` instead.
## 2.0.0
Re-released without a direct dependency on `package:analyzer`!
For users of the `1.x` branch of `code_builder`, this is a pretty big breaking
change but ultimately is for the better - it's easier to evolve this library
now and even add your own builders on top of the library.
```dart
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:code_builder/code_builder.dart';
import 'package:dart_style/dart_style.dart';
void main() {
final animal = new Class((b) => b
..name = 'Animal'
..extend = refer('Organism')
..methods.add(new Method.returnsVoid((b) => b
..name = 'eat'
..lambda = true
..body = const Code('print(\'Yum\')'))));
final emitter = new DartEmitter();
print(new DartFormatter().format('${animal.accept(emitter)}'));
}
```
...outputs...
```dart
class Animal extends Organism {
void eat() => print('Yum!');
}
```
**Major changes**:
* Builders now use `built_value`, and have a more consistent, friendly API.
* Builders are now consistent - they don't perform work work until code is
emitted.
* It's possible to overwrite the built-in code emitting, formatting, etc by
providing your own visitors. See `DartEmitter` as an example of the built-in
visitor/emitter.
* Most of the expression and statement-level helpers were removed; in practice,
they were difficult to write and maintain, and many users commonly asked for
opt-out type APIs. See the `Code` example below:
```dart
void main() {
var code = new Code('x + y = z');
code.expression;
code.statement;
}
```
See the commit log, examples, and tests for full details. While we want to try
and avoid breaking changes, suggestions, new features, and incremental updates
are welcome!
## 2.0.0-beta
* Added `lazySpec` and `lazyCode` to lazily create code on visit [#145](https://github.com/dart-lang/code_builder/issues/145).
* **BUG FIX**: `equalsDart` emits the failing source code [#147](https://github.com/dart-lang/code_builder/issues/147).
* **BUG FIX**: Top-level `lambda` `Method`s no longer emit invalid code [#146](https://github.com/dart-lang/code_builder/issues/146).
## 2.0.0-alpha+3
* Added `Expression.annotation` and `Expression.annotationNamed`.
* Added `Method.closure` to create an `Expression`.
* Added `FunctionType`.
* Added `{new|const}InstanceNamed` to `Expression` [#135](https://github.com/dart-lang/code_builder/issues/135).
* Also added a `typeArguments` option to all invocations.
* Added `assign{...}` variants to `Expression` [#137](https://github.com/dart-lang/code_builder/issues/137).
* Added `.awaited` and `.returned` to `Expression` [#138](https://github.com/dart-lang/code_builder/issues/138).
* **BUG FIX**: `Block` now implements `Code` [#136](https://github.com/dart-lang/code_builder/issues/136).
* **BUG FIX**: `new DartEmitter.scoped()` applies prefixing [#139](https://github.com/dart-lang/code_builder/issues/139).
* Renamed many of the `.asFoo(...)` and `.toFoo(...)` methods to single getter:
* `asCode()` to `code`
* `asStatement()` to `statement`
* `toExpression()` to `expression`
* Moved `{new|const}Instance{[Named]}` from `Expression` to `Reference`.
## 2.0.0-alpha+2
* Upgraded `build_runner` from `^0.3.0` to `>=0.4.0 <0.6.0`.
* Upgraded `build_value{_generator}` from `^1.0.0` to `>=2.0.0 <5.0.0`.
* Upgraded `source_gen` from `>=0.5.0 <0.7.0` to `^0.7.0`.
* Added `MethodModifier` to allow emit a `Method` with `async|async*|sync*`.
* Added `show|hide` to `Directive`.
* Added `Directive.importDeferredAs`.
* Added a new line character after emitting some types (class, method, etc).
* Added `refer` as a short-hand for `new Reference(...)`.
* `Reference` now implements `Expression`.
* Added many classes/methods for writing bodies of `Code` fluently:
* `Expression`
* `LiteralExpression`
* `literal`
* `literalNull`
* `literalBool`
* `literalTrue`
* `literalFalse`
* `literalNum`
* `literalString`
* `literalList` and `literalConstList`
* `literalMap` and `literalConstMap`
* `const Code(staticString)`
* `const Code.scope((allocate) => '')`
* Removed `SimpleSpecVisitor` (it was unused).
* Removed `implements Reference` from `Method` and `Field`; not a lot of value.
* `SpecVisitor<T>`'s methods all have an optional `[T context]` parameter now.
* This makes it much easier to avoid allocating extra `StringBuffer`s.
* `equalsDart` removes insignificant white space before comparing results.
## 2.0.0-alpha+1
* Removed `Reference.localScope`. Just use `Reference(symbol)` now.
* Allow `Reference` instead of an explicit `TypeReference` in most APIs.
* `toType()` is performed for you as part the emitter process
```dart
final animal = new Class((b) => b
..name = 'Animal'
// Used to need a suffix of .toType().
..extend = const Reference('Organism')
..methods.add(new Method.returnsVoid((b) => b
..name = 'eat'
..lambda = true
..body = new Code((b) => b..code = 'print(\'Yum\')'))));
```
* We now support the Dart 2.0 pre-release SDKs (`<2.0.0-dev.infinity`)
* Removed the ability to treat `Class` as a `TypeReference`.
* Was required for compilation to `dart2js`, which is now tested on travis.
## 2.0.0-alpha
* Complete re-write to not use `package:analyzer`.
* Code generation now properly uses the _builder_ pattern (via `built_value`).
* See examples and tests for details.
## 1.0.4
* Added `isInstanceOf` to `ExpressionBuilder`, which performs an `is` check:
```dart
expect(
reference('foo').isInstanceOf(_barType),
equalsSource('foo is Bar'),
);
```
## 1.0.3
* Support latest `pkg/analyzer` and `pkg/func`.
## 1.0.2
* Update internals to use newer analyzer API
## 1.0.1
* Support the latest version of `package:dart_style`.
## 1.0.0
First full release. At this point, all changes until `2.0.0` will be backward
compatible (new features) or bug fixes that are not breaking. This doesn't mean
that the entire Dart language is buildable with our API, though.
**Contributions are welcome.**
- Exposed `uri` in `ImportBuilder`, `ExportBuilder`, and `Part[Of]Builder`.
## 1.0.0-beta+7
- Added `ExpressionBuilder#ternary`.
## 1.0.0-beta+6
- Added `TypeDefBuilder`.
- Added `FunctionParameterBuilder`.
- Added `asAbstract` to various `MethodBuilder` constructors.
## 1.0.0-beta+5
- Re-published the package without merge conflicts.
## 1.0.0-beta+4
- Renamed `PartBuilder` to `PartOfBuilder`.
- Added a new class, `PartBuilder`, to represent `part '...dart'` directives.
- Added the `HasAnnotations` interface to all library/part/directive builders.
- Added `asFactory` and `asConst` to `ConstructorBuilder`.
- Added `ConstructorBuilder.redirectTo` for a redirecting factory constructor.
- Added a `name` getter to `ReferenceBuilder`.
- Supplying an empty constructor name (`''`) is equivalent to `null` (default).
- Automatically encodes string literals with multiple lines as `'''`.
- Added `asThrow` to `ExpressionBuilder`.
- Fixed a bug that prevented `FieldBuilder` from being used at the top-level.
## 1.0.0-beta+3
- Added support for `genericTypes` parameter for `ExpressionBuilder#invoke`:
```dart
expect(
explicitThis.invoke('doThing', [literal(true)], genericTypes: [
lib$core.bool,
]),
equalsSource(r'''
this.doThing<bool>(true)
'''),
);
```
- Added a `castAs` method to `ExpressionBuilder`:
```dart
expect(
literal(1.0).castAs(lib$core.num),
equalsSource(r'''
1.0 as num
'''),
);
```
### BREAKING CHANGES
- Removed `namedNewInstance` and `namedConstInstance`, replaced with `constructor: `:
```dart
expect(
reference('Foo').newInstance([], constructor: 'other'),
equalsSource(r'''
new Foo.other()
'''),
);
```
- Renamed `named` parameter to `namedArguments`:
```dart
expect(
reference('doThing').call(
[literal(true)],
namedArguments: {
'otherFlag': literal(false),
},
),
equalsSource(r'''
doThing(true, otherFlag: false)
'''),
);
```
## 1.0.0-beta+2
### BREAKING CHANGES
Avoid creating symbols that can collide with the Dart language:
- `MethodModifier.async` -> `MethodModifier.asAsync`
- `MethodModifier.asyncStar` -> `MethodModifier.asAsyncStar`
- `MethodModifier.syncStar` -> `MethodModifier.asSyncStar`
## 1.0.0-beta+1
- Add support for `switch` statements
- Add support for a raw expression and statement
- `new ExpressionBuilder.raw(...)`
- `new StatemnetBuilder.raw(...)`
This should help cover any cases not covered with builders today.
- Allow referring to a `ClassBuilder` and `TypeBuilder` as an expression
- Add support for accessing the index `[]` operator on an expression
### BREAKING CHANGES
- Changed `ExpressionBuilder.asAssign` to always take an `ExpressionBuilder` as
target and removed the `value` property. Most changes are pretty simple, and
involve just using `reference(...)`. For example:
```dart
literal(true).asAssign(reference('flag'))
```
... emits `flag = true`.
## 1.0.0-beta
- Add support for `async`, `sync`, `sync*` functions
- Add support for expression `asAwait`, `asYield`, `asYieldStar`
- Add `toExportBuilder` and `toImportBuilder` to types and references
- Fix an import scoping bug in `return` statements and named constructor invocations.
- Added constructor initializer support
- Add `while` and `do {} while` loop support
- Add `for` and `for-in` support
- Added a `name` getter for `ParameterBuilder`
## 1.0.0-alpha+7
- Make use of the new analyzer APIs in preparation for analyzer version 0.30.
## 1.0.0-alpha+6
- `MethodBuilder.closure` emits properly as a top-level function
## 1.0.0-alpha+5
- MethodBuilder with no statements will create an empty block instead of
a semicolon.
```dart
// main() {}
method('main')
```
- Fix lambdas and closures to not include a trailing semicolon when used
as an expression.
```dart
// () => false
new MethodBuilder.closure(returns: literal(false));
```
## 1.0.0-alpha+4
- Add support for the latest `pkg/analyzer`.
## 1.0.0-alpha+3
- BREAKING CHANGE: Added generics support to `TypeBuilder`:
`importFrom` becomes a _named_, not a positional argument, and the named
argument `genericTypes` is added (`Iterable<TypeBuilder>`).
```dart
// List<String>
new TypeBuilder('List', genericTypes: [reference('String')])
```
- Added generic support to `ReferenceBuilder`:
```dart
// List<String>
reference('List').toTyped([reference('String')])
```
- Fixed a bug where `ReferenceBuilder.buildAst` was not implemented
- Added `and` and `or` methods to `ExpressionBuilder`:
```dart
// true || false
literal(true).or(literal(false));
// true && false
literal(true).and(literal(false));
```
- Added support for creating closures - `MethodBuilder.closure`:
```dart
// () => true
new MethodBuilder.closure(
returns: literal(true),
returnType: lib$core.bool,
)
```
## 1.0.0-alpha+2
- Added `returnVoid` to well, `return;`
- Added support for top-level field assignments:
```dart
new LibraryBuilder()..addMember(literal(false).asConst('foo'))
```
- Added support for specifying a `target` when using `asAssign`:
```dart
// Outputs bank.bar = goldBar
reference('goldBar').asAssign('bar', target: reference('bank'))
```
- Added support for the cascade operator:
```dart
// Outputs foo..doThis()..doThat()
reference('foo').cascade((c) => <ExpressionBuilder> [
c.invoke('doThis', []),
c.invoke('doThat', []),
]);
```
- Added support for accessing a property
```dart
// foo.bar
reference('foo').property('bar');
```
## 1.0.0-alpha+1
- Slight updates to confusing documentation.
- Added support for null-aware assignments.
- Added `show` and `hide` support to `ImportBuilder`
- Added `deferred` support to `ImportBuilder`
- Added `ExportBuilder`
- Added `list` and `map` literals that support generic types
## 1.0.0-alpha
- Large refactor that makes the library more feature complete.
## 0.1.1
- Add the concept of `Scope` and change `toAst` to support it
Now your entire AST tree can be scoped and import directives
automatically added to a `LibraryBuilder` for you if you use
`LibraryBuilder.scope`.
## 0.1.0
- Initial version