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

Commit e61c9a1

Browse files
authored
Add additional features for NG2 output AST parity (#29)
* Various changes. * Update presubmit. * Add more features required for ng2 parity.
1 parent 2328448 commit e61c9a1

File tree

16 files changed

+307
-63
lines changed

16 files changed

+307
-63
lines changed

CHANGELOG.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,45 @@
11
# Changelog
22

3+
## 1.0.0-alpha+3
4+
5+
- BREAKING CHANGE: Added generics support to `TypeBuilder`:
6+
7+
`importFrom` becomes a _named_, not positional argument, and the named
8+
argument `genericTypes` is added (`Iterable<TypeBuilder>`).
9+
10+
```dart
11+
// List<String>
12+
new TypeBuilder('List', genericTypes: [reference('String')])
13+
```
14+
15+
- Added generic support to `ReferenceBuilder`:
16+
17+
```dart
18+
// List<String>
19+
reference('List').toTyped([reference('String')])
20+
```
21+
22+
- Fixed a bug where `ReferenceBuilder.buildAst` was not implemented
23+
- Added `and` and `or` methods to `ExpressionBuilder`:
24+
25+
```dart
26+
// true || false
27+
literal(true).or(literal(false));
28+
29+
// true && false
30+
literal(true).and(literal(false));
31+
```
32+
33+
- Added support for creating closures - `MethodBuilder.closure`:
34+
35+
```dart
36+
// () => true
37+
new MethodBuilder.closure(
38+
returns: literal(true),
39+
returnType: lib$core.bool,
40+
)
41+
```
42+
343
## 1.0.0-alpha+2
444

545
- Added `returnVoid` to well, `return;`

lib/code_builder.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,11 @@ export 'src/builders/reference.dart'
3030
show explicitThis, reference, ReferenceBuilder;
3131
export 'src/builders/shared.dart' show AstBuilder, Scope;
3232
export 'src/builders/statement.dart'
33-
show ifThen, elseIf, elseThen, returnVoid, IfStatementBuilder, StatementBuilder;
33+
show
34+
ifThen,
35+
elseIf,
36+
elseThen,
37+
returnVoid,
38+
IfStatementBuilder,
39+
StatementBuilder;
3440
export 'src/builders/type.dart' show NewInstanceBuilder, TypeBuilder;

lib/src/builders/expression.dart

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ Literal _literal(value) {
8181
}
8282

8383
/// Implements much of [ExpressionBuilder].
84-
abstract class AbstractExpressionMixin extends TopLevelMixin implements ExpressionBuilder {
84+
abstract class AbstractExpressionMixin implements ExpressionBuilder {
8585
@override
8686
ExpressionBuilder operator *(ExpressionBuilder other) {
8787
return new _AsBinaryExpression(
@@ -118,6 +118,15 @@ abstract class AbstractExpressionMixin extends TopLevelMixin implements Expressi
118118
);
119119
}
120120

121+
@override
122+
ExpressionBuilder and(ExpressionBuilder other) {
123+
return new _AsBinaryExpression(
124+
this,
125+
other,
126+
$and,
127+
);
128+
}
129+
121130
@override
122131
StatementBuilder asAssert() => new _AsAssert(this);
123132

@@ -221,6 +230,15 @@ abstract class AbstractExpressionMixin extends TopLevelMixin implements Expressi
221230
);
222231
}
223232

233+
@override
234+
ExpressionBuilder or(ExpressionBuilder other) {
235+
return new _AsBinaryExpression(
236+
this,
237+
other,
238+
$or,
239+
);
240+
}
241+
224242
@override
225243
ExpressionBuilder parentheses() => new _ParenthesesExpression(this);
226244

@@ -243,13 +261,17 @@ abstract class ExpressionBuilder
243261
/// Returns as an [ExpressionBuilder] dividing by [other].
244262
ExpressionBuilder operator /(ExpressionBuilder other);
245263

264+
/// Returns as an [ExpressionBuilder] `&&` [other].
265+
ExpressionBuilder and(ExpressionBuilder other);
266+
246267
/// Return as a [StatementBuilder] that `assert`s this expression.
247268
StatementBuilder asAssert();
248269

249270
/// Returns as a [StatementBuilder] that assigns to an existing [variable].
250271
///
251272
/// If [target] is specified, determined to be `{target}.{variable}`.
252-
StatementBuilder asAssign(String variable, {ExpressionBuilder target, bool nullAware});
273+
StatementBuilder asAssign(String variable,
274+
{ExpressionBuilder target, bool nullAware});
253275

254276
/// Returns as a [StatementBuilder] that assigns to a new `const` [variable].
255277
StatementBuilder asConst(String variable, [TypeBuilder type]);
@@ -311,6 +333,9 @@ abstract class ExpressionBuilder
311333
/// Returns as an [ExpressionBuilder] comparing using `!=` against [other].
312334
ExpressionBuilder notEquals(ExpressionBuilder other);
313335

336+
/// Returns as an [ExpressionBuilder] `||` [other].
337+
ExpressionBuilder or(ExpressionBuilder other);
338+
314339
/// Returns as an [ExpressionBuilder] wrapped in parentheses.
315340
ExpressionBuilder parentheses();
316341

@@ -363,7 +388,8 @@ class _AsStatement extends TopLevelMixin implements StatementBuilder {
363388
}
364389
}
365390

366-
class _MemberExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
391+
class _MemberExpression extends Object
392+
with AbstractExpressionMixin, TopLevelMixin {
367393
final String _name;
368394
final ExpressionBuilder _target;
369395

@@ -382,7 +408,8 @@ class _MemberExpression extends Object with AbstractExpressionMixin, TopLevelMix
382408
}
383409
}
384410

385-
class _LiteralExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
411+
class _LiteralExpression extends Object
412+
with AbstractExpressionMixin, TopLevelMixin {
386413
final Literal _literal;
387414

388415
_LiteralExpression(this._literal);
@@ -394,7 +421,8 @@ class _LiteralExpression extends Object with AbstractExpressionMixin, TopLevelMi
394421
Expression buildExpression([_]) => _literal;
395422
}
396423

397-
class _ParenthesesExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
424+
class _ParenthesesExpression extends Object
425+
with AbstractExpressionMixin, TopLevelMixin {
398426
final ExpressionBuilder _expression;
399427

400428
_ParenthesesExpression(this._expression);
@@ -422,7 +450,8 @@ ExpressionBuilder _expressionify(v) {
422450
throw new ArgumentError('Could not expressionify $v');
423451
}
424452

425-
class _TypedListExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
453+
class _TypedListExpression extends Object
454+
with AbstractExpressionMixin, TopLevelMixin {
426455
static List<ExpressionBuilder> _toExpression(Iterable values) {
427456
return values.map(_expressionify).toList();
428457
}
@@ -457,7 +486,8 @@ class _TypedListExpression extends Object with AbstractExpressionMixin, TopLevel
457486
}
458487
}
459488

460-
class _TypedMapExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
489+
class _TypedMapExpression extends Object
490+
with AbstractExpressionMixin, TopLevelMixin {
461491
static Map<ExpressionBuilder, ExpressionBuilder> _toExpression(Map values) {
462492
return new Map<ExpressionBuilder, ExpressionBuilder>.fromIterable(
463493
values.keys,

lib/src/builders/expression/assign.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
part of code_builder.src.builders.expression;
66

7-
class _AsAssign extends AbstractExpressionMixin {
7+
class _AsAssign extends AbstractExpressionMixin with TopLevelMixin {
88
final String _name;
99
final bool _nullAware;
1010
final ExpressionBuilder _value;
@@ -18,7 +18,9 @@ class _AsAssign extends AbstractExpressionMixin {
1818
@override
1919
Expression buildExpression([Scope scope]) {
2020
return new AssignmentExpression(
21-
_target != null ? _target.property(_name).buildExpression(scope) : stringIdentifier(_name),
21+
_target != null
22+
? _target.property(_name).buildExpression(scope)
23+
: stringIdentifier(_name),
2224
_nullAware ? $nullAwareEquals : $equals,
2325
_value.buildExpression(scope),
2426
);

lib/src/builders/expression/negate.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
part of code_builder.src.builders.expression;
66

7-
class _NegateExpression extends AbstractExpressionMixin {
7+
class _NegateExpression extends AbstractExpressionMixin with TopLevelMixin {
88
final ExpressionBuilder _expression;
99

1010
_NegateExpression(this._expression);
@@ -21,7 +21,7 @@ class _NegateExpression extends AbstractExpressionMixin {
2121
}
2222
}
2323

24-
class _NegativeExpression extends AbstractExpressionMixin {
24+
class _NegativeExpression extends AbstractExpressionMixin with TopLevelMixin {
2525
final ExpressionBuilder _expression;
2626

2727
_NegativeExpression(this._expression);

lib/src/builders/expression/operators.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
part of code_builder.src.builders.expression;
66

7-
class _AsBinaryExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
7+
class _AsBinaryExpression extends Object
8+
with AbstractExpressionMixin, TopLevelMixin {
89
final ExpressionBuilder _left;
910
final ExpressionBuilder _right;
1011
final Token _operator;

lib/src/builders/file.dart

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,12 @@ class LibraryBuilder extends FileBuilder {
6060

6161
@override
6262
CompilationUnit buildAst([_]) {
63-
var members = _members
64-
.map((m) {
65-
if (m is TopLevelMixin) {
66-
return (m as TopLevelMixin).buildTopLevelAst(_scope);
67-
}
68-
return m.buildAst(_scope);
69-
})
70-
.toList();
63+
var members = _members.map((m) {
64+
if (m is TopLevelMixin) {
65+
return (m as TopLevelMixin).buildTopLevelAst(_scope);
66+
}
67+
return m.buildAst(_scope);
68+
}).toList();
7169
var directives = <Directive>[]
7270
..addAll(_scope.toImports().map((d) => d.buildAst()))
7371
..addAll(_directives.map((d) => d.buildAst()));

0 commit comments

Comments
 (0)