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

Commit 37f08c0

Browse files
authored
Close a bunch of open issues for 1.0.0-beta+1 (#64)
* Close a bunch of open issues. * Update CHANGELOG.
1 parent bd53bd3 commit 37f08c0

File tree

12 files changed

+176
-56
lines changed

12 files changed

+176
-56
lines changed

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@
77

88
This should help cover any cases not covered with builders today.
99

10+
- Allow referring to a `ClassBuilder` and `TypeBuilder` as an expression
11+
- Add support for accessing the index `[]` operator on an expression
12+
13+
### BREAKING CHANGES
14+
15+
- Changed `ExpressionBuilder.asAssign` to always take an `ExpressionBuilder` as
16+
target and removed the `value` property. Most changes are pretty simple, and
17+
involve just using `reference(...)`. For example:
18+
19+
```dart
20+
literal(true).asAssign(reference('flag'))
21+
```
22+
23+
... emits `flag = true`.
24+
1025
## 1.0.0-beta
1126

1227
- Add support for `async`, `sync`, `sync*` functions

lib/src/builders/class.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ import 'package:analyzer/analyzer.dart';
66
import 'package:analyzer/dart/ast/standard_ast_factory.dart';
77
import 'package:code_builder/dart/core.dart';
88
import 'package:code_builder/src/builders/annotation.dart';
9+
import 'package:code_builder/src/builders/expression.dart';
910
import 'package:code_builder/src/builders/field.dart';
1011
import 'package:code_builder/src/builders/file.dart';
1112
import 'package:code_builder/src/builders/method.dart';
13+
import 'package:code_builder/src/builders/reference.dart';
1214
import 'package:code_builder/src/builders/shared.dart';
15+
import 'package:code_builder/src/builders/statement.dart';
1316
import 'package:code_builder/src/builders/type.dart';
1417
import 'package:code_builder/src/tokens.dart';
1518

@@ -133,7 +136,7 @@ abstract class ClassBuilder
133136
abstract class ValidClassMember implements AstBuilder {}
134137

135138
class _ClassBuilderImpl extends Object
136-
with AbstractTypeBuilderMixin, HasAnnotationsMixin
139+
with AbstractExpressionMixin, AbstractTypeBuilderMixin, HasAnnotationsMixin
137140
implements ClassBuilder {
138141
final _constructors = <ConstructorBuilder>[];
139142
final _fields = <FieldBuilder, bool>{};
@@ -265,6 +268,14 @@ class _ClassBuilderImpl extends Object
265268
ImportBuilder toImportBuilder({bool deferred: false, String prefix}) {
266269
throw new UnsupportedError('Not supported for ClassBuilder');
267270
}
271+
272+
@override
273+
Expression buildExpression([Scope scope]) {
274+
return reference(_name).buildExpression(scope);
275+
}
276+
277+
@override
278+
CompilationUnitMember buildTopLevelAst([Scope scope]) => buildClass(scope);
268279
}
269280

270281
class _TypeNameWrapper implements ValidClassMember {

lib/src/builders/expression.dart

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ part 'expression/assert.dart';
2323
part 'expression/assign.dart';
2424
part 'expression/await.dart';
2525
part 'expression/cascade.dart';
26+
part 'expression/index.dart';
2627
part 'expression/invocation.dart';
2728
part 'expression/negate.dart';
2829
part 'expression/operators.dart';
@@ -146,6 +147,11 @@ abstract class AbstractExpressionMixin implements ExpressionBuilder {
146147
);
147148
}
148149

150+
@override
151+
ExpressionBuilder operator [](ExpressionBuilder index) {
152+
return new _IndexExpression(this, index);
153+
}
154+
149155
@override
150156
ExpressionBuilder and(ExpressionBuilder other) {
151157
return new _AsBinaryExpression(
@@ -160,11 +166,10 @@ abstract class AbstractExpressionMixin implements ExpressionBuilder {
160166

161167
@override
162168
StatementBuilder asAssign(
163-
String variable, {
164-
ExpressionBuilder target,
169+
ExpressionBuilder target, {
165170
bool nullAware: false,
166171
}) =>
167-
new _AsAssign(this, variable, nullAware, target);
172+
new _AsAssign(this, nullAware, target);
168173

169174
@override
170175
ExpressionBuilder asAwait() => new _AsAwait(this);
@@ -320,18 +325,18 @@ abstract class ExpressionBuilder
320325
/// Returns as an [ExpressionBuilder] `>` by [other].
321326
ExpressionBuilder operator >(ExpressionBuilder other);
322327

328+
/// Returns as an [ExpressionBuilder] reading the `[]` property with [index].
329+
ExpressionBuilder operator [](ExpressionBuilder index);
330+
323331
/// Returns as an [ExpressionBuilder] `&&` [other].
324332
ExpressionBuilder and(ExpressionBuilder other);
325333

326334
/// Return as a [StatementBuilder] that `assert`s this expression.
327335
StatementBuilder asAssert();
328336

329-
/// Returns as a [StatementBuilder] that assigns to an existing [variable].
330-
///
331-
/// If [target] is specified, determined to be `{target}.{variable}`.
337+
/// Returns as a [StatementBuilder] that assigns to [target].
332338
StatementBuilder asAssign(
333-
String variable, {
334-
ExpressionBuilder target,
339+
ExpressionBuilder target, {
335340
bool nullAware,
336341
});
337342

lib/src/builders/expression/assign.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,19 @@
55
part of code_builder.src.builders.expression;
66

77
class _AsAssign extends AbstractExpressionMixin with TopLevelMixin {
8-
final String _name;
98
final bool _nullAware;
109
final ExpressionBuilder _value;
1110
final ExpressionBuilder _target;
1211

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

1514
@override
1615
AstNode buildAst([Scope scope]) => buildExpression(scope);
1716

1817
@override
1918
Expression buildExpression([Scope scope]) {
2019
return astFactory.assignmentExpression(
21-
_target != null
22-
? _target.property(_name).buildExpression(scope)
23-
: stringIdentifier(_name),
20+
_target.buildExpression(scope),
2421
_nullAware ? $nullAwareEquals : $equals,
2522
_value.buildExpression(scope),
2623
);

lib/src/builders/expression/await.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class _AsAwait extends AbstractExpressionMixin with TopLevelMixin {
1414

1515
@override
1616
Expression buildExpression([Scope scope]) {
17-
return new AwaitExpression(
17+
return astFactory.awaitExpression(
1818
$await,
1919
_expression.buildExpression(scope),
2020
);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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 _IndexExpression extends AbstractExpressionMixin with TopLevelMixin {
8+
final ExpressionBuilder _target;
9+
final ExpressionBuilder _index;
10+
11+
_IndexExpression(this._target, this._index);
12+
13+
@override
14+
AstNode buildAst([Scope scope]) => buildExpression(scope);
15+
16+
@override
17+
Expression buildExpression([Scope scope]) {
18+
return astFactory.indexExpressionForTarget(
19+
_target.buildExpression(scope),
20+
$openBracket,
21+
_index.buildExpression(scope),
22+
$closeBracket,
23+
);
24+
}
25+
}

lib/src/builders/expression/yield.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class _AsYield extends TopLevelMixin implements StatementBuilder {
1515

1616
@override
1717
Statement buildStatement([Scope scope]) {
18-
return new YieldStatement(
18+
return astFactory.yieldStatement(
1919
$yield,
2020
_isStar ? $star : null,
2121
_expression.buildExpression(scope),

lib/src/builders/statement/switch.dart

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,35 @@ import 'package:code_builder/src/builders/statement.dart';
1010
import 'package:code_builder/src/tokens.dart';
1111

1212
/// Short-hand syntax for `new SwitchCaseBuilder(...)`.
13-
SwitchCaseBuilder switchCase(ExpressionBuilder condition,
14-
[Iterable<StatementBuilder> statements = const []]) =>
13+
SwitchCaseBuilder switchCase(
14+
ExpressionBuilder condition, [
15+
Iterable<StatementBuilder> statements = const [],
16+
]) =>
1517
new SwitchCaseBuilder(condition)..addStatements(statements ?? []);
1618

1719
/// Short-hand syntax for `new SwitchDefaultCaseBuilder(...)`.
18-
SwitchDefaultCaseBuilder switchDefault(
19-
[Iterable<StatementBuilder> statements = const []]) =>
20+
SwitchDefaultCaseBuilder switchDefault([
21+
Iterable<StatementBuilder> statements = const [],
22+
]) =>
2023
new SwitchDefaultCaseBuilder()..addStatements(statements ?? []);
2124

2225
/// Short-hand syntax for `new SwitchStatementBuilder(...)`.
23-
SwitchStatementBuilder switchStatement(ExpressionBuilder expression,
24-
{Iterable<SwitchCaseBuilder> cases: const [],
25-
SwitchDefaultCaseBuilder defaultCase}) =>
26+
SwitchStatementBuilder switchStatement(
27+
ExpressionBuilder expression, {
28+
Iterable<SwitchCaseBuilder> cases: const [],
29+
SwitchDefaultCaseBuilder defaultCase,
30+
}) =>
2631
new SwitchStatementBuilder(expression)
2732
..setDefaultCase(defaultCase)
2833
..addCases(cases ?? []);
2934

30-
/// Represents an [ExpressionBuilder] and a series of [SwitchCaseBuilder]s as a switch statement AST.
35+
/// Represents an [ExpressionBuilder] switches as an AST.
3136
abstract class SwitchStatementBuilder implements StatementBuilder {
3237
/// Creates a new [SwitchStatementBuilder].
33-
factory SwitchStatementBuilder(ExpressionBuilder expression,
34-
[Iterable<ValidSwitchMember> members = const []]) =>
38+
factory SwitchStatementBuilder(
39+
ExpressionBuilder expression, [
40+
Iterable<ValidSwitchMember> members = const [],
41+
]) =>
3542
new _SwitchStatementBuilder(expression, members);
3643

3744
/// Adds a [switchCase] to the builder.
@@ -47,16 +54,15 @@ abstract class SwitchStatementBuilder implements StatementBuilder {
4754
void setDefaultCase(SwitchDefaultCaseBuilder defaultCase);
4855
}
4956

50-
/// A marker interface for an AST that could be added to [SwitchStatementBuilder].
57+
/// A marker interface for an AST usable within a [SwitchStatementBuilder].
5158
///
5259
/// This can be either a [SwitchCaseBuilder] or a [SwitchDefaultCaseBuilder].
5360
abstract class ValidSwitchMember {}
5461

55-
/// Represents an [ExpressionBuilder] and a series of [Statement]s as a switch case AST.
62+
/// Represents an [ExpressionBuilder] and statements as a switch case AST.
5663
abstract class SwitchCaseBuilder implements HasStatements, ValidSwitchMember {
5764
/// Creates a new [SwitchCaseBuilder].
58-
factory SwitchCaseBuilder(ExpressionBuilder condition) =>
59-
new _SwitchCaseBuilder(condition);
65+
factory SwitchCaseBuilder(ExpressionBuilder condition) = _SwitchCaseBuilder;
6066

6167
/// Returns an [SwitchMember] AST representing the builder.
6268
SwitchMember buildSwitchMember([Scope scope]);
@@ -65,7 +71,7 @@ abstract class SwitchCaseBuilder implements HasStatements, ValidSwitchMember {
6571
/// Represents a series of [Statement]s as a default switch case AST.
6672
abstract class SwitchDefaultCaseBuilder
6773
implements HasStatements, ValidSwitchMember {
68-
factory SwitchDefaultCaseBuilder() => new _SwitchDefaultCaseBuilder();
74+
factory SwitchDefaultCaseBuilder() = _SwitchDefaultCaseBuilder;
6975

7076
/// Returns an [SwitchMember] AST representing the builder.
7177
SwitchMember buildSwitchMember([Scope scope]);
@@ -78,12 +84,16 @@ class _SwitchStatementBuilder extends Object
7884
final List<SwitchCaseBuilder> _cases = [];
7985
SwitchDefaultCaseBuilder _defaultCase;
8086

81-
_SwitchStatementBuilder(this._expression,
82-
[Iterable<ValidSwitchMember> members = const []]) {
87+
_SwitchStatementBuilder(
88+
this._expression, [
89+
Iterable<ValidSwitchMember> members = const [],
90+
]) {
8391
for (final member in members) {
84-
if (member is SwitchDefaultCaseBuilder)
92+
if (member is SwitchDefaultCaseBuilder) {
8593
_defaultCase = member;
86-
else if (member is SwitchCaseBuilder) _cases.add(member);
94+
} else if (member is SwitchCaseBuilder) {
95+
_cases.add(member);
96+
}
8797
}
8898
}
8999

@@ -105,18 +115,18 @@ class _SwitchStatementBuilder extends Object
105115
@override
106116
SwitchStatement buildSwitchStatement([Scope scope]) {
107117
var members = _cases.map((c) => c.buildSwitchMember(scope)).toList();
108-
109-
if (_defaultCase != null)
118+
if (_defaultCase != null) {
110119
members.add(_defaultCase.buildSwitchMember(scope));
111-
120+
}
112121
return astFactory.switchStatement(
113-
$switch,
114-
$openBracket,
115-
_expression.buildExpression(),
116-
$closeParen,
117-
$openBracket,
118-
members,
119-
$closeBracket);
122+
$switch,
123+
$openBracket,
124+
_expression.buildExpression(),
125+
$closeParen,
126+
$openBracket,
127+
members,
128+
$closeBracket,
129+
);
120130
}
121131

122132
@override
@@ -134,8 +144,13 @@ class _SwitchCaseBuilder extends Object
134144
AstNode buildAst([Scope scope]) => buildSwitchMember(scope);
135145

136146
@override
137-
SwitchMember buildSwitchMember([Scope scope]) => astFactory.switchCase(null,
138-
$case, _condition.buildExpression(), $colon, buildStatements(scope));
147+
SwitchMember buildSwitchMember([Scope scope]) => astFactory.switchCase(
148+
null,
149+
$case,
150+
_condition.buildExpression(),
151+
$colon,
152+
buildStatements(scope),
153+
);
139154
}
140155

141156
class _SwitchDefaultCaseBuilder extends Object
@@ -145,6 +160,10 @@ class _SwitchDefaultCaseBuilder extends Object
145160
AstNode buildAst([Scope scope]) => buildSwitchMember(scope);
146161

147162
@override
148-
SwitchMember buildSwitchMember([Scope scope]) =>
149-
astFactory.switchDefault(null, $default, $colon, buildStatements());
163+
SwitchMember buildSwitchMember([Scope scope]) => astFactory.switchDefault(
164+
null,
165+
$default,
166+
$colon,
167+
buildStatements(),
168+
);
150169
}

lib/src/builders/type.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,12 @@ abstract class AbstractTypeBuilderMixin {
8181

8282
/// Lazily builds an [TypeName] AST when [buildType] is invoked.
8383
class TypeBuilder extends Object
84-
with AbstractTypeBuilderMixin
85-
implements AstBuilder, ValidMethodMember, ValidParameterMember {
84+
with AbstractExpressionMixin, AbstractTypeBuilderMixin, TopLevelMixin
85+
implements
86+
AstBuilder,
87+
ExpressionBuilder,
88+
ValidMethodMember,
89+
ValidParameterMember {
8690
final List<TypeBuilder> _generics;
8791
final String _importFrom;
8892
final String _name;
@@ -150,4 +154,12 @@ class TypeBuilder extends Object
150154
prefix: prefix,
151155
)..show(_name);
152156
}
157+
158+
@override
159+
Expression buildExpression([Scope scope]) {
160+
if (_generics.isNotEmpty) {
161+
throw new StateError('Cannot refer to a type with generic parameters');
162+
}
163+
return reference(_name, _importFrom).buildExpression(scope);
164+
}
153165
}

0 commit comments

Comments
 (0)