@@ -9,6 +9,7 @@ import 'package:analyzer/src/dart/ast/token.dart';
99import 'package:code_builder/dart/core.dart' ;
1010import 'package:code_builder/src/builders/method.dart' ;
1111import 'package:code_builder/src/builders/parameter.dart' ;
12+ import 'package:code_builder/src/builders/reference.dart' ;
1213import 'package:code_builder/src/builders/shared.dart' ;
1314import 'package:code_builder/src/builders/statement.dart' ;
1415import 'package:code_builder/src/builders/statement/if.dart' ;
@@ -17,6 +18,7 @@ import 'package:code_builder/src/tokens.dart';
1718
1819part 'expression/assert.dart' ;
1920part 'expression/assign.dart' ;
21+ part 'expression/cascade.dart' ;
2022part 'expression/invocation.dart' ;
2123part 'expression/negate.dart' ;
2224part '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,
0 commit comments