Skip to content
This repository was archived by the owner on Apr 8, 2025. It is now read-only.

Commit b2d01d4

Browse files
authored
New features for 1.0.0-beta (#52)
* Add for/for-in loop Closes https://github.com/dart-lang/code_builder/issues/49 * Add support for while/do-while * Add constructor initializers Closes https://github.com/dart-lang/code_builder/issues/50 * Update CHANGELOG and pubspec for beta * Add “name” getter for ParameterBuilder Partial support towards https://github.com/dart-lang/code_builder/issues/43 * Update CHANGELOG * Address feedback
1 parent c6e69c6 commit b2d01d4

File tree

13 files changed

+444
-20
lines changed

13 files changed

+444
-20
lines changed

CHANGELOG.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
## 1.0.0-alpha+9
1+
## 1.0.0-beta
22

33
- Add support for `async`, `sync`, `sync*` functions
44
- Add support for expression `asAwait`, `asYield`, `asYieldStar`
55
- Add `toExportBuilder` and `toImportBuilder` to types and references
6-
7-
## 1.0.0-alpha+8
8-
96
- Fix an import scoping bug in `return` statements and named constructor invocations.
7+
- Added constructor initializer support
8+
- Add `while` and `do {} while` loop support
9+
- Add `for` and `for-in` support
10+
- Added a `name` getter for `ParameterBuilder`
1011

1112
## 1.0.0-alpha+7
1213

lib/code_builder.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ export 'src/builders/statement.dart'
3636
elseIf,
3737
elseThen,
3838
returnVoid,
39+
ForStatementBuilder,
3940
IfStatementBuilder,
40-
StatementBuilder;
41+
StatementBuilder,
42+
WhileStatementBuilder;
4143
export 'src/builders/type.dart' show NewInstanceBuilder, TypeBuilder;

lib/src/builders/expression.dart

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:code_builder/src/builders/reference.dart';
1414
import 'package:code_builder/src/builders/shared.dart';
1515
import 'package:code_builder/src/builders/statement.dart';
1616
import 'package:code_builder/src/builders/statement/if.dart';
17+
import 'package:code_builder/src/builders/statement/while.dart';
1718
import 'package:code_builder/src/builders/type.dart';
1819
import 'package:code_builder/src/tokens.dart';
1920

@@ -35,6 +36,9 @@ final _null = astFactory.nullLiteral(new KeywordToken(Keyword.NULL, 0));
3536
final _true =
3637
astFactory.booleanLiteral(new KeywordToken(Keyword.TRUE, 0), true);
3738

39+
/// A reference to `super`.
40+
ExpressionBuilder get superRef => new _SuperExpression();
41+
3842
/// Returns a pre-defined literal expression of [value].
3943
///
4044
/// Only primitive values are allowed.
@@ -123,6 +127,24 @@ abstract class AbstractExpressionMixin implements ExpressionBuilder {
123127
);
124128
}
125129

