Skip to content

[checks] Join nested collapsed subjects with "that" - #2783

Merged
natebosch merged 2 commits into
masterfrom
collapse-fix-has
Oct 9, 2026
Merged

natebosch merged 2 commits into
masterfrom
collapse-fix-has

Conversation

@natebosch

Copy link
Copy Markdown
Member

A nesting context's addPredicate callback expects a noun phrase from the
expectation on its subject, such as <2> or an empty iterable. When the
only expectation on a nested subject was itself a further nested subject, the
collapsed predicate from the inner level was passed to addPredicate as if
it were a noun. This produced descriptions which did not read as sentences,
and lost detail from the label:

throws has message: 'foo'
has value: has field: 'foo'

When the single clause on a nested context is another nested context, join
its collapsed predicate to the label of the outer context with "that"
instead. This is the same structure as the " that:" line in the
multi-line format, placed on one line:

throws an error of type StateError that has message: 'foo'
has value that has field: 'foo'

Leaf expectations are still passed to addPredicate. A context without an
addPredicate callback, or with a multi-line label, still does not collapse,
and the 80 character limit at the root still applies.

A nesting context's `addPredicate` callback expects a noun phrase from the
expectation on its subject, such as `<2>` or `an empty iterable`. When the
only expectation on a nested subject was itself a further nested subject, the
collapsed predicate from the inner level was passed to `addPredicate` as if
it were a noun. This produced descriptions which did not read as sentences,
and lost detail from the label:

    throws has message: 'foo'
    has value: has field: 'foo'

When the single clause on a nested context is another nested context, join
its collapsed predicate to the label of the outer context with "that"
instead. This is the same structure as the "<label> that:" line in the
multi-line format, placed on one line:

    throws an error of type StateError that has message: 'foo'
    has value that has field: 'foo'

Leaf expectations are still passed to `addPredicate`. A context without an
`addPredicate` callback, or with a multi-line label, still does not collapse,
and the 80 character limit at the root still applies.
@github-actions github-actions Bot added the package:checks Issues related to pkg:checks label Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

PR Health

Changelog Entry ✔️
Package Changed Files

Changes to files need to be accounted for in their respective changelogs.

This check can be disabled by tagging the PR with skip-changelog-check.

@natebosch
natebosch marked this pull request as ready for review October 8, 2026 22:47
@natebosch
natebosch requested a review from a team as a code owner October 8, 2026 22:47
@natebosch
natebosch requested a review from davidmorgan October 8, 2026 22:47
@natebosch
natebosch added this pull request to stack #2785 October 8, 2026 22:57

@davidmorgan davidmorgan left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LG, thanks; optional comment--up to you if it's worth adding coverage. Thanks.

final child = clause?.collapsedExpected;
if (child == null) return null;
return _addPredicate?.call(child);
return _expandChild(child, childIsLeaf: clause!.isLeaf);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: no test covers this change; reverting it to _addPredicate?.call(child) leaves the suite passing. It's reached for a passing nested chain next to a failing sibling clause. The new tests also don't cover completes or map [] chains, whose output this changes.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch. Added tests for these cases.

Add coverage for the remaining paths changed by joining nested collapsed
subjects with "that":

- A passing nested chain beside a failing sibling clause, which is formatted
  through `_TestContext.collapsedExpected` rather than the collapsed failure
  path. Without this test, reverting that getter to call `addPredicate`
  directly left the suite passing.
- `completes` and map `operator []` with a nested `has`, whose collapsed
  output also changed.
@natebosch
natebosch merged commit 1cc813e into master Oct 9, 2026
71 checks passed
@natebosch
natebosch deleted the collapse-fix-has branch October 9, 2026 19:00
copybara-service Bot pushed a commit to dart-lang/sdk that referenced this pull request Oct 13, 2026
Revisions updated by `dart tools/rev_sdk_deps.dart`.

