From 003cb15b8d27e4a72eb25dba6f695cd2c7a6f4fb Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Wed, 4 Sep 2024 17:19:38 -0700 Subject: [PATCH] Don't crash on an index cascade section followed by a method chain. (#1556) Don't crash on an index cascade section followed by a method chain. I found this weird corner case in the wild when formatting a large corpus. --- lib/src/front_end/chain_builder.dart | 9 +++++++-- test/tall/invocation/cascade_mixed.stmt | 6 +++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/src/front_end/chain_builder.dart b/lib/src/front_end/chain_builder.dart index dafe1d8d..bf36b5d1 100644 --- a/lib/src/front_end/chain_builder.dart +++ b/lib/src/front_end/chain_builder.dart @@ -327,8 +327,13 @@ class ChainBuilder { }); }); - case IndexExpression(): - _unwrapPostfix(expression.target!, (target) { + case IndexExpression(:var target?): + // We check for a non-null target because the target may be `null` if + // the chain we are building is itself in a cascade section that begins + // with an index expression like: + // + // object..[index].chain(); + _unwrapPostfix(target, (target) { return _visitor.pieces.build(() { _visitor.pieces.add(target); _visitor.writeIndexExpression(expression); diff --git a/test/tall/invocation/cascade_mixed.stmt b/test/tall/invocation/cascade_mixed.stmt index e0efbd6e..3807699c 100644 --- a/test/tall/invocation/cascade_mixed.stmt +++ b/test/tall/invocation/cascade_mixed.stmt @@ -36,4 +36,8 @@ object..cascade()!..cascade()[index]..cascade()(arg); object ..cascade()! ..cascade()[index] - ..cascade()(arg); \ No newline at end of file + ..cascade()(arg); +>>> Chain with index target. +object..[index].method(); +<<< +object..[index].method(); \ No newline at end of file