130+
@override
131+
ExpressionBuilder operator >(ExpressionBuilder other) {
132+
return new _AsBinaryExpression(
133+
this,
134+
other,
135+
$gt,
136+
);
137+
}
138+
139+
@override
140+
ExpressionBuilder operator <(ExpressionBuilder other) {
141+
return new _AsBinaryExpression(
142+
this,
143+
other,
144+
$lt,
145+
);
146+
}
147+
126148
@override
127149
ExpressionBuilder and(ExpressionBuilder other) {
128150
return new _AsBinaryExpression(
@@ -176,6 +198,11 @@ abstract class AbstractExpressionMixin implements ExpressionBuilder {
176198
@override
177199
StatementBuilder asYieldStar() => new _AsYield(this, true);
178200

201+
@override
202+
WhileStatementBuilder asWhile({bool asDo: false}) {
203+
return new WhileStatementBuilder(asDo, this);
204+
}
205+
179206
@override
180207
Statement buildStatement([Scope scope]) {
181208
return asStatement().buildStatement(scope);
@@ -200,6 +227,9 @@ abstract class AbstractExpressionMixin implements ExpressionBuilder {
200227
return new _CascadeExpression(this, create(reference('.')));
201228
}
202229

230+
@override
231+
ExpressionBuilder decrement() => new _DecrementExpression(this);
232+
203233
@override
204234
ExpressionBuilder equals(ExpressionBuilder other) {
205235
return new _AsBinaryExpression(
@@ -209,9 +239,14 @@ abstract class AbstractExpressionMixin implements ExpressionBuilder {
209239
);
210240
}
211241

242+
@override
243+
ExpressionBuilder increment([bool prefix = false]) {
244+
return new _IncrementExpression(this, prefix);
245+
}
246+
212247
@override
213248
ExpressionBuilder identical(ExpressionBuilder other) {
214-
return lib$core.identical.call([
249+
return lib$core.identical.call(<ExpressionBuilder>[
215250
this,
216251
other,
217252
]);
@@ -275,6 +310,12 @@ abstract class ExpressionBuilder
275310
/// Returns as an [ExpressionBuilder] dividing by [other].
276311
ExpressionBuilder operator /(ExpressionBuilder other);
277312

313+
/// Returns as an [ExpressionBuilder] `<` by [other].
314+
ExpressionBuilder operator <(ExpressionBuilder other);
315+
316+
/// Returns as an [ExpressionBuilder] `>` by [other].
317+
ExpressionBuilder operator >(ExpressionBuilder other);
318+
278319
/// Returns as an [ExpressionBuilder] `&&` [other].
279320
ExpressionBuilder and(ExpressionBuilder other);
280321

@@ -323,6 +364,9 @@ abstract class ExpressionBuilder
323364
/// Returns as a [StatementBuilder] yielding this one.
324365
StatementBuilder asYieldStar();
325366

367+
/// Returns as a [WhileStatementBuilder] with this as the condition.
368+
WhileStatementBuilder asWhile({bool asDo: false});
369+
326370
/// Returns an [Expression] AST representing the builder.
327371
Expression buildExpression([Scope scope]);
328372

@@ -337,12 +381,18 @@ abstract class ExpressionBuilder
337381
Iterable<ExpressionBuilder> create(ExpressionBuilder self),
338382
);
339383

384+
/// Returns as an [ExpressionBuilder] decrementing this expression.
385+
ExpressionBuilder decrement();
386+
340387
/// Returns as an [ExpressionBuilder] comparing using `==` against [other].
341388
ExpressionBuilder equals(ExpressionBuilder other);
342389

343390
/// Returns as an [ExpressionBuilder] comparing using `identical`.
344391
ExpressionBuilder identical(ExpressionBuilder other);
345392

393+
/// Returns as an [ExpressionBuilder] incrementing this expression.
394+
ExpressionBuilder increment([bool prefix = false]);
395+
346396
/// Returns as an [InvocationBuilder] on [method] of this expression.
347397
InvocationBuilder invoke(
348398
String method,
@@ -476,6 +526,15 @@ ExpressionBuilder _expressionify(v) {
476526
throw new ArgumentError('Could not expressionify $v');
477527
}
478528

529+
class _SuperExpression extends Object
530+
with AbstractExpressionMixin, TopLevelMixin {
531+
@override
532+
AstNode buildAst([Scope scope]) => buildExpression(scope);
533+
534+
@override
535+
Expression buildExpression([_]) => astFactory.superExpression($super);
536+
}
537+
479538
class _TypedListExpression extends Object
480539
with AbstractExpressionMixin, TopLevelMixin {
481540
static List<ExpressionBuilder> _toExpression(Iterable values) {

lib/src/builders/expression/operators.dart

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,46 @@ class _AsBinaryExpression extends Object
2424
);
2525
}
2626
}
27+
28+
class _DecrementExpression extends Object
29+
with AbstractExpressionMixin, TopLevelMixin {
30+
final ExpressionBuilder _expression;
31+
32+
_DecrementExpression(this._expression);
33+
34+
@override
35+
AstNode buildAst([Scope scope]) => buildExpression(scope);
36+
37+
@override
38+
Expression buildExpression([Scope scope]) {
39+
return astFactory.postfixExpression(
40+
_expression.buildExpression(scope),
41+
$minusMinus,
42+
);
43+
}
44+
}
45+
46+
class _IncrementExpression extends Object
47+
with AbstractExpressionMixin, TopLevelMixin {
48+
final ExpressionBuilder _expression;
49+
final bool _prefix;
50+
51+
_IncrementExpression(this._expression, this._prefix);
52+
53+
@override
54+
AstNode buildAst([Scope scope]) => buildExpression(scope);
55+
56+
@override
57+
Expression buildExpression([Scope scope]) {
58+
if (_prefix) {
59+
return astFactory.prefixExpression(
60+
$plusPlus,
61+
_expression.buildExpression(scope),
62+
);
63+
}
64+
return astFactory.postfixExpression(
65+
_expression.buildExpression(scope),
66+
$plusPlus,
67+
);
68+
}
69+
}

lib/src/builders/method.dart

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ ConstructorBuilder _constructorImpl({
171171
throw new StateError('Invalid AST type: ${member.runtimeType}');
172172
}
173173
}
174-
final constructor = new ConstructorBuilder(name);
174+
final constructor = new ConstructorBuilder(name: name);
175175
_addFunctions.forEach((a) => a(constructor));
176176
return constructor;
177177
}
@@ -186,7 +186,20 @@ abstract class ConstructorBuilder
186186
HasStatements,
187187
ValidClassMember {
188188
/// Create a new [ConstructorBuilder], optionally with a [name].
189-
factory ConstructorBuilder([String name]) = _NormalConstructorBuilder;
189+
///
190+
/// Can invoke `super` if [invokeSuper] is set, using super.[superName].
191+
factory ConstructorBuilder({
192+
String name,
193+
String superName,
194+
List<ExpressionBuilder> invokeSuper,
195+
}) = _NormalConstructorBuilder;
196+
197+
/// Adds a field initializer to this constructor.
198+
void addInitializer(
199+
String fieldName, {
200+
ExpressionBuilder toExpression,
201+
String toParameter,
202+
});
190203

191204
@override
192205
void addNamed(ParameterBuilder parameter, {bool asField: false});
@@ -530,18 +543,69 @@ class _NamedParameterWrapper
530543
class _NormalConstructorBuilder extends Object
531544
with HasAnnotationsMixin, HasParametersMixin, HasStatementsMixin
532545
implements ConstructorBuilder {
546+
final _initializers = <String, ExpressionBuilder>{};
533547
final String _name;
548+
final String _superName;
549+
final List<ExpressionBuilder> _superInvocation;
534550

535-
_NormalConstructorBuilder([this._name]);
551+
_NormalConstructorBuilder({
552+
List<ExpressionBuilder> invokeSuper,
553+
String name,
554+
String superName,
555+
})
556+
: _name = name,
557+
_superInvocation = invokeSuper,
558+
_superName = superName;
559+
560+
@override
561+
void addInitializer(
562+
String fieldName, {
563+
ExpressionBuilder toExpression,
564+
String toParameter,
565+
}) {
566+
_initializers[fieldName] = toExpression ?? reference(toParameter);
567+
}
536568

537569
@override
538570
ConstructorDeclaration buildAst([Scope scope]) {
539571
throw new UnsupportedError('Can only be built as part of a class.');
540572
}
541573

542574
@override
543-
ConstructorDeclaration buildConstructor(TypeBuilder returnType,
544-
[Scope scope]) {
575+
ConstructorDeclaration buildConstructor(
576+
TypeBuilder returnType, [
577+
Scope scope,
578+
]) {
579+
List<ConstructorInitializer> initializers;
580+
if (_initializers.isNotEmpty) {
581+
initializers ??= [];
582+
initializers.addAll(
583+
_initializers.keys.map((fieldName) {
584+
return astFactory.constructorFieldInitializer(
585+
null,
586+
null,
587+
astFactory.simpleIdentifier(stringToken(fieldName)),
588+
$equals,
589+
_initializers[fieldName].buildExpression(scope),
590+
);
591+
}),
592+
);
593+
}
594+
if (_superInvocation != null) {
595+
initializers ??= [];
596+
initializers.add(astFactory.superConstructorInvocation(
597+
$super,
598+
_superName != null ? $period : null,
599+
_superName != null
600+
? astFactory.simpleIdentifier(stringToken(_superName))
601+
: null,
602+
astFactory.argumentList(
603+
$openParen,
604+
_superInvocation.map((e) => e.buildExpression(scope)).toList(),
605+
$closeParen,
606+
),
607+
));
608+
}
545609
return astFactory.constructorDeclaration(
546610
null,
547611
buildAnnotations(scope),
@@ -552,8 +616,8 @@ class _NormalConstructorBuilder extends Object
552616
_name != null ? $period : null,
553617
_name != null ? stringIdentifier(_name) : null,
554618
buildParameterList(scope),
555-
null,
556-
null,
619+
initializers != null && initializers.isNotEmpty ? $semicolon : null,
620+
initializers,
557621
null,
558622
!hasStatements
559623
? astFactory.emptyFunctionBody($semicolon)

lib/src/builders/parameter.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ abstract class ParameterBuilder
100100

101101
/// Returns a positional [FormalParameter] AST representing the builder.
102102
FormalParameter buildPositional(bool field, [Scope scope]);
103+
104+
/// Name of the parameter.
105+
String get name;
103106
}
104107

105108
/// A marker interface for an AST that could be added to [ParameterBuilder].
@@ -140,6 +143,9 @@ class _OptionalParameterBuilder extends Object
140143
_expression?.buildExpression(scope),
141144
);
142145
}
146+
147+
@override
148+
String get name => _parameter.name;
143149
}
144150

145151
class _ParameterPair {
@@ -165,15 +171,15 @@ class _ParameterPair {
165171
class _SimpleParameterBuilder extends Object
166172
with HasAnnotationsMixin
167173
implements ParameterBuilder {
168-
final String _name;
174+
@override
175+
final String name;
169176
final TypeBuilder _type;
170177

171178
_SimpleParameterBuilder(
172-
String name, {
179+
this.name, {
173180
TypeBuilder type,
174181
})
175-
: _name = name,
176-
_type = type;
182+
: _type = type;
177183

178184
@override
179185
ParameterBuilder asOptional([ExpressionBuilder defaultTo]) {
@@ -198,7 +204,7 @@ class _SimpleParameterBuilder extends Object
198204
_type?.buildType(scope),
199205
$this,
200206
$period,
201-
stringIdentifier(_name),
207+
stringIdentifier(name),
202208
null,
203209
null,
204210
);
@@ -208,7 +214,7 @@ class _SimpleParameterBuilder extends Object
208214
buildAnnotations(scope),
209215
null,
210216
_type?.buildType(scope),
211-
stringIdentifier(_name),
217+
stringIdentifier(name),
212218
);
213219
}
214220
}

lib/src/builders/statement.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ import 'package:code_builder/src/builders/shared.dart';
99
import 'package:code_builder/src/builders/statement/if.dart';
1010
import 'package:code_builder/src/tokens.dart';
1111

12+
export 'package:code_builder/src/builders/statement/for.dart'
13+
show ForStatementBuilder;
1214
export 'package:code_builder/src/builders/statement/if.dart'
1315
show IfStatementBuilder, elseIf, elseThen, ifThen;
16+
export 'package:code_builder/src/builders/statement/while.dart'
17+
show WhileStatementBuilder;
1418

1519
/// An [AstBuilder] that can add [StatementBuilder].
1620
abstract class HasStatements implements AstBuilder {

0 commit comments

Comments
 (0)