| Index: lib/src/call_chain_visitor.dart
|
| diff --git a/lib/src/call_chain_visitor.dart b/lib/src/call_chain_visitor.dart
|
| index 36faccaab5a9289b25f471e7a1f5adcd0efa1832..a01e6ec6d2d378f027fc1c719467927ec551c4f5 100644
|
| --- a/lib/src/call_chain_visitor.dart
|
| +++ b/lib/src/call_chain_visitor.dart
|
| @@ -51,14 +51,25 @@ class CallChainVisitor {
|
| flatten(expression) {
|
| target = expression;
|
|
|
| - if (expression is MethodInvocation && expression.target != null) {
|
| - flatten(expression.target);
|
| + // Treat index expressions where the target is a valid call in a method
|
| + // chain as being part of the call. Handles cases like:
|
| + //
|
| + // receiver
|
| + // .property
|
| + // .property[0]
|
| + // .property
|
| + // .property;
|
| + var call = expression;
|
| + while (call is IndexExpression) call = call.target;
|
| +
|
| + if (call is MethodInvocation && call.target != null) {
|
| + flatten(call.target);
|
| calls.add(expression);
|
| - } else if (expression is PropertyAccess && expression.target != null) {
|
| - flatten(expression.target);
|
| + } else if (call is PropertyAccess && call.target != null) {
|
| + flatten(call.target);
|
| calls.add(expression);
|
| - } else if (expression is PrefixedIdentifier) {
|
| - flatten(expression.prefix);
|
| + } else if (call is PrefixedIdentifier) {
|
| + flatten(call.prefix);
|
| calls.add(expression);
|
| }
|
| }
|
| @@ -135,12 +146,19 @@ class CallChainVisitor {
|
|
|
| /// Writes [call], which must be one of the supported expression types.
|
| void _writeCall(Expression call) {
|
| - if (call is MethodInvocation) {
|
| + if (call is IndexExpression) {
|
| + _visitor.builder.nestExpression();
|
| + _writeCall(call.target);
|
| + _visitor.finishIndexExpression(call);
|
| + _visitor.builder.unnest();
|
| + } else if (call is MethodInvocation) {
|
| _writeInvocation(call);
|
| } else if (call is PropertyAccess) {
|
| - _writePropertyAccess(call);
|
| + _visitor.token(call.operator);
|
| + _visitor.visit(call.propertyName);
|
| } else if (call is PrefixedIdentifier) {
|
| - _writePrefixedIdentifier(call);
|
| + _visitor.token(call.period);
|
| + _visitor.visit(call.identifier);
|
| } else {
|
| // Unexpected type.
|
| assert(false);
|
| @@ -211,16 +229,6 @@ class CallChainVisitor {
|
| if (args.nestMethodArguments) _visitor.builder.endBlockArgumentNesting();
|
| }
|
|
|
| - void _writePropertyAccess(PropertyAccess property) {
|
| - _visitor.token(property.operator);
|
| - _visitor.visit(property.propertyName);
|
| - }
|
| -
|
| - void _writePrefixedIdentifier(PrefixedIdentifier prefix) {
|
| - _visitor.token(prefix.period);
|
| - _visitor.visit(prefix.identifier);
|
| - }
|
| -
|
| /// If a [Rule] for the method chain is currently active, ends it.
|
| void _disableRule() {
|
| if (_ruleEnabled == false) return;
|
|
|