dartdoc (https://github.com/dart-lang/dartdoc/compare/5eb0f2c..e1859cf):
  e1859cfc  Fri Oct 9 14:53:01 2026 +0200  Sarah Zakarias  Link a bare prefix only when it maps to exactly one library (dart-lang/dartdoc#4295)
  c48f6fb9  Fri Oct 9 14:25:42 2026 +0200  Sarah Zakarias  Resolve prefixes through the analyzer's PrefixElement.scopeLibraries (dart-lang/dartdoc#4294)
  3a6297e2  Wed Oct 7 12:56:14 2026 +0200  Sarah Zakarias  Require analyzer 14.5.0 and bump to 9.0.10 (dart-lang/dartdoc#4292)

ecosystem (https://github.com/dart-lang/ecosystem/compare/16dca7a..622ef61):
  622ef61  Mon Oct 12 00:23:27 2026 -0700  Kevin Moore  fix(firehose): enforce -wip on published versions and tighten changelog checks (dart-lang/ecosystem#467)
  5576a85  Wed Oct 7 09:29:44 2026 +0200  Moritz  Support use-flutter option in groundskeeper workflow (dart-lang/ecosystem#444)

http (https://github.com/dart-lang/http/compare/585d433..23f8574):
  23f8574  Thu Oct 8 23:27:25 2026 +0700  Cong Bang  feat(http2): configurable receive windows and frame size (dart-lang/http#1999)
  18051a6  Thu Oct 8 10:39:38 2026 +0200  Moritz  Enable Flutter in Groundskeeper workflow for Flutter packages (dart-lang/http#2004)

native (https://github.com/dart-lang/native/compare/a2a6179..10515af):
  10515afca  Mon Oct 12 12:21:52 2026 +0200  Daco Harkes  [native_toolchain_c] Do not pass linker flags when compiling static libraries (dart-lang/native#3731)

native is held back at 10515af, before dart-lang/native#3728, because it
breaks the dartdev `dart install` native assets tests. See
dart-lang/native#3743.

test (https://github.com/dart-lang/test/compare/d749b10..30acb69):
  30acb69e  Mon Oct 12 12:42:54 2026 -0700  Nate Bosch  Time out browser loads just before the suite load timeout (dart-lang/test#2786)
  597a0326  Mon Oct 12 12:22:53 2026 -0700  Kevin Moore  Fix misplaced changelog entries and remove no-op health check (dart-lang/test#2789)
  0b6efee8  Mon Oct 12 12:16:29 2026 -0700  Nate Bosch  [checks] Collapse nested subjects in condition descriptions (dart-lang/test#2784)
  17c98493  Mon Oct 12 12:08:23 2026 -0700  Nate Bosch  Follow symlinks in precompiled browser test directories (dart-lang/test#2787)
  1cc813ec  Fri Oct 9 11:59:56 2026 -0700  Nate Bosch  [checks] Join nested collapsed subjects with "that" (dart-lang/test#2783)
  ada7b950  Thu Oct 8 12:03:42 2026 -0700  Nate Bosch  Prepare to publish (dart-lang/test#2780)
  c4b165b3  Wed Oct 7 11:29:08 2026 -0700  Kevin Moore  [checks] Require package:meta ^1.17.0 (dart-lang/test#2779)
  4a363d70  Tue Oct 6 10:46:31 2026 -0700  Nate Bosch  Let Chrome choose its remote debugging port (dart-lang/test#2778)
  465d66ab  Tue Oct 6 09:35:22 2026 -0700  Nate Bosch  Keep Chrome stderr in the browser output when debugging (dart-lang/test#2777)

tools (https://github.com/dart-lang/tools/compare/a66d517..2b54c71):
  2b54c71af  Mon Oct 12 10:16:45 2026 +0200  dart-ecosystem-bot[bot]  [boring] Update BoringSSL to 3fed4f20 (dart-lang/tools#2655)
  2337f995a  Sat Oct 10 03:11:40 2026 +0300  Hasan Armoush  [json_rpc_2] Add strictProtocolChecks parameter to Client (dart-lang/tools#2555)
  c65c69ed1  Fri Oct 9 08:54:25 2026 +0200  Moritz  [boring] Move package:boring to dart-lang/tools (2/4): FFI helpers from package:webcrypto (dart-lang/tools#2615)
  a04e45491  Thu Oct 8 21:07:18 2026 -0700  Kevin Moore  chore: wire package:api_summary and package:string_scanner PR auto-labeler (dart-lang/tools#2652)
  8bdd4b92c  Thu Oct 8 09:20:48 2026 +0200  Morgan :)  [code_builder] Allow built_collection 6.x. (dart-lang/tools#2645)
  c16040d35  Wed Oct 7 17:30:08 2026 -0700  Kevin Moore  [api_summary] Sort primary barrel first and experimental entry points last (v1.2.0) (dart-lang/tools#2619)
  b2d0780db  Wed Oct 7 11:27:16 2026 -0700  Kevin Moore  [stream_channel] Require package:async ^2.6.0 (dart-lang/tools#2644)
  3ab7bf9d0  Wed Oct 7 11:35:27 2026 +0200  Moritz  [boring] Move package:boring to dart-lang/tools (1/4): vendored BoringSSL, bindings and source build (dart-lang/tools#2614)
  29df6348b  Tue Oct 6 15:21:44 2026 -0700  Kevin Moore  feat(coverage): support web coverage reports in test_with_coverage (dart-lang/tools#2448)

Regenerate pkg/{analyzer,analyzer_plugin,analyzer_testing}/api.txt. The
rolled package:api_summary v1.2.0 (dart-lang/tools#2619) sorts the primary
barrel first and other entry points after it, so entries in these files
are reordered. The APIs themselves are unchanged.

Change-Id: Ie8ff19c5a981ea8ecee8939c75457986a947e0a7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/563220
Reviewed-by: Samuel Rawlins <[email protected]>
Auto-Submit: Nate Bosch <[email protected]>
Reviewed-by: Paul Berry <[email protected]>
Commit-Queue: Paul Berry <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

package:checks Issues related to pkg:checks

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants