Skip to content

Releases: dart-lang/code_builder

v3.0.0

09 Jan 22:06
bb5cedf
Compare
Choose a tag to compare

3.0.0

  • Also infer Constructor.lambda for factory constructors.

v3.0.0-alpha

22 Dec 20:21
5b17b90
Compare
Choose a tag to compare
v3.0.0-alpha Pre-release
Pre-release

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.

v2.4.0

11 Dec 02:32
Compare
Choose a tag to compare

2.4.0

  • Add equalTo, notEqualTo, greaterThan, lessThan, greateOrEqualTo, and
    lessOrEqualTo to Expression.

v2.3.0

27 Nov 04:00
0ff897d
Compare
Choose a tag to compare
  • 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:
// 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:
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:
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:
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.

v2.2.0

22 Nov 05:04
8d2ee42
Compare
Choose a tag to compare
  • 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:

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:

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();
      '''),
    );
  });
}

v2.1.0

04 Nov 18:50
5048887
Compare
Choose a tag to compare

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:

import 'dart:io';

import 'package:code_builder/code_builder.dart' hide File;

We will remove File in 3.0.0, so use Library instead.

v2.0.0

28 Oct 00:29
f7d053c
Compare
Choose a tag to compare

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.

// 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...

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 any 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:
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

24 Oct 17:38
Compare
Choose a tag to compare
2.0.0-beta Pre-release
Pre-release

2.0.0-beta

  • Added lazySpec and lazyCode to lazily create code on visit #145.

  • BUG FIX: equalsDart emits the failing source code #147.

  • BUG FIX: Top-level lambda Methods no longer emit invalid code #146.

2.0.0-alpha+3

16 Oct 17:50
Compare
Choose a tag to compare
2.0.0-alpha+3 Pre-release
Pre-release

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.

    • Also added a typeArguments option to all invocations.
  • Added assign{...} variants to Expression #137.

  • Added .awaited and .returned to Expression #138.

  • BUG FIX: Block now implements Code #136.

  • BUG FIX: new DartEmitter.scoped() applies prefixing #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

13 Oct 21:09
Compare
Choose a tag to compare
2.0.0-alpha+2 Pre-release
Pre-release

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 StringBuffers.
  • equalsDart removes insignificant white space before comparing results.