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

Commit 2328448

Browse files
authored
More parity support with the Angular Dart output AST (#25)
* Various changes. * Update presubmit. * More changes to get NG2-output parity
1 parent a0c6a33 commit 2328448

21 files changed

+235
-33
lines changed

.analysis_options

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ linter:
2121
- empty_constructor_bodies
2222
- hash_and_equals
2323
- library_prefixes
24-
- non_constant_identifier_names
24+
# This convention is broken on purpose in parts of the code.
25+
# - non_constant_identifier_names
2526
- prefer_is_not_empty
2627
- slash_for_doc_comments
2728
- type_init_formals

CHANGELOG.md

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

3+
## 1.0.0-alpha+2
4+
5+
- Added `returnVoid` to well, `return;`
6+
- Added support for top-level field assignments:
7+
8+
```dart
9+
new LibraryBuilder()..addMember(literal(false).asConst('foo'))
10+
```
11+
12+
- Added support for specifying a `target` when using `asAssign`:
13+
14+
```dart
15+
// Outputs bank.bar = goldBar
16+
reference('goldBar').asAssign('bar', target: reference('bank'))
17+
```
18+
19+
- Added support for the cascade operator:
20+
21+
```dart
22+
// Outputs foo..doThis()..doThat()
23+
reference('foo').cascade((c) => <ExpressionBuilder> [
24+
c.invoke('doThis', []),
25+
c.invoke('doThat', []),
26+
]);
27+
```
28+
29+
- Added support for accessing a property
30+
31+
```dart
32+
// foo.bar
33+
reference('foo').property('bar');
34+
```
35+
336
## 1.0.0-alpha+1
437

538
- Slight updates to confusing documentation.

lib/code_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@ 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, IfStatementBuilder, StatementBuilder;
33+
show ifThen, elseIf, elseThen, returnVoid, IfStatementBuilder, StatementBuilder;
3434
export 'src/builders/type.dart' show NewInstanceBuilder, TypeBuilder;

lib/src/builders/expression.dart

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:analyzer/src/dart/ast/token.dart';
99
import 'package:code_builder/dart/core.dart';
1010
import 'package:code_builder/src/builders/method.dart';
1111
import 'package:code_builder/src/builders/parameter.dart';
12+
import 'package:code_builder/src/builders/reference.dart';
1213
import 'package:code_builder/src/builders/shared.dart';
1314
import 'package:code_builder/src/builders/statement.dart';
1415
import 'package:code_builder/src/builders/statement/if.dart';
@@ -17,6 +18,7 @@ import 'package:code_builder/src/tokens.dart';
1718

1819
part 'expression/assert.dart';
1920
part 'expression/assign.dart';
21+
part 'expression/cascade.dart';
2022
part 'expression/invocation.dart';
2123
part 'expression/negate.dart';
2224
part 'expression/operators.dart';
@@ -79,7 +81,7 @@ Literal _literal(value) {
7981
}
8082

8183
/// Implements much of [ExpressionBuilder].
82-
abstract class AbstractExpressionMixin implements ExpressionBuilder {
84+
abstract class AbstractExpressionMixin extends TopLevelMixin implements ExpressionBuilder {
8385
@override
8486
ExpressionBuilder operator *(ExpressionBuilder other) {
8587
return new _AsBinaryExpression(
@@ -122,9 +124,10 @@ abstract class AbstractExpressionMixin implements ExpressionBuilder {
122124
@override
123125
StatementBuilder asAssign(
124126
String variable, {
127+
ExpressionBuilder target,
125128
bool nullAware: false,
126129
}) =>
127-
new _AsAssign(this, variable, nullAware);
130+
new _AsAssign(this, variable, nullAware, target);
128131

129132
@override
130133
StatementBuilder asConst(String variable, [TypeBuilder type]) {
@@ -166,6 +169,14 @@ abstract class AbstractExpressionMixin implements ExpressionBuilder {
166169
return invocation;
167170
}
168171

172+
@override
173+
ExpressionBuilder cascade(
174+
Iterable<ExpressionBuilder> create(ExpressionBuilder self),
175+
) {
176+
// Sorry for the huge hack. Need to think more clearly about this in future.
177+
return new _CascadeExpression(this, create(reference('.')));
178+
}
179+
169180
@override
170181
ExpressionBuilder equals(ExpressionBuilder other) {
171182
return new _AsBinaryExpression(
@@ -212,6 +223,9 @@ abstract class AbstractExpressionMixin implements ExpressionBuilder {
212223

213224
@override
214225
ExpressionBuilder parentheses() => new _ParenthesesExpression(this);
226+
227+
@override
228+
ExpressionBuilder property(String name) => new _MemberExpression(this, name);
215229
}
216230

217231
/// Builds an [Expression] AST when [buildExpression] is invoked.
@@ -233,7 +247,9 @@ abstract class ExpressionBuilder
233247
StatementBuilder asAssert();
234248

235249
/// Returns as a [StatementBuilder] that assigns to an existing [variable].
236-
StatementBuilder asAssign(String variable, {bool nullAware});
250+
///
251+
/// If [target] is specified, determined to be `{target}.{variable}`.
252+
StatementBuilder asAssign(String variable, {ExpressionBuilder target, bool nullAware});
237253

238254
/// Returns as a [StatementBuilder] that assigns to a new `const` [variable].
239255
StatementBuilder asConst(String variable, [TypeBuilder type]);
@@ -268,6 +284,11 @@ abstract class ExpressionBuilder
268284
Map<String, ExpressionBuilder> namedArguments,
269285
]);
270286

287+
/// Return as an [ExpressionBuilder] with `..` appended.
288+
ExpressionBuilder cascade(
289+
Iterable<ExpressionBuilder> create(ExpressionBuilder self),
290+
);
291+
271292
/// Returns as an [ExpressionBuilder] comparing using `==` against [other].
272293
ExpressionBuilder equals(ExpressionBuilder other);
273294

@@ -292,6 +313,9 @@ abstract class ExpressionBuilder
292313

293314
/// Returns as an [ExpressionBuilder] wrapped in parentheses.
294315
ExpressionBuilder parentheses();
316+
317+
/// Returns {{this}}.{{name}}.
318+
ExpressionBuilder property(String name);
295319
}
296320

297321
/// An [AstBuilder] that can add [ExpressionBuilder].
@@ -322,13 +346,13 @@ abstract class HasExpressionsMixin extends HasExpressions {
322346
}
323347
}
324348

325-
class _AsStatement implements StatementBuilder {
349+
class _AsStatement extends TopLevelMixin implements StatementBuilder {
326350
final ExpressionBuilder _expression;
327351

328352
_AsStatement(this._expression);
329353

330354
@override
331-
AstNode buildAst([Scope scope]) => buildStatement(scope);
355+
Statement buildAst([Scope scope]) => buildStatement(scope);
332356

333357
@override
334358
Statement buildStatement([Scope scope]) {
@@ -339,7 +363,26 @@ class _AsStatement implements StatementBuilder {
339363
}
340364
}
341365

342-
class _LiteralExpression extends Object with AbstractExpressionMixin {
366+
class _MemberExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
367+
final String _name;
368+
final ExpressionBuilder _target;
369+
370+
_MemberExpression(this._target, this._name);
371+
372+
@override
373+
AstNode buildAst([Scope scope]) => buildExpression(scope);
374+
375+
@override
376+
Expression buildExpression([Scope scope]) {
377+
return new PropertyAccess(
378+
_target.buildExpression(scope),
379+
$period,
380+
stringIdentifier(_name),
381+
);
382+
}
383+
}
384+
385+
class _LiteralExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
343386
final Literal _literal;
344387

345388
_LiteralExpression(this._literal);
@@ -351,7 +394,7 @@ class _LiteralExpression extends Object with AbstractExpressionMixin {
351394
Expression buildExpression([_]) => _literal;
352395
}
353396

354-
class _ParenthesesExpression extends Object with AbstractExpressionMixin {
397+
class _ParenthesesExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
355398
final ExpressionBuilder _expression;
356399

357400
_ParenthesesExpression(this._expression);
@@ -379,7 +422,7 @@ ExpressionBuilder _expressionify(v) {
379422
throw new ArgumentError('Could not expressionify $v');
380423
}
381424

382-
class _TypedListExpression extends Object with AbstractExpressionMixin {
425+
class _TypedListExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
383426
static List<ExpressionBuilder> _toExpression(Iterable values) {
384427
return values.map(_expressionify).toList();
385428
}
@@ -414,7 +457,7 @@ class _TypedListExpression extends Object with AbstractExpressionMixin {
414457
}
415458
}
416459

417-
class _TypedMapExpression extends Object with AbstractExpressionMixin {
460+
class _TypedMapExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
418461
static Map<ExpressionBuilder, ExpressionBuilder> _toExpression(Map values) {
419462
return new Map<ExpressionBuilder, ExpressionBuilder>.fromIterable(
420463
values.keys,

lib/src/builders/expression/assert.dart

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

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

7-
class _AsAssert implements StatementBuilder {
7+
class _AsAssert extends TopLevelMixin implements StatementBuilder {
88
final ExpressionBuilder _expression;
99

1010
_AsAssert(this._expression);
1111

1212
@override
13-
AstNode buildAst([Scope scope]) => buildStatement(scope);
13+
Statement buildAst([Scope scope]) => buildStatement(scope);
1414

1515
@override
1616
Statement buildStatement([Scope scope]) {

lib/src/builders/expression/assign.dart

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,24 @@ class _AsAssign extends AbstractExpressionMixin {
88
final String _name;
99
final bool _nullAware;
1010
final ExpressionBuilder _value;
11+
final ExpressionBuilder _target;
1112

12-
_AsAssign(this._value, this._name, this._nullAware);
13+
_AsAssign(this._value, this._name, this._nullAware, this._target);
1314

1415
@override
1516
AstNode buildAst([Scope scope]) => buildExpression(scope);
1617

1718
@override
1819
Expression buildExpression([Scope scope]) {
1920
return new AssignmentExpression(
20-
stringIdentifier(_name),
21+
_target != null ? _target.property(_name).buildExpression(scope) : stringIdentifier(_name),
2122
_nullAware ? $nullAwareEquals : $equals,
2223
_value.buildExpression(scope),
2324
);
2425
}
2526
}
2627

27-
class _AsAssignNew implements StatementBuilder {
28+
class _AsAssignNew extends TopLevelMixin implements StatementBuilder {
2829
final ExpressionBuilder _value;
2930
final String _name;
3031
final TypeBuilder _type;
@@ -33,7 +34,7 @@ class _AsAssignNew implements StatementBuilder {
3334
_AsAssignNew(this._value, this._name, this._type, this._modifier);
3435

3536
@override
36-
AstNode buildAst([Scope scope]) => buildStatement(scope);
37+
Statement buildAst([Scope scope]) => buildStatement(scope);
3738

3839
@override
3940
Statement buildStatement([Scope scope]) {
@@ -54,4 +55,26 @@ class _AsAssignNew implements StatementBuilder {
5455
$semicolon,
5556
);
5657
}
58+
59+
@override
60+
CompilationUnitMember buildTopLevelAst([Scope scope]) {
61+
return new TopLevelVariableDeclaration(
62+
null,
63+
null,
64+
new VariableDeclarationList(
65+
null,
66+
null,
67+
_type == null || _modifier != $var ? _modifier : null,
68+
_type?.buildType(scope),
69+
[
70+
new VariableDeclaration(
71+
stringIdentifier(_name),
72+
$equals,
73+
_value.buildExpression(scope),
74+
),
75+
],
76+
),
77+
$semicolon,
78+
);
79+
}
5780
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
part of code_builder.src.builders.expression;
6+
7+
class _CascadeExpression extends TopLevelMixin with AbstractExpressionMixin {
8+
final List<ExpressionBuilder> _cascades;
9+
final ExpressionBuilder _target;
10+
11+
_CascadeExpression(this._target, this._cascades);
12+
13+
@override
14+
AstNode buildAst([Scope scope]) => buildExpression(scope);
15+
16+
@override
17+
Expression buildExpression([Scope scope]) {
18+
return new CascadeExpression(
19+
_target.buildExpression(scope),
20+
_cascades.map((e) => e.buildExpression(scope)).toList(),
21+
);
22+
}
23+
}

lib/src/builders/expression/invocation.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ abstract class InvocationBuilder
6363
}
6464

6565
class _FunctionInvocationBuilder extends Object
66-
with AbstractInvocationBuilderMixin, AbstractExpressionMixin
66+
with AbstractInvocationBuilderMixin, AbstractExpressionMixin, TopLevelMixin
6767
implements InvocationBuilder {
6868
final ExpressionBuilder _target;
6969

@@ -80,7 +80,7 @@ class _FunctionInvocationBuilder extends Object
8080
}
8181

8282
class _MethodInvocationBuilder extends Object
83-
with AbstractInvocationBuilderMixin, AbstractExpressionMixin
83+
with AbstractInvocationBuilderMixin, AbstractExpressionMixin, TopLevelMixin
8484
implements InvocationBuilder {
8585
final String _method;
8686
final ExpressionBuilder _target;

lib/src/builders/expression/operators.dart

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

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

7-
class _AsBinaryExpression extends Object with AbstractExpressionMixin {
7+
class _AsBinaryExpression extends Object with AbstractExpressionMixin, TopLevelMixin {
88
final ExpressionBuilder _left;
99
final ExpressionBuilder _right;
1010
final Token _operator;

lib/src/builders/expression/return.dart

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

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

7-
class _AsReturn implements StatementBuilder {
7+
class _AsReturn extends TopLevelMixin implements StatementBuilder {
88
final ExpressionBuilder _value;
99

1010
_AsReturn(this._value);

0 commit comments

Comments
 (0)