)]}'
{
  "log": [
    {
      "commit": "f510a0a5f5f5b41a59dfbbd9853da821e1a02d90",
      "tree": "f9d302e33fbdc90751bc084e81fb8fa022d62b32",
      "parents": [
        "25880b121540d0ef69a5cf24d937b8095d307976"
      ],
      "author": {
        "name": "Kallen Tu",
        "email": "kallentu@google.com",
        "time": "Fri Apr 10 13:29:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 13:29:43 2026 -0700"
      },
      "message": "Fix tests with final and/or var parameters. (#1822)"
    },
    {
      "commit": "25880b121540d0ef69a5cf24d937b8095d307976",
      "tree": "b2c39ee208af9ce6c01893ef9f25bf435ea5caad",
      "parents": [
        "5ed5aadd8cfb0228668e286ab45977f989352b48"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 01 16:35:51 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 16:35:51 2026 +0000"
      },
      "message": "Bump dart-lang/setup-dart in the github-actions group (#1819)\n\nBumps the github-actions group with 1 update: [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart).\n\nUpdates `dart-lang/setup-dart` from 1.7.1 to 1.7.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/dart-lang/setup-dart/releases\"\u003edart-lang/setup-dart\u0027s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.7.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate Node.js requirement to Node 24.\u003c/li\u003e\n\u003cli\u003eFix open Dependabot alerts by bumping \u003ccode\u003eundici\u003c/code\u003e to \u003ccode\u003e\u0026gt;\u003d6.24.0\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eUpdate GitHub Action dependencies (\u003ccode\u003e@actions/core\u003c/code\u003e, \u003ccode\u003e@actions/exec\u003c/code\u003e, \u003ccode\u003e@actions/tool-cache\u003c/code\u003e, \u003ccode\u003e@actions/http-client\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003eUpdate workflow actions to their latest versions (\u003ccode\u003eactions/checkout\u003c/code\u003e v6, \u003ccode\u003esetup-flutter\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md\"\u003edart-lang/setup-dart\u0027s changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.7.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate Node.js requirement to Node 24.\u003c/li\u003e\n\u003cli\u003eFix open Dependabot alerts by bumping \u003ccode\u003eundici\u003c/code\u003e to \u003ccode\u003e\u0026gt;\u003d6.24.0\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eUpdate GitHub Action dependencies (\u003ccode\u003e@actions/core\u003c/code\u003e, \u003ccode\u003e@actions/exec\u003c/code\u003e, \u003ccode\u003e@actions/tool-cache\u003c/code\u003e, \u003ccode\u003e@actions/http-client\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003eUpdate workflow actions to their latest versions (\u003ccode\u003eactions/checkout\u003c/code\u003e v6, \u003ccode\u003esetup-flutter\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.7.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRoll \u003ccode\u003eundici\u003c/code\u003e dependency to address \u003ca href\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-c76h-2ccp-4975\"\u003eCVE-2025-22150\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eUpdate to the latest npm dependencies.\u003c/li\u003e\n\u003cli\u003eRecompile the action using the new Dart / JavaScript interop.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.7.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eInstall flutter sdk in publishing step, allowing Flutter packages to be\npublished (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003e#68\u003c/a\u003e[])\u003c/p\u003e\n\u003cp\u003e\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003e#68\u003c/a\u003e: \u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003edart-lang/setup-dart#68\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.5\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix zip path handling on Windows 11 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003e#118\u003c/a\u003e[])\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003e#118\u003c/a\u003e: \u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003edart-lang/setup-dart#118\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.6.4\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRebuild JS code.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.3\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRoll \u003ccode\u003eundici\u003c/code\u003e dependency to address \u003ca href\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-m4v8-wqvr-p9f7\"\u003eCVE-2024-30260\u003c/a\u003e and \u003ca href\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-9qxr-qj54-h672\"\u003eCVE-2024-30261\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSwitch to running the workflow on \u003ccode\u003enode20`` from \u003c/code\u003enode16`. See also\n\u003ca href\u003d\"https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/\"\u003eTransitioning from Node 16 to Node 20\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated the google storage url for \u003ccode\u003emain\u003c/code\u003e channel releases.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/65eb853c7ba17dde3be364c3d2858773e7144260\"\u003e\u003ccode\u003e65eb853\u003c/code\u003e\u003c/a\u003e chore: prepare v1.7.2 release (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/175\"\u003e#175\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/6e0ff0bc3a029a9532ae6a86b1ea4906038921bc\"\u003e\u003ccode\u003e6e0ff0b\u003c/code\u003e\u003c/a\u003e Node 24 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/174\"\u003e#174\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/03a180dbe1de8ea7fb700663cbb7d24ca4bbe82c\"\u003e\u003ccode\u003e03a180d\u003c/code\u003e\u003c/a\u003e Group npm dependency updates (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/172\"\u003e#172\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/74195ec01a320a45702f5d8d9aaae896f5a0b540\"\u003e\u003ccode\u003e74195ec\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003e@​actions/exec\u003c/code\u003e from 1.1.1 to 3.0.0 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/167\"\u003e#167\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/41705c951d02aaf00ead5b0423d0808ea495d9b5\"\u003e\u003ccode\u003e41705c9\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003e@​actions/core\u003c/code\u003e from 1.11.1 to 3.0.0 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/168\"\u003e#168\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/dd42013d4425790a72c8c6107773a99edeefd2a9\"\u003e\u003ccode\u003edd42013\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003e@​actions/tool-cache\u003c/code\u003e from 2.0.2 to 4.0.0 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/169\"\u003e#169\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/b36cb5e0e609c7313088a6614db391df98780dce\"\u003e\u003ccode\u003eb36cb5e\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003e@​actions/http-client\u003c/code\u003e from 3.0.0 to 4.0.0 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/170\"\u003e#170\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/21e68f4d54916e6c2f68f8c290b2aed9b02cbd3e\"\u003e\u003ccode\u003e21e68f4\u003c/code\u003e\u003c/a\u003e Bump actions/checkout from 5 to 6 in the github-actions group (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/162\"\u003e#162\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/0bdb60234eb044854c1c73fb77b0f063cf290512\"\u003e\u003ccode\u003e0bdb602\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003e@​actions/http-client\u003c/code\u003e from 2.2.3 to 3.0.0 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/160\"\u003e#160\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/daef289245bc5d4ab7864e0788a58108a9be6c99\"\u003e\u003ccode\u003edaef289\u003c/code\u003e\u003c/a\u003e Bump flutter-actions/setup-flutter in the github-actions group (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/159\"\u003e#159\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href\u003d\"https://github.com/dart-lang/setup-dart/compare/e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c...65eb853c7ba17dde3be364c3d2858773e7144260\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003ddart-lang/setup-dart\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d1.7.1\u0026new-version\u003d1.7.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s major version (unless you unignore this specific dependency\u0027s major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s minor version (unless you unignore this specific dependency\u0027s minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\u003c/details\u003e"
    },
    {
      "commit": "5ed5aadd8cfb0228668e286ab45977f989352b48",
      "tree": "e5553a99223ffb6e0a022868db2c26ce4e0e56d9",
      "parents": [
        "f662cf6281b9417c1b731ae5639d80e8aaad4187"
      ],
      "author": {
        "name": "Kevin Moore",
        "email": "kevmoo@users.noreply.github.com",
        "time": "Mon Mar 30 10:16:10 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 10:16:10 2026 -0700"
      },
      "message": "Fix IOFileSystemPath printing during package resolution exceptions (#1818)\n\nThe `IOFileSystemPath` object lacked a `toString()` method, leading to `Instance of \u0027IOFileSystemPath\u0027` being rendered in error strings. When `PackageResolutionException` was thrown encountering package resolution errors while reading analysis options, the path output was masked.\n\nThis change adds `toString()` to `IOFileSystemPath` to output the correct underlying file system `.path`. A test is also added to `io_file_system_test.dart` preventing regressions.\n\n* Also improve incorrect error messages about while analysis_options couldn\u0027t be found"
    },
    {
      "commit": "f662cf6281b9417c1b731ae5639d80e8aaad4187",
      "tree": "69c48e2d1631eb14c2cdbe13a209501fe6b2b6e3",
      "parents": [
        "2d8c5dccad840a231f56bd840b0412b86b3e023e"
      ],
      "author": {
        "name": "Kallen Tu",
        "email": "kallentu@google.com",
        "time": "Fri Mar 20 17:09:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 20 17:09:36 2026 -0700"
      },
      "message": "Unit tests for mixins, enums and extensions with a `;` body. (#1817)"
    },
    {
      "commit": "2d8c5dccad840a231f56bd840b0412b86b3e023e",
      "tree": "5b6fc51bce52833f060149db9e0bd8a3b186bd44",
      "parents": [
        "9b302dd20b4b38979352f21cf515b44617d344ce"
      ],
      "author": {
        "name": "Kevin Moore",
        "email": "kevmoo@users.noreply.github.com",
        "time": "Wed Mar 18 21:40:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 21:40:35 2026 -0700"
      },
      "message": "Bump version to 3.1.8 (#1816)\n\nCo-authored-by: Kallen Tu \u003ckallentu@google.com\u003e"
    },
    {
      "commit": "9b302dd20b4b38979352f21cf515b44617d344ce",
      "tree": "441e88d23b6ead1510389f08e03fc1f65d22cd70",
      "parents": [
        "3359feac81da31e28a4f3fb8672afa46a368bc5f"
      ],
      "author": {
        "name": "Konstantin Scheglov",
        "email": "scheglov@google.com",
        "time": "Sun Mar 15 09:28:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 15 09:28:54 2026 -0700"
      },
      "message": "Require analyzer ^12.0.0, with breaking changes. (#1815)"
    },
    {
      "commit": "3359feac81da31e28a4f3fb8672afa46a368bc5f",
      "tree": "c74cbb453d627533e55c5e74ef86b1c42326ae51",
      "parents": [
        "a0f21e86a7a0ba52f11f46e3ed2ad1144616b512"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Mar 09 15:43:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 09 15:43:09 2026 -0700"
      },
      "message": "Primary constructors (#1807)\n\n* Begin supporting primary constructors.\n\nSince primary constructors adds a lot of new syntax and fairly complex\nformatting for all of the things that can now go in a class header, I\u0027m\nbreaking it into several commits.\n\nThis first commit only adds support for `;` as a class or extension type\nbody. That adds yet another wrinkle to writeType(), which was getting\nvery cumbersome, so I went ahead and split it out into a builder class\nthat makes it easier to mix and match the various things that can go in\nthe header and the different kinds of bodies.\n\n* Format constructors defined using `new` or `factory`.\n\nSince those are already allowed as modifiers, there isn\u0027t much to do\nhere except to add tests and remove the extra space if there is nothing\nbetween the keyword and the parameter list.\n\n* Format primary constructor parameter lists.\n\nThis is the big change. Now that we have both parameter lists and other\nclauses in the class header, deciding how to split and indent them gets\na lot more complex.\n\nThis introduces a new piece to manage the constraints between the\nparameter list and clauses. I think it produces pretty nice output and\ngenerally avoids leaving the clauses hanging when the parameter list\nsplits.\n\nThis change also unifies how extension type representation clauses are\nformatted with how primary constructors are formatted. Prior to this,\nit had its own bespoke code path. That code path didn\u0027t follow the\nexact same formatting rules as parameter lists and could look different\nin weird cases. It also didn\u0027t have the nice rules this PR adds for\nprimary constructors.\n\nIn practice, I think it\u0027s rare for an extension type representation to\nsplit and, when it does, I think this PR produces uniformly better\nformatting. Because of that, I didn\u0027t language version that minor style\nchange. Preserving the old formatting for older language versions would\nbe pretty annoying because it would have to have a separate code path\nfor the extension extension type.\n\n* Format declaring parameters.\n\nDidn\u0027t require much implementation work because the language already\nsupported `final` and `var` on parameters (with different meaning), so\nthe formatter support was there.\n\n* Set 3.13 as the anticipated release version for primary constructors.\n\n(We can change it again if it ends up not being 3.13, but it definitely\nwon\u0027t be 3.11 or 3.12.)\n\n* Tweak blank lines around top-level declarations.\n\n* Don\u0027t force blank lines around declarations whose body is `;`. This\n  allows:\n\n  ```dart\n  sealed class Expr;\n  class IntExpr(final int value) extends Expr;\n  class PlusExpr(final Expr left, final Expr right) extends Expr;\n  ```\n\n* Do force blank lines around mixin and extension types whose body is\n  not `;`. The formatter should have always worked this way, but I\n  overlooked mixins and extension types. Classes, enums, extensions all\n  already are formatted this way.\n\n* Test splitting around \"const\" or primary constructor name.\n\n* Format primary constructor initializer bodies.\n\n* Test that named and optional parameters work in a primary constructor.\n\n* Add tests for preserving trailing commas in primary constructors.\n\n* Apply review feedback.\n\n* Fix duplicated 3.1.6 entry.\n\n---------\n\nCo-authored-by: Kallen Tu \u003ckallentu@google.com\u003e"
    },
    {
      "commit": "a0f21e86a7a0ba52f11f46e3ed2ad1144616b512",
      "tree": "1b60eaa701990cffcf902311ab4c47a81713a368",
      "parents": [
        "4f93caf9c638bb6efc62356a3e35b0b342f10c00"
      ],
      "author": {
        "name": "Kevin Moore",
        "email": "kevmoo@users.noreply.github.com",
        "time": "Fri Mar 06 17:40:47 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 06 17:40:47 2026 -0800"
      },
      "message": "v3.1.7: support the latest pkg:analyzer (#1812)"
    },
    {
      "commit": "4f93caf9c638bb6efc62356a3e35b0b342f10c00",
      "tree": "8e5d9750ff15f17473e16d0be33ed6d88141ee8e",
      "parents": [
        "a6b10dcc3db33597d058cdd602c6059137550b9b"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Wed Feb 25 17:24:30 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 25 17:24:30 2026 -0800"
      },
      "message": "Bump version to get ready to publish. (#1811)\n\n"
    },
    {
      "commit": "a6b10dcc3db33597d058cdd602c6059137550b9b",
      "tree": "235ea136c03f00e35f6224d48f669ff738a0a61a",
      "parents": [
        "a1458c4397882444efa6fe3cbbb8343c7149e52a"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Feb 24 13:36:32 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 24 13:36:32 2026 -0800"
      },
      "message": "Add enum trailing comma fix to CHANGELOG. (#1810)\n\nThis is the CHANGELOG entry for:\n\nhttps://github.com/dart-lang/dart_style/pull/1806."
    },
    {
      "commit": "a1458c4397882444efa6fe3cbbb8343c7149e52a",
      "tree": "d5230952e5e807d98d3bf6ca77e1b3fb194b7611",
      "parents": [
        "b9867aa70dc322fe1b647f75a7a561c151a80c38"
      ],
      "author": {
        "name": "Barbirosha",
        "email": "132715839+Barbirosha@users.noreply.github.com",
        "time": "Tue Feb 24 23:09:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 24 13:09:16 2026 -0800"
      },
      "message": "Fix enum semicolon moved to new line with  trailing_commas: preserve (#1806)\n\n"
    },
    {
      "commit": "b9867aa70dc322fe1b647f75a7a561c151a80c38",
      "tree": "d4d7ca149c2aabd59c7e723bf3e56785d23ae222",
      "parents": [
        "0d56d8550440f19bb2a67b691859a22304486e02"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Feb 23 15:53:43 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 23 15:53:43 2026 -0800"
      },
      "message": "Bump the latest supported language version to 3.12. (#1808)\n\n"
    },
    {
      "commit": "0d56d8550440f19bb2a67b691859a22304486e02",
      "tree": "305d2eceb4ed656d8e92733d6dd32e217dda388c",
      "parents": [
        "726465dd6827d107176dc61d7833e1224c0a4f59"
      ],
      "author": {
        "name": "Naman Goyal",
        "email": "namangoyaldev@gmail.com",
        "time": "Sat Feb 14 20:49:43 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Feb 14 07:19:43 2026 -0800"
      },
      "message": "Fix package resolution error to include file path (#1799)\n\nFixes #1797"
    },
    {
      "commit": "726465dd6827d107176dc61d7833e1224c0a4f59",
      "tree": "893ea9fa3d72d3d3c3564e7d3e683e25dc349c19",
      "parents": [
        "4d4c889df64f9cbe7055ed2596376b643684e015"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Feb 13 11:16:24 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 13 11:16:24 2026 -0800"
      },
      "message": "Bump actions/checkout from 6.0.1 to 6.0.2 in the github-actions group (#1800)\n\nBumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).\n\n\nUpdates `actions/checkout` from 6.0.1 to 6.0.2\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/8e8c483db84b4bee98b60c0593521ed34d9990e8...de0fac2e4500dabe0009e67214ff5f5447ce83dd)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 6.0.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4d4c889df64f9cbe7055ed2596376b643684e015",
      "tree": "fa942c41bab14768c6b408a11f277ca0ba07fadd",
      "parents": [
        "f4d6e4d1a41ba1f8aaa95aa44732bc42913d5300"
      ],
      "author": {
        "name": "Kevin Moore",
        "email": "kevmoo@users.noreply.github.com",
        "time": "Fri Feb 13 11:13:14 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 13 11:13:14 2026 -0800"
      },
      "message": "fix: new analyzer lints (#1804)\n\n"
    },
    {
      "commit": "f4d6e4d1a41ba1f8aaa95aa44732bc42913d5300",
      "tree": "51eaab1db65b2e8975aea9ee401e24ced1c07ae5",
      "parents": [
        "f624489a5013ec58de469d4fd8793c283f62b5d8"
      ],
      "author": {
        "name": "Lasse R.H. Nielsen",
        "email": "lrn@google.com",
        "time": "Thu Feb 05 16:32:29 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 05 16:32:29 2026 +0100"
      },
      "message": "Retire experiments that are now released. (#1779)\n\n* Retire experiments that are now released.\n"
    },
    {
      "commit": "f624489a5013ec58de469d4fd8793c283f62b5d8",
      "tree": "7ee0c245866ffdb7c3fbd8f81001494bb3e46436",
      "parents": [
        "bdae98cead73a436920f890626aa81cf3f2f8904"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Jan 23 11:13:47 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 23 11:13:47 2026 -0800"
      },
      "message": "Add support for language version 3.11. (#1798)\n\nThere are no meaningful changes."
    },
    {
      "commit": "bdae98cead73a436920f890626aa81cf3f2f8904",
      "tree": "d68fb61988f20d20b97e0783596f76920067cea2",
      "parents": [
        "af2e7702d8746c673547e1a2325da615a9e5142f"
      ],
      "author": {
        "name": "Konstantin Scheglov",
        "email": "scheglov@google.com",
        "time": "Mon Jan 12 10:31:16 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 12 10:31:16 2026 -0800"
      },
      "message": "Require analyzer 10.0.0, stop using deprecated nodes and properties. (#1795)\n\n* Require analyzer 10.0.0, stop using deprecated nodes and properties.\n\n* Prepare for publishing 3.1.4, remove -wip.\n\n* Fixes for review comments."
    },
    {
      "commit": "af2e7702d8746c673547e1a2325da615a9e5142f",
      "tree": "89be074a3a72ce4a3039dac2d2451254c0b7f8bb",
      "parents": [
        "d1c9edc90370c3feaea703b418e8ef7818bc46f6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jan 01 13:05:06 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 01 13:05:06 2026 +0000"
      },
      "message": "Bump actions/checkout from 6.0.0 to 6.0.1 in the github-actions group (#1793)\n\nBumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).\n\nUpdates `actions/checkout` from 6.0.0 to 6.0.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/actions/checkout/releases\"\u003eactions/checkout\u0027s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev6.0.1\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate all references from v5 and v4 to v6 by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2314\"\u003eactions/checkout#2314\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd worktree support for persist-credentials includeIf by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2327\"\u003eactions/checkout#2327\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eClarify v6 README by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2328\"\u003eactions/checkout#2328\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v6...v6.0.1\"\u003ehttps://github.com/actions/checkout/compare/v6...v6.0.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/8e8c483db84b4bee98b60c0593521ed34d9990e8\"\u003e\u003ccode\u003e8e8c483\u003c/code\u003e\u003c/a\u003e Clarify v6 README (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2328\"\u003e#2328\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/033fa0dc0b82693d8986f1016a0ec2c5e7d9cbb1\"\u003e\u003ccode\u003e033fa0d\u003c/code\u003e\u003c/a\u003e Add worktree support for persist-credentials includeIf (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2327\"\u003e#2327\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/c2d88d3ecc89a9ef08eebf45d9637801dcee7eb5\"\u003e\u003ccode\u003ec2d88d3\u003c/code\u003e\u003c/a\u003e Update all references from v5 and v4 to v6 (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2314\"\u003e#2314\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href\u003d\"https://github.com/actions/checkout/compare/1af3b93b6815bc44a9784bd300feb67ff0d1eeb3...8e8c483db84b4bee98b60c0593521ed34d9990e8\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dactions/checkout\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d6.0.0\u0026new-version\u003d6.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s major version (unless you unignore this specific dependency\u0027s major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s minor version (unless you unignore this specific dependency\u0027s minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\u003c/details\u003e"
    },
    {
      "commit": "d1c9edc90370c3feaea703b418e8ef7818bc46f6",
      "tree": "bddb231891a8ff6315feb7e662473d9125f27f17",
      "parents": [
        "f9825b8cfdc41dc4d41bc73974f30e14e634b78c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Dec 01 15:36:12 2025 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 15:36:12 2025 +0000"
      },
      "message": "Bump actions/checkout from 5.0.0 to 6.0.0 in the github-actions group (#1790)\n\nBumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).\n\nUpdates `actions/checkout` from 5.0.0 to 6.0.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/actions/checkout/releases\"\u003eactions/checkout\u0027s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev6.0.0\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate README to include Node.js 24 support details and requirements by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2248\"\u003eactions/checkout#2248\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePersist creds to a separate file by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2286\"\u003eactions/checkout#2286\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ev6-beta by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2298\"\u003eactions/checkout#2298\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eupdate readme/changelog for v6 by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2311\"\u003eactions/checkout#2311\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v5.0.0...v6.0.0\"\u003ehttps://github.com/actions/checkout/compare/v5.0.0...v6.0.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev6-beta\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cp\u003eUpdated persist-credentials to store the credentials under \u003ccode\u003e$RUNNER_TEMP\u003c/code\u003e instead of directly in the local git config.\u003c/p\u003e\n\u003cp\u003eThis requires a minimum Actions Runner version of \u003ca href\u003d\"https://github.com/actions/runner/releases/tag/v2.329.0\"\u003ev2.329.0\u003c/a\u003e to access the persisted credentials for \u003ca href\u003d\"https://docs.github.com/en/actions/tutorials/use-containerized-services/create-a-docker-container-action\"\u003eDocker container action\u003c/a\u003e scenarios.\u003c/p\u003e\n\u003ch2\u003ev5.0.1\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePort v6 cleanup to v5 by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2301\"\u003eactions/checkout#2301\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v5...v5.0.1\"\u003ehttps://github.com/actions/checkout/compare/v5...v5.0.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/actions/checkout/blob/main/CHANGELOG.md\"\u003eactions/checkout\u0027s changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eChangelog\u003c/h1\u003e\n\u003ch2\u003eV6.0.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePersist creds to a separate file by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2286\"\u003eactions/checkout#2286\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate README to include Node.js 24 support details and requirements by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2248\"\u003eactions/checkout#2248\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eV5.0.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePort v6 cleanup to v5 by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2301\"\u003eactions/checkout#2301\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eV5.0.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate actions checkout to use node 24 by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2226\"\u003eactions/checkout#2226\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eV4.3.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePort v6 cleanup to v4 by \u003ca href\u003d\"https://github.com/ericsciple\"\u003e\u003ccode\u003e@​ericsciple\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2305\"\u003eactions/checkout#2305\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eV4.3.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003edocs: update README.md by \u003ca href\u003d\"https://github.com/motss\"\u003e\u003ccode\u003e@​motss\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1971\"\u003eactions/checkout#1971\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd internal repos for checking out multiple repositories by \u003ca href\u003d\"https://github.com/mouismail\"\u003e\u003ccode\u003e@​mouismail\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1977\"\u003eactions/checkout#1977\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDocumentation update - add recommended permissions to Readme by \u003ca href\u003d\"https://github.com/benwells\"\u003e\u003ccode\u003e@​benwells\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2043\"\u003eactions/checkout#2043\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdjust positioning of user email note and permissions heading by \u003ca href\u003d\"https://github.com/joshmgross\"\u003e\u003ccode\u003e@​joshmgross\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2044\"\u003eactions/checkout#2044\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate README.md by \u003ca href\u003d\"https://github.com/nebuk89\"\u003e\u003ccode\u003e@​nebuk89\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2194\"\u003eactions/checkout#2194\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate CODEOWNERS for actions by \u003ca href\u003d\"https://github.com/TingluoHuang\"\u003e\u003ccode\u003e@​TingluoHuang\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2224\"\u003eactions/checkout#2224\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate package dependencies by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2236\"\u003eactions/checkout#2236\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.2.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eurl-helper.ts\u003c/code\u003e now leverages well-known environment variables by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@​jww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1941\"\u003eactions/checkout#1941\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eExpand unit test coverage for \u003ccode\u003eisGhes\u003c/code\u003e by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@​jww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1946\"\u003eactions/checkout#1946\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.2.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck out other refs/* by commit if provided, fall back to ref by \u003ca href\u003d\"https://github.com/orhantoy\"\u003e\u003ccode\u003e@​orhantoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1924\"\u003eactions/checkout#1924\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.2.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd Ref and Commit outputs by \u003ca href\u003d\"https://github.com/lucacome\"\u003e\u003ccode\u003e@​lucacome\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1180\"\u003eactions/checkout#1180\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDependency updates by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e- \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1777\"\u003eactions/checkout#1777\u003c/a\u003e, \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1872\"\u003eactions/checkout#1872\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.7\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eBump the minor-npm-dependencies group across 1 directory with 4 updates by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1739\"\u003eactions/checkout#1739\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/checkout from 3 to 4 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1697\"\u003eactions/checkout#1697\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck out other refs/* by commit by \u003ca href\u003d\"https://github.com/orhantoy\"\u003e\u003ccode\u003e@​orhantoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1774\"\u003eactions/checkout#1774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePin actions/checkout\u0027s own workflows to a known, good, stable version. by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@​jww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1776\"\u003eactions/checkout#1776\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.6\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck platform to set archive extension appropriately by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@​cory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1732\"\u003eactions/checkout#1732\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.5\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate NPM dependencies by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@​cory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1703\"\u003eactions/checkout#1703\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump github/codeql-action from 2 to 3 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1694\"\u003eactions/checkout#1694\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/setup-node from 1 to 4 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1696\"\u003eactions/checkout#1696\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/upload-artifact from 2 to 4 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1695\"\u003eactions/checkout#1695\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/1af3b93b6815bc44a9784bd300feb67ff0d1eeb3\"\u003e\u003ccode\u003e1af3b93\u003c/code\u003e\u003c/a\u003e update readme/changelog for v6 (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2311\"\u003e#2311\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/71cf2267d89c5cb81562390fa70a37fa40b1305e\"\u003e\u003ccode\u003e71cf226\u003c/code\u003e\u003c/a\u003e v6-beta (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2298\"\u003e#2298\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/069c6959146423d11cd0184e6accf28f9d45f06e\"\u003e\u003ccode\u003e069c695\u003c/code\u003e\u003c/a\u003e Persist creds to a separate file (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2286\"\u003e#2286\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493\"\u003e\u003ccode\u003eff7abcd\u003c/code\u003e\u003c/a\u003e Update README to include Node.js 24 support details and requirements (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2248\"\u003e#2248\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href\u003d\"https://github.com/actions/checkout/compare/08c6903cd8c0fde910a37f88322edcfb5dd907a8...1af3b93b6815bc44a9784bd300feb67ff0d1eeb3\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dactions/checkout\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d5.0.0\u0026new-version\u003d6.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s major version (unless you unignore this specific dependency\u0027s major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s minor version (unless you unignore this specific dependency\u0027s minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\u003c/details\u003e"
    },
    {
      "commit": "f9825b8cfdc41dc4d41bc73974f30e14e634b78c",
      "tree": "e2cda19c14c749aeeae5f3c96cff1546a8e5b726",
      "parents": [
        "e8190bf2242654daee7ebf21fd6d8c8046989822"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Nov 17 16:43:41 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 17 16:43:41 2025 -0800"
      },
      "message": "Test that private named initializing formals can be formatted. (#1788)\n\nThis covers half of #1772, but I\u0027ll leave that open until primary\nconstructors are implemented too so that I can ensure that we can format\ndeclaring field parameters as well."
    },
    {
      "commit": "e8190bf2242654daee7ebf21fd6d8c8046989822",
      "tree": "ea43bb24822ee57f368f4de834c9e7e394494ec3",
      "parents": [
        "de7e7260b81a4d4e2475c37faf0e89b83454dfdb"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Nov 14 16:24:39 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 14 16:24:39 2025 -0800"
      },
      "message": "Remove uses of internal analyzer implementation. (#1787)\n\nIn the very rare case that a user called formatStatement() and gave the\nformatter something longer than a single statement, we need to throw a\nFormatException but don\u0027t actually have a diagnostic from the analyzer\nto use.\n\nTo deal with that, it used to import some internal implementation\nlibraries in order to conjure up a diagnostic. Instead, this has a local\nimplementation of the necessary public analyzer classes.\n\nThis will avoid dart_style being broken with analyzer 9.0.0 when that\ninternal code changes."
    },
    {
      "commit": "de7e7260b81a4d4e2475c37faf0e89b83454dfdb",
      "tree": "d8393461022766ade0106cca88b1335fcf6f3a7c",
      "parents": [
        "ade6076f731c39306e3dd32608dfd00622e4492f"
      ],
      "author": {
        "name": "Kevin Moore",
        "email": "kevmoo@users.noreply.github.com",
        "time": "Tue Nov 11 15:33:12 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 11 15:33:12 2025 -0800"
      },
      "message": "Clean up use of pkg:args, bump args dep (#1784)\n\n"
    },
    {
      "commit": "ade6076f731c39306e3dd32608dfd00622e4492f",
      "tree": "2511225acb159f59f97c603cece0059de1b77613",
      "parents": [
        "ec0048b9977f5403149798e45ace7e7d722996f0"
      ],
      "author": {
        "name": "Kevin Moore",
        "email": "kevmoo@users.noreply.github.com",
        "time": "Tue Nov 11 15:24:58 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 11 15:24:58 2025 -0800"
      },
      "message": "Latest analyzer, prepare release (#1783)\n\n* Latest analyzer, prepare release\n* bump sdk\n* formatting the formatter"
    },
    {
      "commit": "ec0048b9977f5403149798e45ace7e7d722996f0",
      "tree": "03d780e529c69518b36bda64454014b2a80c0b05",
      "parents": [
        "34742d7a6adcdc93ba7451f0a8b2fc396cdffa9b"
      ],
      "author": {
        "name": "Martino Yovo",
        "email": "martinosoyen@gmail.com",
        "time": "Tue Oct 14 14:45:40 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 14 14:45:40 2025 -0700"
      },
      "message": "Fix stray backtick in markdown documentation (#1761)\n\n"
    },
    {
      "commit": "34742d7a6adcdc93ba7451f0a8b2fc396cdffa9b",
      "tree": "28fd6ab56030757f61de34f4d94dd498befc886c",
      "parents": [
        "ca019b0498692ad78f5f0f0f6208a1258e17fc90"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 02 00:52:53 2025 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 02 00:52:53 2025 +0000"
      },
      "message": "Bump actions/checkout from 4.2.2 to 5.0.0 in the github-actions group (#1767)\n\nBumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).\n\nUpdates `actions/checkout` from 4.2.2 to 5.0.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/actions/checkout/releases\"\u003eactions/checkout\u0027s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev5.0.0\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate actions checkout to use node 24 by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2226\"\u003eactions/checkout#2226\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePrepare v5.0.0 release by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2238\"\u003eactions/checkout#2238\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e⚠️ Minimum Compatible Runner Version\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ev2.327.1\u003c/strong\u003e\u003cbr /\u003e\n\u003ca href\u003d\"https://github.com/actions/runner/releases/tag/v2.327.1\"\u003eRelease Notes\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMake sure your runner is updated to this version or newer to use this release.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v4...v5.0.0\"\u003ehttps://github.com/actions/checkout/compare/v4...v5.0.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev4.3.0\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003edocs: update README.md by \u003ca href\u003d\"https://github.com/motss\"\u003e\u003ccode\u003e@​motss\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1971\"\u003eactions/checkout#1971\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd internal repos for checking out multiple repositories by \u003ca href\u003d\"https://github.com/mouismail\"\u003e\u003ccode\u003e@​mouismail\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1977\"\u003eactions/checkout#1977\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDocumentation update - add recommended permissions to Readme by \u003ca href\u003d\"https://github.com/benwells\"\u003e\u003ccode\u003e@​benwells\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2043\"\u003eactions/checkout#2043\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdjust positioning of user email note and permissions heading by \u003ca href\u003d\"https://github.com/joshmgross\"\u003e\u003ccode\u003e@​joshmgross\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2044\"\u003eactions/checkout#2044\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate README.md by \u003ca href\u003d\"https://github.com/nebuk89\"\u003e\u003ccode\u003e@​nebuk89\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2194\"\u003eactions/checkout#2194\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate CODEOWNERS for actions by \u003ca href\u003d\"https://github.com/TingluoHuang\"\u003e\u003ccode\u003e@​TingluoHuang\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2224\"\u003eactions/checkout#2224\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate package dependencies by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2236\"\u003eactions/checkout#2236\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePrepare release v4.3.0 by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2237\"\u003eactions/checkout#2237\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/motss\"\u003e\u003ccode\u003e@​motss\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1971\"\u003eactions/checkout#1971\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/mouismail\"\u003e\u003ccode\u003e@​mouismail\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1977\"\u003eactions/checkout#1977\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/benwells\"\u003e\u003ccode\u003e@​benwells\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2043\"\u003eactions/checkout#2043\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/nebuk89\"\u003e\u003ccode\u003e@​nebuk89\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2194\"\u003eactions/checkout#2194\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2236\"\u003eactions/checkout#2236\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v4...v4.3.0\"\u003ehttps://github.com/actions/checkout/compare/v4...v4.3.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/actions/checkout/blob/main/CHANGELOG.md\"\u003eactions/checkout\u0027s changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eChangelog\u003c/h1\u003e\n\u003ch2\u003eV5.0.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate actions checkout to use node 24 by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2226\"\u003eactions/checkout#2226\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eV4.3.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003edocs: update README.md by \u003ca href\u003d\"https://github.com/motss\"\u003e\u003ccode\u003e@​motss\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1971\"\u003eactions/checkout#1971\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd internal repos for checking out multiple repositories by \u003ca href\u003d\"https://github.com/mouismail\"\u003e\u003ccode\u003e@​mouismail\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1977\"\u003eactions/checkout#1977\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDocumentation update - add recommended permissions to Readme by \u003ca href\u003d\"https://github.com/benwells\"\u003e\u003ccode\u003e@​benwells\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2043\"\u003eactions/checkout#2043\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdjust positioning of user email note and permissions heading by \u003ca href\u003d\"https://github.com/joshmgross\"\u003e\u003ccode\u003e@​joshmgross\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2044\"\u003eactions/checkout#2044\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate README.md by \u003ca href\u003d\"https://github.com/nebuk89\"\u003e\u003ccode\u003e@​nebuk89\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2194\"\u003eactions/checkout#2194\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate CODEOWNERS for actions by \u003ca href\u003d\"https://github.com/TingluoHuang\"\u003e\u003ccode\u003e@​TingluoHuang\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2224\"\u003eactions/checkout#2224\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate package dependencies by \u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/2236\"\u003eactions/checkout#2236\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.2.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eurl-helper.ts\u003c/code\u003e now leverages well-known environment variables by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@​jww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1941\"\u003eactions/checkout#1941\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eExpand unit test coverage for \u003ccode\u003eisGhes\u003c/code\u003e by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@​jww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1946\"\u003eactions/checkout#1946\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.2.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck out other refs/* by commit if provided, fall back to ref by \u003ca href\u003d\"https://github.com/orhantoy\"\u003e\u003ccode\u003e@​orhantoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1924\"\u003eactions/checkout#1924\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.2.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd Ref and Commit outputs by \u003ca href\u003d\"https://github.com/lucacome\"\u003e\u003ccode\u003e@​lucacome\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1180\"\u003eactions/checkout#1180\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDependency updates by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e- \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1777\"\u003eactions/checkout#1777\u003c/a\u003e, \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1872\"\u003eactions/checkout#1872\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.7\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eBump the minor-npm-dependencies group across 1 directory with 4 updates by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1739\"\u003eactions/checkout#1739\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/checkout from 3 to 4 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1697\"\u003eactions/checkout#1697\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck out other refs/* by commit by \u003ca href\u003d\"https://github.com/orhantoy\"\u003e\u003ccode\u003e@​orhantoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1774\"\u003eactions/checkout#1774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePin actions/checkout\u0027s own workflows to a known, good, stable version. by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@​jww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1776\"\u003eactions/checkout#1776\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.6\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck platform to set archive extension appropriately by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@​cory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1732\"\u003eactions/checkout#1732\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.5\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate NPM dependencies by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@​cory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1703\"\u003eactions/checkout#1703\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump github/codeql-action from 2 to 3 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1694\"\u003eactions/checkout#1694\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/setup-node from 1 to 4 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1696\"\u003eactions/checkout#1696\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/upload-artifact from 2 to 4 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1695\"\u003eactions/checkout#1695\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eREADME: Suggest \u003ccode\u003euser.email\u003c/code\u003e to be \u003ccode\u003e41898282+github-actions[bot]@users.noreply.github.com\u003c/code\u003e by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@​cory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1707\"\u003eactions/checkout#1707\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.4\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDisable \u003ccode\u003eextensions.worktreeConfig\u003c/code\u003e when disabling \u003ccode\u003esparse-checkout\u003c/code\u003e by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@​jww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1692\"\u003eactions/checkout#1692\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd dependabot config by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@​cory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1688\"\u003eactions/checkout#1688\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump the minor-actions-dependencies group with 2 updates by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1693\"\u003eactions/checkout#1693\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump word-wrap from 1.2.3 to 1.2.5 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1643\"\u003eactions/checkout#1643\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.3\u003c/h2\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/08c6903cd8c0fde910a37f88322edcfb5dd907a8\"\u003e\u003ccode\u003e08c6903\u003c/code\u003e\u003c/a\u003e Prepare v5.0.0 release (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2238\"\u003e#2238\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/9f265659d3bb64ab1440b03b12f4d47a24320917\"\u003e\u003ccode\u003e9f26565\u003c/code\u003e\u003c/a\u003e Update actions checkout to use node 24 (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2226\"\u003e#2226\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/08eba0b27e820071cde6df949e0beb9ba4906955\"\u003e\u003ccode\u003e08eba0b\u003c/code\u003e\u003c/a\u003e Prepare release v4.3.0 (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2237\"\u003e#2237\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/631c7dc4f80f88219c5ee78fee08c6b62fac8da1\"\u003e\u003ccode\u003e631c7dc\u003c/code\u003e\u003c/a\u003e Update package dependencies (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2236\"\u003e#2236\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/8edcb1bdb4e267140fa742c62e395cd74f332709\"\u003e\u003ccode\u003e8edcb1b\u003c/code\u003e\u003c/a\u003e Update CODEOWNERS for actions (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2224\"\u003e#2224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/09d2acae674a48949e3602304ab46fd20ae0c42f\"\u003e\u003ccode\u003e09d2aca\u003c/code\u003e\u003c/a\u003e Update README.md (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2194\"\u003e#2194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/85e6279cec87321a52edac9c87bce653a07cf6c2\"\u003e\u003ccode\u003e85e6279\u003c/code\u003e\u003c/a\u003e Adjust positioning of user email note and permissions heading (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2044\"\u003e#2044\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/009b9ae9e446ad8d9b8c809870b0fbcc5e03573e\"\u003e\u003ccode\u003e009b9ae\u003c/code\u003e\u003c/a\u003e Documentation update - add recommended permissions to Readme (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/2043\"\u003e#2043\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/cbb722410c2e876e24abbe8de2cc27693e501dcb\"\u003e\u003ccode\u003ecbb7224\u003c/code\u003e\u003c/a\u003e Update README.md (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/1977\"\u003e#1977\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/3b9b8c884f6b4bb4d5be2779c26374abadae0871\"\u003e\u003ccode\u003e3b9b8c8\u003c/code\u003e\u003c/a\u003e docs: update README.md (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/1971\"\u003e#1971\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href\u003d\"https://github.com/actions/checkout/compare/11bd71901bbe5b1630ceea73d27597364c9af683...08c6903cd8c0fde910a37f88322edcfb5dd907a8\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dactions/checkout\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d4.2.2\u0026new-version\u003d5.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s major version (unless you unignore this specific dependency\u0027s major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s minor version (unless you unignore this specific dependency\u0027s minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\u003c/details\u003e"
    },
    {
      "commit": "ca019b0498692ad78f5f0f0f6208a1258e17fc90",
      "tree": "63ec516d7f1095bc4472b67abfc0effee191cb76",
      "parents": [
        "3499c1ee7a9bc30f3d5b94af932e8f6ac2cffa14"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Aug 29 10:32:22 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 29 10:32:22 2025 -0700"
      },
      "message": "Use \"@dart\u003d\" comment when determining which style rules to apply. (#1766)\n\nUse \"@dart\u003d\" comment when determining which style rules to apply.\n\nThe formatter correctly used those comments to switch between the old\nshort and new tall style, but ignored them for language versioned style\nrule changes after 3.7. Now the language version of the file is\nconsistently respected for all style rules.\n\nIn the process of fixing this, I made two other clean-ups:\n\n* Introduce a FormattingStyle class separate from DartFormatter. The\n  latter had dual use as both the public API used to configure\n  formatting and the internal object passed around by the formatter to\n  access that configuration. That was annoying because it meant I\n  couldn\u0027t hang handy utility methods that the implementation wants off\n  that class because it\u0027s public. And it meant that I couldn\u0027t change\n  what state it stored (like the language version from the \"@dart\"\n  comment) without it being a breaking API change.\n\n  Now there is a separate internal class that wraps the DartFormatter\n  that can contain that logic. By consistently passing that around and\n  not the DartFormatter, it ensures that code can\u0027t accidentally forget\n  to use the language version in the \"@dart\" comment.\n\n* Pick a consistent naming convention for version numbers in\n  identifiers. When we shipped Dart 3.8, a bunch of style rules changed.\n  I needed a way to refer to the older style and couldn\u0027t come up with\n  anything better than \"3.7\". But you can\u0027t have a dot in identifier,\n  so I did \"37\". With Dart 3.10 on the horizon, that doesn\u0027t make sense:\n  \"310\" is confusing and ambiguous. I considered \"3_7\", but that\n  violates the lint for type names which shouldn\u0027t contain \"_\". Went\n  with \"3Dot7\" instead which I don\u0027t love but seems to work.\n\nFix #1762.\n"
    },
    {
      "commit": "3499c1ee7a9bc30f3d5b94af932e8f6ac2cffa14",
      "tree": "8a215b75fd456e02b474430d596bdf7366979cd2",
      "parents": [
        "bacc9bf8fcec6fffc15ad7e9257b7faba5298ea9"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Aug 08 17:02:03 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 08 17:02:03 2025 -0700"
      },
      "message": "Synchronize the dart_style version in its own help output. (#1759)\n\nThe pubspec is already bumped to 3.1.3-wip."
    },
    {
      "commit": "bacc9bf8fcec6fffc15ad7e9257b7faba5298ea9",
      "tree": "18157c1a1bce34e9add368c57a4de5702795e61f",
      "parents": [
        "b5a166e63316ca8ababe49f51466d1ae2cbc7331"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Aug 08 16:03:44 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 08 16:03:44 2025 -0700"
      },
      "message": "Remove tests of invalid import syntax. (#1758)\n\nRemove tests of invalid import syntax.\n\nThe language specifies that import configuration URIs must appear before\nany import prefix, like:\n\n```dart\nimport \u0027foo.dart\u0027 if (cond) \u0027bar.dart\u0027 as prefix;\n```\n\nIf a user wrote them in the wrong order:\n\n```dart\nimport \u0027foo.dart\u0027 as prefix if (cond) \u0027bar.dart\u0027;\n```\n\nThen the parser used to not report an error and would accept the code,\nwhich would then be compiled successfully. Some users in the wild,\nprobably inadvertently, ended up relying on this. So I added support in\nthe formatter to handle it.\n\nI also filed:\n\nhttps://github.com/dart-lang/sdk/issues/56641\n\nThat issue will be fixed soon:\n\nhttps://github.com/dart-lang/sdk/issues/61264\n\nIt\u0027s going to be a parse error to have the clauses in the wrong order.\nThese formatter tests are failing in the bleeding edge SDK. So now it\u0027s\ntime to remove the tests and support for the broken code.\n\n(Note that the comment in the tests are backwards. Configuration before\nprefix is the correct order. It\u0027s prefix before configuration that\u0027s\nwrong.)\n"
    },
    {
      "commit": "b5a166e63316ca8ababe49f51466d1ae2cbc7331",
      "tree": "036b920b5c740aa69dc64d2987f3d5e3e9e74995",
      "parents": [
        "00b5f3f5256cb179bc340c1e60bb52fd1c2ae1ac"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Aug 08 11:34:34 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 08 11:34:34 2025 -0700"
      },
      "message": "Remove special case handling of dot shorthands in null aware elements. (#1757)\n\nWe fixed the parser so that it can correctly handle:\n\n```dart\n[?.property]\n```\n\nEven if there is no space between `?` and `.`, it knows to treat it as\na dot shorthand inside a null-aware element here. So the formatter\ndoesn\u0027t need to force insert a space in there to avoid `?.` from being\ntokenized as a null-aware access."
    },
    {
      "commit": "00b5f3f5256cb179bc340c1e60bb52fd1c2ae1ac",
      "tree": "930dad0f6b847e3b8b6d5fd4ca2d8e186c07ac38",
      "parents": [
        "5cb56273f5c9260ade502a7d1611e3597648e6dc"
      ],
      "author": {
        "name": "Kevin Moore",
        "email": "kevmoo@users.noreply.github.com",
        "time": "Thu Aug 07 14:40:19 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 07 14:40:19 2025 -0700"
      },
      "message": "Update deps to their lowest allowed, prepare release (#1756)\n\nUsed\n`_PUB_TEST_SDK_VERSION\u003d3.7.0 dart pub downgrade --tighten`"
    },
    {
      "commit": "5cb56273f5c9260ade502a7d1611e3597648e6dc",
      "tree": "4479e433e9a3289beb17e81b2adea3513cc4356e",
      "parents": [
        "a1e405f0bcd5d894109084a7a4b9b19a14653fb9"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Jul 28 18:27:42 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 28 18:27:42 2025 -0700"
      },
      "message": "Make preserved trailing commas apply to record types too. (#1751)\n\nI missed this part of the language when I added support of preserving\ntrailing commas. They should have always been preserved here, so I\ndidn\u0027t language version this change. If someone has preserve trailing\ncommas on but isn\u0027t on 3.10 yet, I think they will still want this\nchange.\n\nFix #1721."
    },
    {
      "commit": "a1e405f0bcd5d894109084a7a4b9b19a14653fb9",
      "tree": "e860e57c2ab87118fdad6430ffdbe22b1d3aff5d",
      "parents": [
        "7278eff793e80b5bdccfbe49b0aac01513d65285"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Jul 28 18:26:10 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 28 18:26:10 2025 -0700"
      },
      "message": "Add a regression test for an idempotency bug. (#1752)\n\nIdempotency bugs where the formatter produces another change if you\nre-run it on its own output are like Whac-a-mole. We don\u0027t have a\nsystematic way to prevent them, so I just fix them as they come up.\n\nWe do *test* for them systematically now. Every single test is formatted\ntwice, again on the output of the first format to ensure that what we\ntest is at least idempotent.\n\nThis one appears to no longer be an issue because the test is already\npassing. Probably got fixed in some of the changes around comment\nhandling.\n\nThis just adds a regression test.\n\nClose #1625."
    },
    {
      "commit": "7278eff793e80b5bdccfbe49b0aac01513d65285",
      "tree": "bb3b8356b52a7654800904beec656ab2aadb4f63",
      "parents": [
        "5d2ad56bf523cd017febe54514e72c41e86520ee"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Jul 28 15:09:19 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 28 15:09:19 2025 -0700"
      },
      "message": "Preserve trailing commas enum with members (#1750)\n\nPreserve trailing commas for enums with members when commas are preserved (#1703)\n\nThis PR changes the formatter to have it maintain trailing commas of last enum constants when there are members.\n\nSo:\n```dart\nenum E { a, b, c,; int x; }\n```\n\nBecomes:\n```dart\nenum E {\n  a,\n  b,\n  c,\n  ;\n\n  int x;\n}\n```\nInstead of:\n\n```dart\nenum E {\n  a,\n  b,\n  c;\n\n  int x;\n}\n```\n\nFixes #1678 \nFixes #1729\n\nAdditionally, a similar style choice was presented in https://github.com/dart-lang/dart_style/issues/1660#issuecomment-2729244122\n\n**Affected users**:\n- Those passing the `trailing_commas: preserve` config option and adding a trailing comma to their enum cases.\n- Users who don\u0027t already pass a trailing comma, aren\u0027t affected. So this PR shouldn\u0027t have undesirable effects on existing users.\n\n**Benefits**:\n- Maintains developer\u0027s intent\n- Less churn when adding additional member cases\n(Personally, I always add a trailing semicolon to avoid churn and to also make it even clearer this is an advanced enum with members.)\n\n**Downsides**:\n- 7 additional logical lines of code to maintain\n\n**Additional considerations**:\nI also considered implementing this for `enum E { a, b,; }`, however, that would require more drastic changes to the formatter as far as I can tell.\n\nAdditionally, in this case the trailing semicolon provides fewer benefits:\n- churn when adding new members is the same if there was a trailing semicolon or not\n- giving the enum other members also only amounts to new lines being added rather than changed so again, no real churn.\n\n**Notes**\n- One test was changed due to this being a change in behavior.\n- This was surprisingly easy and enjoyable to implement (compliment to the existing code base).\n- I didn\u0027t make any changes to the `CHANGELOG.md` since this trailing commas preservation hasn\u0027t shipped yet so its behaviour is still undefined.\n\nCo-authored-by: jellynoone \u003c77585130+jellynoone@users.noreply.github.com\u003e"
    },
    {
      "commit": "5d2ad56bf523cd017febe54514e72c41e86520ee",
      "tree": "1e054765544b6d566338d9fab68c19a75015c485",
      "parents": [
        "4f2fe385bc9a5bee615553588a0dfa6c1dc20306"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Jul 22 14:49:52 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 22 14:49:52 2025 -0700"
      },
      "message": "Preserve space between \"?\" and \".\" in null aware element dot shorthand. (#1748)\n\nPreserve space between \"?\" and \".\" in null aware element dot shorthand.\n\nFix #1642."
    },
    {
      "commit": "4f2fe385bc9a5bee615553588a0dfa6c1dc20306",
      "tree": "19273a8f2c8aca9bbe2c5b533c3b4675bd30e5f6",
      "parents": [
        "05215a6b92ab6080a0e38651f1813ba3c3881ce7"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Jul 22 13:30:40 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 22 13:30:40 2025 -0700"
      },
      "message": "Enable language version 3.10 and format dot shorthands. (#1745)\n\nEnable language version 3.10 and format dot shorthands.\n"
    },
    {
      "commit": "05215a6b92ab6080a0e38651f1813ba3c3881ce7",
      "tree": "8e33979da9f2e3201990f82ea818aab6961be33d",
      "parents": [
        "6c4166afed745c2f33c33a4b66a76e2ae986193f"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Jul 18 10:29:25 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 18 10:29:25 2025 -0700"
      },
      "message": "Bump version to publish 3.1.1. (#1746)\n\nThe only change in this version is allowing 3.9 as a supported language\nversion. This was rolled into the SDK a couple of weeks ago, but not\npublished.\n\nI figure I should publish this before rolling the supported version\nagain to 3.10 just in case any external needs 3.9 support.\n\nI\u0027ll land this before landing #1745."
    },
    {
      "commit": "6c4166afed745c2f33c33a4b66a76e2ae986193f",
      "tree": "71c0991358a4df51a9daf43da311d70426df8c4c",
      "parents": [
        "ac2650aafbc055266f1f9be4739cc898889ddfb2"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Jul 17 17:19:02 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 17 17:19:02 2025 -0700"
      },
      "message": "Smarter versioned tests (#1744)\n\nRedo how versioned tests work.\n\nThe diff in the README.md and the doc comments in the .dart file changes should explain what\u0027s going on here. The basic idea is that now a test is either completely unversioned with only a single output, or completely versioned where all of the output sections have a version number.\n\nI think that\u0027s easier to read than a test like:\n\n```\n\u003c\u003c\u003c\nsome.code();\n\u003e\u003e\u003e 3.8\nsome.code();\n\u003e\u003e\u003e\nsome.code();\n```\n\nAnd you have to try to figure out what versions the last section applies to.\n\nThis commit also updates the tests to match the new style. This just means adding `3.8` to a bunch of output sections where that was previously implicit. The set of tested versions and their expectations are the same.\n\nI also updated the test updater to support the new output styles.\n\nThis change also speeds up running the formatter tests by skipping running tests on language versions where the output is the same as a previous and subsequent version. Prior to this change, running tall_format_test.dart runs 8,674 tests. If you bump the highest supported language version from 3.9 to 3.10 (which I\u0027m about to do for dot shorthands), that jumps to 11,556 because it runs every test at every language version.\n\nWith this change, it runs 5,940 tests when the maximum supported version is both 3.9 and 3.10. The number of tests being run only increases when there are actual new tests or new version-specific expectations.\n"
    },
    {
      "commit": "ac2650aafbc055266f1f9be4739cc898889ddfb2",
      "tree": "e0c918235f4692857b4855b92e9bd5bce1ce2454",
      "parents": [
        "44e8cfe7ba5a873ef81b6b39c07d50171eccf021"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Jul 17 15:40:40 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 17 15:40:40 2025 -0700"
      },
      "message": "Get the test updater script working again. (#1743)\n\nWhen I made the style changes language versions for Dart 3.8, I changed\nhow tests are written to allow a single test to have different expected\noutputs at different language versions.\n\nI was pressed for time, so that broke the automated test updater which\ndoesn\u0027t know how to handle versions. This gets it working again.\n\nIn the process, I decided to tweak how the final newline in test files\nis handled. For years, I avoided having a trailing newline because I\nthough it would confuse the formatter. At some point that may have even\nbeen true. But it turns out to be fine and it\u0027s more idiomatic to have a\ntrailing newline at the end of a text file.\n\nThe test updater now ensures that and I went ahead and normalized all\nof the tests to have trailing newlines. There are no other changes to\nthe test files."
    },
    {
      "commit": "44e8cfe7ba5a873ef81b6b39c07d50171eccf021",
      "tree": "968d41920e64d613bd4ea7d0d1adc804b433b5b8",
      "parents": [
        "2a6c97b7e05234f3bd16b08dbd3150e63c8bb4ca"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Jul 01 17:38:00 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 01 17:38:00 2025 -0700"
      },
      "message": "Bump latest supported language version to 3.9. (#1740)\n\n"
    },
    {
      "commit": "2a6c97b7e05234f3bd16b08dbd3150e63c8bb4ca",
      "tree": "8a44711c7660958304b23665a6594e1c6282c96a",
      "parents": [
        "90227c5d32ee80ee5e15d785034b440b77224c98"
      ],
      "author": {
        "name": "Daco Harkes",
        "email": "dacoharkes@google.com",
        "time": "Mon Jun 23 17:11:46 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 23 17:11:46 2025 +0200"
      },
      "message": "Add configurable category to `FormatCommand` (#1735)\n\n"
    },
    {
      "commit": "90227c5d32ee80ee5e15d785034b440b77224c98",
      "tree": "b0fa258a0be894efe3d64c25b8e09c150b812bfb",
      "parents": [
        "121e5e35460439e725ad184b58ea26f76f17502a"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue May 20 10:45:38 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 20 10:45:38 2025 -0700"
      },
      "message": "Fix permissions in the CI publish workflow. (#1720)\n\n"
    },
    {
      "commit": "121e5e35460439e725ad184b58ea26f76f17502a",
      "tree": "8c4820e9e911c6fd1c6ca5481c2699fc3e3a7354",
      "parents": [
        "e7264fc65b06efd600ad6e64bf83e5ff51dbf05a"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue May 20 10:35:25 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 20 10:35:25 2025 -0700"
      },
      "message": "Bump version to publish 3.1.0. (#1719)\n\nBump version to publish 3.1.0.\n\nThese changes have already rolled into the SDK, Flutter, and google3.\n"
    },
    {
      "commit": "e7264fc65b06efd600ad6e64bf83e5ff51dbf05a",
      "tree": "fbbf52b7da502cd4c3ff6e49eee23e7f573e5a74",
      "parents": [
        "7c16cf2ca19c7efe1d0eda52673b9745bae98601"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Apr 24 15:24:41 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 24 15:24:41 2025 -0700"
      },
      "message": "Add regression test for #1712. (#1715)\n\nThis was already fixed by #1687.\n\nClose #1712."
    },
    {
      "commit": "7c16cf2ca19c7efe1d0eda52673b9745bae98601",
      "tree": "58b1ecdf0810f60b4cd4cfab181d17632a10e829",
      "parents": [
        "100db45075abdd66fd8788b205243e90ff0595df"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Apr 24 11:22:14 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 24 11:22:14 2025 -0700"
      },
      "message": "Update the README. (#1713)\n\nLink to the new configuration docs and tweak the examples."
    },
    {
      "commit": "100db45075abdd66fd8788b205243e90ff0595df",
      "tree": "18148571ad999426880d9371ca10750699aa0964",
      "parents": [
        "c7f6131466d2de2109b03288557176ef45d6f002"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Apr 10 07:50:32 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 10 07:50:32 2025 -0700"
      },
      "message": "Language version all of the formatting changes since Dart 3.7. (#1707)\n\nLanguage version all of the formatting changes since Dart 3.7.\n\nThe new formatter launch was pretty rocky, but one thing I think helped mitigate that was that the formatting style was gated on language version. Users could install the new SDK and their code wouldn\u0027t be spontaneously reformatted under them until they deliberately updated their SDK constraint to opt in to the new language version.\n\nThis PR applies that same logic to the changes we\u0027ve made since Dart 3.7.\n\nAny source file at language version 3.7 is formatted (almost, see below) identically to how it would be formatted with the SDK as it shipped in 3.7. Source files at language version 3.8 or higher get all of the new style changes I\u0027ve landed since then.\n\nThis increases the complexity of the formatter codebase a decent amount, but it\u0027s mostly just a lot of \"if 3.7 do X else do Y\". Tedious but not intractable.\n\nI expect to continue to language version changes like this going forward. So after Dart 3.8 ships, whatever formatter style is in that version will be locked down and style changes after that will have to support 3.7 and 3.8 fallback behavior. I expect there to be much less style churn going forward, so it\u0027s probably manageable.\n\nIn cases where there are *bugs* (i.e. the formatter produces invalid syntax or rearranges code), those won\u0027t be language versioned. But most other style changes will be.\n\nIt\u0027s important to make sure we don\u0027t regress and accidentally affect the formatting of older language versioned files when making changes to the formatter. To avoid that, this also expands testing to be multi-versioned. Every test is now run on multiple versions and for cases where the style differs between versions, there are different expectations for each. Fortunately, the tests run very fast, so it doesn\u0027t slow down things more than a couple of seconds.\n\nIn addition to running through the formatter\u0027s own test suite and regression tests, I also tested this on a giant corpus of pub packages. I formatted them all using the shipped Dart 3.7 formatter, then using this PR with `--language-version\u003d3.7`. Of the 89,468 files, 7 had differences. They all relate to a single weird corner case around giant multiline strings containing multiline string interpolation expressions where the formatting is slightly different. #1706 helps that somewhat -- there were about dozen diffs before -- but doesn\u0027t totally eliminate it. I think it\u0027s close enough to be tolerable.\n"
    },
    {
      "commit": "c7f6131466d2de2109b03288557176ef45d6f002",
      "tree": "90e99b27d1e3807a8d8405db404ff6a91e363311",
      "parents": [
        "eaa3f2da2ca1b5a21a12f6a3de1a710990502aae"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Wed Apr 09 16:13:35 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 09 16:13:35 2025 -0700"
      },
      "message": "Don\u0027t invalidate solutions from pinned pieces. (#1706)\n\nIf a string interpolation contains a splittable expression which in\nturn contains an expression with a mandatory newline (like a multiline\nstring or `;`), then the solver gets confused.\n\nThe splittable expression is already pinned to state 0 to prevent there\nfrom being newlines in the string interpolation. But now the newline\ninside the subexpression tries to force the splittable expression to\nsplit.\n\nThat leads the solver to invalidate the solution and then try to find\nsomething better. Ultimately, it ends up unnecessarily splitting some\npiece surrounding the interpolated string. (In the examples I\u0027ve seen\nin the wild, it\u0027s always a function\u0027s argument list.)\n\nTo avoid that, if a piece is already pinned, then we ignore invalidation\nfrom it. This fixes the few rare cases I\u0027ve seen in a large corpus and\ndoesn\u0027t impact anything else.\n\n(Also, this fixes an edge case where the formatter in Dart 3.7 behaves\ndifferently from the current formatter. The 3.7 formatter doesn\u0027t have\nthis bug. Something about the new shape-based solver seems to tickle\nit. I\u0027m not sure why.)"
    },
    {
      "commit": "eaa3f2da2ca1b5a21a12f6a3de1a710990502aae",
      "tree": "6a50ec30e29b371ae628bff0656438e384fb1222",
      "parents": [
        "cd73f3e3cc255958bef66efb3779b2f8ecff1715"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Apr 03 17:07:23 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 03 17:07:23 2025 -0700"
      },
      "message": "Make the eager argument list splitting heuristic more conservative. (#1700)\n\nSome folks on the Flutter team pointed out that the previous rule is too aggressive and splits even simple common code like:\n\n```dart\nText(\u0027Item 1\u0027, style: TextStyle(color: Colors.white));\n```\n\nThat\u0027s probably simple enough to stay on one line. So this tweaks the heuristic to allow that to remain unsplit. Where the old heuristic split any argument list with a named argument that contained a nested named argument, this requires there to be at least *three* named arguments.\n\nIt\u0027s sort of an arbitrary cutoff, but it seems to do a good job when run on a large corpus."
    },
    {
      "commit": "cd73f3e3cc255958bef66efb3779b2f8ecff1715",
      "tree": "d0e42be9524104530be7b2dd24f8449e05ae0ee3",
      "parents": [
        "8dd0e3bb09fde5de3a6ea299b6be5c7386109189"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Wed Apr 02 12:05:01 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 02 12:05:01 2025 -0700"
      },
      "message": "Add regression test for #1645. (#1697)\n\nThis is already fixed (probably by #1687).\n\nClose #1645."
    },
    {
      "commit": "8dd0e3bb09fde5de3a6ea299b6be5c7386109189",
      "tree": "44728631bec0a063d9dd4f40e1dcfa7dcb71b924",
      "parents": [
        "4d5edfc54291068356123383e398efce74aa00f1"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Wed Apr 02 12:04:45 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 02 12:04:45 2025 -0700"
      },
      "message": "Add issue templates. (#1698)\n\nI\u0027ve been getting a lot of issues lately with screenshots instead of text which isn\u0027t super helpful. Adding a couple of issue templates to help guide users towards more actionable issues."
    },
    {
      "commit": "4d5edfc54291068356123383e398efce74aa00f1",
      "tree": "4243501af6f5ddc8bbbf86d371bb86d13dcfdc75",
      "parents": [
        "71421b328391a6ed9c1a9e7229c394d9ed613d77"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Wed Apr 02 12:04:22 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 02 12:04:22 2025 -0700"
      },
      "message": "Fix bug with comments being reordered. (#1696)\n\nIn certain locations, if you had multiple inline block comments on the same line, they would get reordered. That in turn would (correctly) trip the formatter\u0027s internal \"whitespace-only changes\" sanity check and lead to it aborting.\n\nFix #1667."
    },
    {
      "commit": "71421b328391a6ed9c1a9e7229c394d9ed613d77",
      "tree": "914ae63207a95f218721566875b224f7299b7aef",
      "parents": [
        "8a17214e2f591ab30952f9f20179b22901ee882b"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Apr 01 17:57:44 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 01 17:57:44 2025 -0700"
      },
      "message": "Allow shape to propagate through AssignPieces. (#1694)\n\nConsider:\n\n```dart\nfunction(name: (param) \u003d\u003e another(argument1, argument2, argument3));\n```\n\nHere we have a ListPiece for the `another(...)` call wrapped in an AssignPiece for the `\u003d\u003e` wrapped in an AssignPiece for the `name:`. When the inner ListPiece splits, it will be block-shaped. That in turn allows the surrounding AssignPiece to block format, giving:\n\n```dart\n(param) \u003d\u003e another(\n  argument1,\n  argument2,\n  argument3,\n)\n```\n\n(If the ListPiece wasn\u0027t block-shaped, then the formatter would split after `\u003d\u003e`.)\n\nAn interesting question is then \"what is the shape of that AssignPiece?\" Prior to this PR, the answer was always \"other\". Regardless of the shape of the AssignPiece\u0027s RHS, a split AssignPiece always had shape other. That meant that the entire original example would end up like:\n\n```dart\nfunction(\n  name:\n      (param) \u003d\u003e another(\n        argument1,\n        argument2,\n        argument3,\n      ),\n);\n```\n\nBecause the `(param) \u003d\u003e ...` piece had shape \"other\", the AssignPiece for the named argument couldn\u0027t block format it, so it would split after the `:`.\n\nThat\u0027s not ideal. In practice with `\u003d` and espectially with named arguments, users really want code on the same line as the argument name (and less indented) if at all possible.\n\nThis PR propagates the shape of the AssignPiece\u0027s contents out to its surrounding context. This means that a headline-shaped RHS causes the assignment to be headline-shaped, and likewise for block-shaped. That lets the above example be formatted as:\n\n```dart\nfunction(\n  name: (param) \u003d\u003e another(\n    argument1,\n    argument2,\n    argument3,\n  ),\n);\n```\n\nSince `\u003d`, `:`, and `\u003d\u003e` all use AssignPiece, this theoretically means that arbitrarily complex chains of those propagate the shape out. For example, chained assignments like this now work:\n\n```dart\nouter \u003d inner \u003d [\n  element,\n  element,\n];\n```\n\nIn practice, 99% of the time this comes into play, it\u0027s a named argument whose expression is a `\u003d\u003e` function. But those are very common for callbacks in Flutter code, so this makes a big difference.\n\nFix #1536.\nFix #1545.\nFix #1668.\nFix #1679."
    },
    {
      "commit": "8a17214e2f591ab30952f9f20179b22901ee882b",
      "tree": "febab2b925df139ae953c9bc980803a2af529b2e",
      "parents": [
        "d8eb9c919ace055e11e308cf42d4b746597455d5"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Apr 01 17:56:15 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 01 17:56:15 2025 -0700"
      },
      "message": "Eagerly split argument lists based on their contents. (#1690)\n\nEagerly split argument lists based on their contents.\n\nThis is similar to the existing rule where nested non-empty collection literals force the outer one to split. The rules are basically:\n\n* If an argument list contains any named arguments and contains any other calls whose argument lists contain any named arguments (directly or indirectly), then split the outer one. We make an exception where a named argument whose expression is a simple number, Boolean, or null literal doesn\u0027t count as a named argument.\n\n* If a list, set, or map literal is the immediate expression in a named argument and one of the above kinds of argument lists (directly or indirectly), then force the collection to split.\n\n```dart\n// Before:\nStack(children: [result, Semantics(label: indexLabel)]);\n\n// After:\nStack(\n  children: [\n    result,\n    Semantics(label: indexLabel),\n  ],\n);\n```\n\nI\u0027ve uploaded a diff of this change applied to a corpus here:\n\nhttps://github.com/munificent/temp-eager-split-sample/commit/b864a67965c4db736e8a067985446134c5e4d9d5\n\nFix #1660.\n"
    },
    {
      "commit": "d8eb9c919ace055e11e308cf42d4b746597455d5",
      "tree": "f1817196505aefb52a42870dcc94befa1ca115dc",
      "parents": [
        "496740ab8a167836478a5462df54c460d863d03b"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Mar 31 17:39:55 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 31 17:39:55 2025 -0700"
      },
      "message": "Avoid splitting chains containing only properties. (#1689)\n\n* Avoid splitting chains containing only properties.\n\nI was trying out the new formatter on a corpus after #1687 and saw a bunch of diffs like:\n\n```dart\n// Before:\nWidget(\n  name:\n      some.property.chain,\n)\n\n// After:\nWidget(\n  name: some\n      .property\n      .chain,\n)\n```\n\nWhile the new headline style looks nice for most method call chains, it looks weird if it\u0027s only just a series of properties. In particular, a single `foo.bar` looks really silly when split.\n\nThis PR bumps the split cost of a chain up if it only contains properties. That leads the solver to prefer splitting the surrounding construct when possible.\n\n* Add test for property chain that still doesn\u0027t fit."
    },
    {
      "commit": "496740ab8a167836478a5462df54c460d863d03b",
      "tree": "aaf92e6c657f90f92175703db12ebdfd3dc305bb",
      "parents": [
        "da2d0fa98610493d1ba1debfaf135020578436b6"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Mar 31 17:11:12 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 31 17:11:12 2025 -0700"
      },
      "message": "Add regression tests for issues that are fixed now. (#1688)\n\n(Most were fixed by #1687, but some were already better.)\n\nClose #900 (!).\nClose #1525.\nClose #1526.\nClose #1603.\nClose #1685."
    },
    {
      "commit": "da2d0fa98610493d1ba1debfaf135020578436b6",
      "tree": "efd0c0472acab1283ec5407e4c0e7169e19aeda7",
      "parents": [
        "71ac08514f771363b9b4b105786042d0ab91d569"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Mar 28 14:46:14 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 28 14:46:14 2025 -0700"
      },
      "message": "Smarter handling of \"block\" and \"headline\" formatting. (#1687)\n\n* Start adding support for \"shape\" parent constraints.\n\nCurrently, a parent can only indicate whether a child can contain newlines or not when determining whether a solution is invalid. This\nworks fine for most pieces, but isn\u0027t sophisticated enough to allow fixing #1465 and #1466 where we want to say that the child can have newlines but only in certain styles.\n\nThis is a step towards supporting those more sophisticated constraints. It doesn\u0027t change the underlying semantics at all, but it replaces the basic boolean newlines yes/no, with a Set\u003cShape\u003e.\n\n* Make indentation semantic.\n\nInstead of pushing a raw integer for how much indentation a piece adds, use an enum with different values for each kind of indentation.\n\nThen, instead of a separate \"canCollapse\" parameter, have some logic that understands that certain pairs of semantic indentation can be merged. The hope is that this should then simplify some of the complex indentation handling in AssignPiece (and maybe elsewhere).\n\nThere\u0027s no behavioral change or deep refactoring in this commit. It just replaces the int indentation and \"canCollapse\" parameter with an enum.\n\nNote that the old short style code also has a class named Indent which has static constants for various indentation levels. The tall code also used that same class. Now it uses its own Indent class which is an actual enum. That\u0027s why much of the change in this commit is just removing an import. The existing uses of Indent silently switch over to the new enum in code_writer.dart.\n\n* Use indentation merging to handle flattened indentation in assignments.\n\nIt looks nice if we align binary operands when the first operand is on its own line, which is often the case after `\u003d`, `:`, and `\u003d\u003e`:\n\n```dart\nvariable \u003d\n    operand +\n    another;\n```\n\nThis is also true for adjacent strings and conditional expressions.\n\nPreviously, we had some somewhat hacky code that looked at the AST node surrounding an expression to determine if it should indent itself or not. This removes that in favor of using the new merging ability of Indent. We use a separate Indent type for assignment and infix operators and then merge those two together.\n\nThis simplifies a bunch of things and lends itself to more uniform formatting since every AST node that lowers to a piece using Indent.infix will get this behavior. In fact, this commit highlighted that `is` and `as` expressions currently *aren\u0027t* formatted the same way as other binary operators, which I think was just an oversight.\n\nThis commit still formats them differently, but I\u0027ll probably change that later. For now, it just leaves TODOs.\n\nThis commit does change the formatter behavior very slightly, but only in obscure edge cases.\n\n* Add support for block shapes and use that for block formatting.\n\nThis is (hopefully) the big commit. It\u0027s largely a refactoring but also has some style changes. Most of the style changes in places where the prior formatting was unintentional or a compromise to the old architecture.\n\nThe changes in this commit are:\n\n- Add a new \"block\" shape. Pieces that split into delimited lists (collection literals, blocks, argument lists) have block shape.\n\n- Change AssignPiece, CasePiece, ChainPiece, and ForInPiece to use that for handling their block-formatted child pieces. Previous commits already let a piece constrain its children to a subset of the allowed shapes, and now we use that to let them say not just whether not a newline is allowed, but what resulting shape the child must have.\n\n- Add some machinery to CodeWriter to control the shape of the resulting piece when a newline is written. Coming up with a nice API for that is pretty hard, but I think what I have here works OK. There is also some machinery to determine how a child piece\u0027s shape affects the resulting shape of the parent. It isn\u0027t used heavily yet but will probably be used more in future changes to tweak the style for more complex nested expressions.\n\nThis commit has two negative consequences:\n\n- Perf is regressed roughly 15% across the board. That\u0027s not great, but it\u0027s not catastrophic. To avoid a new pathological corner case, I added a hack where nested `\u003d\u003e` expressions (which occur when someone really wants to write Haskell in Dart) always force the outer ones to split. Without that, curried code gets catastrophically slow. I have some ideas on how to get some performance back but I\u0027ll save that for later.\n\n- Some \"headline\"-shaped output is no longer supported. It\u0027s always been a goal of the formatter to support output like:\n\n  ```dart\n  variable \u003d target\n      .method()\n      .another();\n  ```\n\n  Prior to this commit, that *sort of* worked for most expressions, but really only incidentally and you could run into places where it should work but didn\u0027t. Moving to shape-based constraints makes it uniformly *not* work. In a future commit, I plan to add another \"headline\" shape that will get code like this working again, reliably.\n\nOn the plus side, the behavior of the formatter is overall more consistent with this change.\n\n* Fix double indentation of const pattern.\n\n* Get \"headline\"-style formatting working.\n\nWe now allow some non-block shaped pieces on the right side of an assignment without splitting if it those pieces are \"headline\"-shaped. That means they have a single first line that makes sense on the `\u003d` line followed by other subordinate code. There are three kinds of expressions that support that:\n\n```dart\n// Conditionals:\nvariable \u003d condition\n    ? thenBranch\n    : elseBranch;\n\n// Split method chains:\nvariable \u003d target\n    .method()\n    .another();\n\n// (Also with unsplit properties):\nvariable \u003d target.some.props\n    .method()\n    .another();\n\n// Multi-line strings:\nvariable \u003d \u0027\u0027\u0027\n    A very long string\n    that is multiple lines.\u0027\u0027\u0027;\n```\n"
    },
    {
      "commit": "71ac08514f771363b9b4b105786042d0ab91d569",
      "tree": "d79423af241f9a35771513a62875131e4f2be823",
      "parents": [
        "2772c8d2393c332fcb66125a3bbc2b42bf561c3f"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Mar 17 11:03:34 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 17 11:03:34 2025 -0700"
      },
      "message": "Add an optional configuration to preserve trailing commas. (#1672)\n\nAdd an optional configuration to preserve trailing commas.\n\nIn the old short formatter, when a delimited construct had a trailing comma, it had two effects:\n\n1.  The construct would be formatted \"Flutter style\" where the closing bracket would be moved to the next line and the contents indented +2, as opposed to the earlier style where the bracket stays on the same line as the last element and the elements are indented +4).\n\n2.  The construct is forced to split even if it otherwise wouldn\u0027t.\n\nThe new formatter always uses a Flutter-like style for commas-separated constructors, so trailing commas are no longer needed for point 1.\n\nWhen it does split a construct, it always adds a trailing comma. This means that point 2 breaks reversibility. Because of that, and because many users don\u0027t want to decide for every construct whether it should split or not, the new tall formatter no longer does point 2. It will remove a trailing comma and collapse a construct if it decides to.\n\nHowever, some users rely heavily on that feature and strongly prefer control over forcing argument lists and other constructs to split.\n\nThis PR restores that functionality with an opt-in configuration:\n\n```\nformatter:\n  trailing_commas: preserve\n```\n\nWhen enabled, if a construct has a trailing comma, the formatter will always split it. Users that preferred that behavior from the old formatter can enable the option and continue to work that way.\n\nThis does not mean we are generally moving in the direction of a more configurable formatter. This was a behavior that the formatter already supported and we removed it to the detriment of some users\u0027 experience. We\u0027re restoring that existing behavior for those users who want it.\n\nFix #1652.\n"
    },
    {
      "commit": "2772c8d2393c332fcb66125a3bbc2b42bf561c3f",
      "tree": "85768f9c2084c4aaa26024529e6a02bb302c9db9",
      "parents": [
        "348a14679f315c5f21033facb38f8d2397455944"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Wed Mar 12 16:22:02 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 12 16:22:02 2025 -0700"
      },
      "message": "Update the SDK constraint and move onto the new formatter. (#1669)\n\nUpdate the SDK constraint and move onto the new formatter.\n\nFinally get to dogfood it in the dart_style repo.\n\nI tweaked a couple of very minor things to play nice with the new style:\n\n- A couple of test() calls had their test body indented because the\n  description string didn\u0027t fit. Reworded or split the strings.\n\n- Hoisted out one very large closure because it got indented farther.\n\n- Rewrapped a couple of comments.\n\nOtherwise, no real surprises.\n\nI also took the opportunity to ensure every formatter test file had a\nconsistent newline at the end.\n"
    },
    {
      "commit": "348a14679f315c5f21033facb38f8d2397455944",
      "tree": "4b807be2aeb3b701c346eb7d7395236a034aff3f",
      "parents": [
        "852e54f726f818c871b108885cf557a03e765ab1"
      ],
      "author": {
        "name": "Chloe Stefantsova",
        "email": "519320+chloestefantsova@users.noreply.github.com",
        "time": "Wed Mar 05 16:28:19 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 05 07:28:19 2025 -0800"
      },
      "message": "Format null-aware elements (#1663)\n\nFormat null-aware elements\n\n- Add support for passing experiment flags with tests. The old way of\n  doing this was to just hardcode experiments inside the formatter when\n  a new feature was supported. That made sense when the formatter didn\u0027t\n  know about language version, but now that it does, it should probably\n  require experiment flags explicitly and tests for new features should\n  enable them.\n"
    },
    {
      "commit": "852e54f726f818c871b108885cf557a03e765ab1",
      "tree": "3038caa077d689bba3d3346bc7e014f45ee2d570",
      "parents": [
        "1a6119afc65eaafcc1e58ab96c1c44b4d01d2e4c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Mar 01 13:30:21 2025 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 01 13:30:21 2025 +0000"
      },
      "message": "Bump dart-lang/setup-dart in the github-actions group (#1662)\n\nBumps the github-actions group with 1 update: [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart).\n\nUpdates `dart-lang/setup-dart` from 1.7.0 to 1.7.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/dart-lang/setup-dart/releases\"\u003edart-lang/setup-dart\u0027s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.7.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRoll \u003ccode\u003eundici\u003c/code\u003e dependency to address \u003ca href\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-c76h-2ccp-4975\"\u003eCVE-2025-22150\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eUpdate to the latest npm dependencies.\u003c/li\u003e\n\u003cli\u003eRecompile the action using the new Dart / JavaScript interop.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md\"\u003edart-lang/setup-dart\u0027s changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.7.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRoll \u003ccode\u003eundici\u003c/code\u003e dependency to address \u003ca href\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-c76h-2ccp-4975\"\u003eCVE-2025-22150\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eUpdate to the latest npm dependencies.\u003c/li\u003e\n\u003cli\u003eRecompile the action using the new Dart / JavaScript interop.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.7.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eInstall flutter sdk in publishing step, allowing Flutter packages to be\npublished (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003e#68\u003c/a\u003e[])\u003c/p\u003e\n\u003cp\u003e\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003e#68\u003c/a\u003e: \u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003edart-lang/setup-dart#68\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.5\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix zip path handling on Windows 11 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003e#118\u003c/a\u003e[])\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003e#118\u003c/a\u003e: \u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003edart-lang/setup-dart#118\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.6.4\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRebuild JS code.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.3\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRoll \u003ccode\u003eundici\u003c/code\u003e dependency to address \u003ca href\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-m4v8-wqvr-p9f7\"\u003eCVE-2024-30260\u003c/a\u003e and \u003ca href\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-9qxr-qj54-h672\"\u003eCVE-2024-30261\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSwitch to running the workflow on \u003ccode\u003enode20`` from \u003c/code\u003enode16`. See also\n\u003ca href\u003d\"https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/\"\u003eTransitioning from Node 16 to Node 20\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated the google storage url for \u003ccode\u003emain\u003c/code\u003e channel releases.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEnable provisioning of the latest Dart SDK patch release by specifying just\nthe major and minor version (e.g. \u003ccode\u003e3.2\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.5.1\u003c/h2\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c\"\u003e\u003ccode\u003ee51d8e5\u003c/code\u003e\u003c/a\u003e prep for releasing 1.7.1 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/150\"\u003e#150\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/1faf8e64e5464d6b727016aa2467794f7dc410fb\"\u003e\u003ccode\u003e1faf8e6\u003c/code\u003e\u003c/a\u003e updates to move away from dart:js_util (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/148\"\u003e#148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/614cb8d798824d682e7086a5d8b14e588723bc5c\"\u003e\u003ccode\u003e614cb8d\u003c/code\u003e\u003c/a\u003e Bump flutter-actions/setup-flutter in the github-actions group (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/146\"\u003e#146\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/55f49ad7b2b8b71f3043f80dc4cd4e0eca4aa90b\"\u003e\u003ccode\u003e55f49ad\u003c/code\u003e\u003c/a\u003e Bump undici from 5.28.4 to 5.28.5 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/149\"\u003e#149\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/2c0db8f5ec902ee2420de88e6ece2f275d1f26f1\"\u003e\u003ccode\u003e2c0db8f\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003e@​actions/tool-cache\u003c/code\u003e from 2.0.1 to 2.0.2 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/147\"\u003e#147\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/6123db65aca0aa1e30809215875310f1ca706148\"\u003e\u003ccode\u003e6123db6\u003c/code\u003e\u003c/a\u003e Bump dart-lang/setup-dart in the github-actions group (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/145\"\u003e#145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href\u003d\"https://github.com/dart-lang/setup-dart/compare/e630b99d28a3b71860378cafdc2a067c71107f94...e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003ddart-lang/setup-dart\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d1.7.0\u0026new-version\u003d1.7.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s major version (unless you unignore this specific dependency\u0027s major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s minor version (unless you unignore this specific dependency\u0027s minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\u003c/details\u003e"
    },
    {
      "commit": "1a6119afc65eaafcc1e58ab96c1c44b4d01d2e4c",
      "tree": "62a0c276812468f1f056ecb10b9d623950bc4c39",
      "parents": [
        "33aefe348d596dcc09d61bcf52982f74babddeb5"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Feb 28 17:28:08 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 28 17:28:08 2025 -0800"
      },
      "message": "Allow block formatting record types in typedefs. (#1661)\n\nFix #1651."
    },
    {
      "commit": "33aefe348d596dcc09d61bcf52982f74babddeb5",
      "tree": "36a1e0727f0615240e8a46ab0b6e0110ea9db9a4",
      "parents": [
        "02c6ca65a265867beb9ec42df3ffc3e390e7c7be"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Feb 27 14:04:04 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 27 14:04:04 2025 -0800"
      },
      "message": "Revamp conditional expression indentation. (#1626)\n\nRevamp conditional expression indentation.\n\nThis PR makes two changes to how conditional expressions are indented:\n\n**Don\u0027t indent subsequent conditional branches if an assignment context.**\n\nThe formatter has some special handling for infix operators inside assignment-like contexts (after `\u003d`, `:`, or `\u003d\u003e`) to avoid otherwise redundant-seeming indentation. Normally, you\u0027d get:\n\n```dart\nvariable \u003d\n    operand +\n        another;\n```\n\nThe +4 before `operand +` is from the assignment indenting the RHS. And then the +4 before `another;` is that plus the +4 indentation from the binary operator. It looks better if the operands line up, so when a binary operator is in an assignment context, we don\u0027t indent it. That gives:\n\n```dart\nvariable \u003d\n    operand +\n    another;\n```\n\nI think that looks nice, and users have asked for it. For no good reason, when writing the new formatter we didn\u0027t do that for conditional expressions. You get:\n\n```dart\nvariable \u003d\n    condition\n        ? thenBranch\n        : elseBranch;\n```\n\nThis PR applies the same rule to conditionals that we do for binary operators, giving:\n\n```dart\nvariable \u003d\n    condition\n    ? thenBranch\n    : elseBranch;\n```\n\n**Indent then and else branches past their operator.**\n\nIf there\u0027s a split *inside* a conditional operator\u0027s operand, we have to decide how to indent it. Currently, there is no indentation at all. That looks OK if the internal split is from something like a binary operator:\n\n```dart\ncondition\n    ? longOperand +\n        anotherLongOperand\n    : thirdOperand +\n        anotherLongOperand;\n```\n\nBut it looks less good if the split is something like a function call:\n\n```dart\ncondition\n    ? function(\n      argument,\n      another,\n    )\n    : function(\n      argument,\n      another,\n    );\n```\n\nIt seems weird that the `)` are at the same indentation as the conditional operators themselves.\n\nThis PR fixes #1534 and indents the then and else branches (but not the condition) two spaces past the operands. It does this for all operand subexpressions, giving:\n\n```dart\ncondition\n    ? longOperand +\n          anotherLongOperand\n    : function(\n        argument,\n        another,\n      );\n```\n\n**Together:**\n\nIf you put these changes together, then in an assignment context, the `?` and `:` move fours spaces left and their subexpressions move two spaces left:\n\n```dart\n// Before:\nSomeWidget(\n  child:\n      condition\n          ? AnotherWidget(\n            argument,\n            argument,\n          )\n          : ThirdWidget(\n            argument,\n            argument,\n          )\n);\n\n// After:\nSomeWidget(\n  child:\n      condition\n      ? AnotherWidget(\n          argument,\n          argument,\n        )\n      : ThirdWidget(\n          argument,\n          argument,\n        )\n);\n```\n\nThe overall effect is to move conditionals to the left. That in turn means some code that would wrap no longer has to. This ends up being pretty valuable because conditional expressions are very common in Flutter widget code since we don\u0027t allow `if` inside argument lists.\n\nI\u0027ve tested this on a big corpus of pub packages and every diff I saw looked better to my eyes.\n"
    },
    {
      "commit": "02c6ca65a265867beb9ec42df3ffc3e390e7c7be",
      "tree": "c9aac8389fe707dd14e137eda48e5a75f47a97cc",
      "parents": [
        "110b9f74c200c0108b0612c7369969b3c37b8efd"
      ],
      "author": {
        "name": "Kevin Moore",
        "email": "kevmoo@users.noreply.github.com",
        "time": "Mon Feb 10 13:22:43 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 10 11:22:43 2025 -0800"
      },
      "message": "Drop support for macros (#1643)\n\n"
    },
    {
      "commit": "110b9f74c200c0108b0612c7369969b3c37b8efd",
      "tree": "32ba11fce1241b1254671fff8f98642d7fc8261e",
      "parents": [
        "cea5a1a3e974c5065e6f4cc19b2838cd62448f0a"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Jan 31 16:06:00 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 31 16:06:00 2025 -0800"
      },
      "message": "Don\u0027t add a trailing comma in lists that shouldn\u0027t have one. (#1640)\n\nType parameter and type argument lists don\u0027t allow trailing commas. The\r\nformatter is generally good about not adding them, but it would get\r\ntripped up if the list ended with comments (which are treated like\r\nseparate elements in the list). This fixes that bug.\r\n\r\nFix #1639."
    },
    {
      "commit": "cea5a1a3e974c5065e6f4cc19b2838cd62448f0a",
      "tree": "87a677165a9c7502f82d81c2d5a74b8e65d6b743",
      "parents": [
        "d76b6eeb71f925e5120a7dbae7836a5cd7a859b9"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Jan 21 14:47:57 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 21 14:47:57 2025 -0800"
      },
      "message": "Add tests for digit separators. (#1633)\n\nAdd tests for digit separators.\r\n\r\n(They\u0027re already working, but there were no tests.)\r\n"
    },
    {
      "commit": "d76b6eeb71f925e5120a7dbae7836a5cd7a859b9",
      "tree": "aa10201e99968a8ec8729f37404e945ed823eb0b",
      "parents": [
        "21de99ec0ff8ace4d946a746fb427fffd6afa535"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Dec 20 13:35:00 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 20 13:35:00 2024 -0800"
      },
      "message": "Bump version number to publish 3.0.1. (#1631)\n\nBump version number to publish 3.0.1.\r\n\r\nIt\u0027s already rolled into the SDK and google3.\r\n"
    },
    {
      "commit": "21de99ec0ff8ace4d946a746fb427fffd6afa535",
      "tree": "2064fc15e2764286fa68affe889b68b44864842c",
      "parents": [
        "b6e6bfceb248f183f5ce112fb8473e004a1527b9"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Dec 17 15:34:31 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 17 15:34:31 2024 -0800"
      },
      "message": "Add regression test for #1628. (#1629)\n\nAdd regression test for #1628.\r\n\r\nLooks like this was already fixed by #1615.\r\n\r\nClose #1628.\r\n"
    },
    {
      "commit": "b6e6bfceb248f183f5ce112fb8473e004a1527b9",
      "tree": "5daca62f1125f2a227a5023e98e1b561ea6fa922",
      "parents": [
        "67ba681144c31f8b28313c5ad1258b5072f7239a"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Dec 17 10:19:16 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 17 10:19:16 2024 -0800"
      },
      "message": "Update grinder script. (#1627)\n\nUpdate grinder script.\r\n\r\nThe workflow for shipping dart_style used to be that we published a new version on pub and then rolled it into the Dart SDK. That meant that the dart_style version number in the SDK accurately described what was in dart_style.\r\n\r\nA few years ago, we changed to rolling into the SDK first. That lets us validate dart_style inside google3 before irrevocably publishing, which is a good thing. But it has an unfortunate side effect. If you run `dart format --version`, it shows the *previous* version number of dart_style because the version number only gets bumped when we publish. This is really confusing if you\u0027re trying to debug the formatter in the SDK and it appears to be an older version than it actually is.\r\n\r\nTo fix that, I\u0027m tweaking the workflow slightly. When we begin working on a new version of the formatter, we bump the version number in the pubspec to, say, 3.4.5-wip. At that point, we immediately update the version number constant shown by `--version` to \"3.4.5\" (the version it *will* be). That way, when it gets rolled into the SDK, it prints the upcoming version number.\r\n\r\nWhen a version of dart_style is about to be published, we remove `-wip` from the pubspec but the constant printed by `--version` is already done.\r\n\r\nTo make this workflow a little less error-prone, I updated the grinder script to add tasks for starting a new patch, minor, and major version.\r\n\r\nI also updated the docs for the old task now that we use the workflow automation for publishing.\r\n\r\nCo-authored-by: Kevin Moore \u003ckevmoo@users.noreply.github.com\u003e\r\n"
    },
    {
      "commit": "67ba681144c31f8b28313c5ad1258b5072f7239a",
      "tree": "7792ef3dcf1b1a455d254658457dd72ad008725e",
      "parents": [
        "e9bd213c56193899445fc75e2844a3a10109f8ce"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Dec 16 15:34:10 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 16 15:34:10 2024 -0800"
      },
      "message": "Better debug diagnostics in the solver. (#1624)\n\nThe formatter supports a bunch of debug flags you can enable to see what the solver is doing as it works its magic. That output can be pretty verbose and chatty.\r\n\r\nWhen I added the Code intermediate representation, it got worse. Even more verbose, but less helpful because the Code tree doesn\u0027t really show you as much as just seeing the formatted output.\r\n\r\nThis improves the debug output a few ways:\r\n\r\n- Instead of showing the Code tree (which is almost never useful), show the formatted result of that. This is a little tricky because the normal way we lower a Code tree to an output string requires access to the original SourceCode being formatted (in order to support `// dart format off`). The Solver doesn\u0027t have that. So instead, there\u0027s a new little debug-only visitor to lower Code to a string that doesn\u0027t handle format on/off markers and selections. In practice, 99% of my time debugging the solver doesn\u0027t have to do with format on/off or selections, so that\u0027s fine.\r\n\r\n- Add support for showing when a potential solution is enqueued versus dequeued. Often, when trying to figure out why a given solution doesn\u0027t win, it\u0027s useful to make sure it actually ended up in the queue at all, so showing enqueued solutions does that.\r\n\r\n- Add support for showing solutions without the code. Showing the code for each solution can be pretty verbose. Often I just want to see the solution itself (the states it chose for each piece) and don\u0027t care about the code. So this lets you toggle that independently.\r\n\r\nThere are no user-facing changes in this PR."
    },
    {
      "commit": "e9bd213c56193899445fc75e2844a3a10109f8ce",
      "tree": "f8ed704febdc1568e1b653efda2f43725906dde3",
      "parents": [
        "7c4a960d06f066a3ee6b8b53dc12b56299ae2c5d"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Dec 12 15:47:05 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 12 15:47:05 2024 -0800"
      },
      "message": "Don\u0027t crash on doc comments inside local variable declarations. (#1623)\n\nFix #1621."
    },
    {
      "commit": "7c4a960d06f066a3ee6b8b53dc12b56299ae2c5d",
      "tree": "87e95070843d1cac239dee0687acba620f111fc8",
      "parents": [
        "47bcc07df86327e5d566189bc6ee5d49fac77e46"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Dec 10 13:07:22 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 10 13:07:22 2024 -0800"
      },
      "message": "Format `||` patterns like fallthrough cases in switch expressions. (#1620)\n\nSwitch statements allow multiple cases to share a body like:\r\n\r\n```dart\r\nswitch (obj) {\r\n  case pattern1:\r\n  case pattern2:\r\n    body;\r\n}\r\n```\r\n\r\nSwitch expressions don\u0027t support that, but `||` patterns are the idiomatic way to accomplish the same thing. Because of that, the formatter has some special formatting when the outermost pattern in a switch expression case is `||`:\r\n\r\n```dart\r\nx \u003d switch (obj) {\r\n  pattern1 ||\r\n  pattern2 \u003d\u003e\r\n    body,\r\n};\r\n```\r\n\r\nNote how the `pattern2` operand isn\u0027t indented.\r\n\r\nThis PR extends that special handling to allow the `\u003d\u003e` on the same line as the `\u003d\u003e` even if the pattern is a split `||` pattern, like:\r\n\r\n```dart\r\nx \u003d switch (obj) {\r\n  pattern1 ||\r\n  pattern2 \u003d\u003e body,\r\n};\r\n```\r\n\r\nAnd it prefers to split the `||` over the body when the body is block formatted:\r\n\r\n```dart\r\n// Prefer:\r\nx \u003d switch (obj) {\r\n  pattern1 ||\r\n  pattern2 \u003d\u003e function(argument),\r\n};\r\n\r\n// Over:\r\nx \u003d switch (obj) {\r\n  pattern1 || pattern2 \u003d\u003e function(\r\n    argument,\r\n  ),\r\n};\r\n```\r\n\r\nThis is one of those rules that\u0027s mostly a matter of taste, but I ran this on a large corpus and most of the diffs look better to me. Here are a few examples:\r\n\r\n```dart\r\n// Before:\r\n      typeName \u003d switch (targetType) {\r\n        DriftSqlType.int || DriftSqlType.bigInt || DriftSqlType.bool \u003d\u003e\r\n          \u0027INTEGER\u0027,\r\n        DriftSqlType.string \u003d\u003e \u0027CHAR\u0027,\r\n        DriftSqlType.double \u003d\u003e \u0027DOUBLE\u0027,\r\n        DriftSqlType.blob \u003d\u003e \u0027BINARY\u0027,\r\n        DriftSqlType.dateTime \u003d\u003e \u0027DATETIME\u0027,\r\n        DriftSqlType.any \u003d\u003e \u0027\u0027,\r\n        CustomSqlType() || DialectAwareSqlType() \u003d\u003e targetType.sqlTypeName(\r\n          context,\r\n        ),\r\n      };\r\n\r\n// After:\r\n      typeName \u003d switch (targetType) {\r\n        DriftSqlType.int ||\r\n        DriftSqlType.bigInt ||\r\n        DriftSqlType.bool \u003d\u003e \u0027INTEGER\u0027,\r\n        DriftSqlType.string \u003d\u003e \u0027CHAR\u0027,\r\n        DriftSqlType.double \u003d\u003e \u0027DOUBLE\u0027,\r\n        DriftSqlType.blob \u003d\u003e \u0027BINARY\u0027,\r\n        DriftSqlType.dateTime \u003d\u003e \u0027DATETIME\u0027,\r\n        DriftSqlType.any \u003d\u003e \u0027\u0027,\r\n        CustomSqlType() ||\r\n        DialectAwareSqlType() \u003d\u003e targetType.sqlTypeName(context),\r\n      };\r\n\r\n// Before:\r\n    return switch (side) {\r\n      AxisSide.right || AxisSide.left \u003d\u003e\r\n        titlesPadding.vertical + borderPadding.vertical,\r\n      AxisSide.top || AxisSide.bottom \u003d\u003e\r\n        titlesPadding.horizontal + borderPadding.horizontal,\r\n    };\r\n\r\n// After:\r\n    return switch (side) {\r\n      AxisSide.right ||\r\n      AxisSide.left \u003d\u003e titlesPadding.vertical + borderPadding.vertical,\r\n      AxisSide.top ||\r\n      AxisSide.bottom \u003d\u003e titlesPadding.horizontal + borderPadding.horizontal,\r\n    };\r\n\r\n// Before:\r\n    final defaultConstraints \u003d switch (side) {\r\n      ShadSheetSide.top || ShadSheetSide.bottom \u003d\u003e BoxConstraints(\r\n        minWidth: mSize.width,\r\n      ),\r\n      ShadSheetSide.left || ShadSheetSide.right \u003d\u003e BoxConstraints(\r\n        minHeight: mSize.height,\r\n      ),\r\n    };\r\n\r\n    final defaultConstraints \u003d switch (side) {\r\n      ShadSheetSide.top ||\r\n      ShadSheetSide.bottom \u003d\u003e BoxConstraints(minWidth: mSize.width),\r\n      ShadSheetSide.left ||\r\n      ShadSheetSide.right \u003d\u003e BoxConstraints(minHeight: mSize.height),\r\n    };\r\n```\r\n\r\nFix #1602."
    },
    {
      "commit": "47bcc07df86327e5d566189bc6ee5d49fac77e46",
      "tree": "322488a803fc5127619a734394e500b42fd42216",
      "parents": [
        "e12c007bb7a01c276b36271bcdd3ccdd340fe63e"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Dec 09 16:39:22 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 09 16:39:22 2024 -0800"
      },
      "message": "Add benchmark and regression test for #1521. (#1619)\n\nThe new style formats this about 200x faster than the old one. It\u0027s still kind of slow, but tolerable.\r\n\r\nFix #1521."
    },
    {
      "commit": "e12c007bb7a01c276b36271bcdd3ccdd340fe63e",
      "tree": "7ec298c4a3d5a3a06396703f7b1102716646741b",
      "parents": [
        "1198bf794ec1d6e2e9e18c99f03c2444cd0b981b"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Dec 09 13:50:36 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 09 13:50:36 2024 -0800"
      },
      "message": "Add regression test for #624. (#1618)\n\nThis is doing what users want in the new tall style. \\o/\r\n\r\nClose #624."
    },
    {
      "commit": "1198bf794ec1d6e2e9e18c99f03c2444cd0b981b",
      "tree": "d2f895fbd2bfce824af03ff407376f2d99ac42e4",
      "parents": [
        "04883d622ebc7f310c392b9d83a905f4178aad74"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Dec 06 17:28:13 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 17:28:13 2024 -0800"
      },
      "message": "Handle trailing commas in for-loop updaters. (#1616)\n\nFix #1354."
    },
    {
      "commit": "04883d622ebc7f310c392b9d83a905f4178aad74",
      "tree": "d0c5f35fd5e834da9c62a58f9cf5dea32cf6deca",
      "parents": [
        "e3aaaf27bcabefa6accaa80a5b3e9eef985b7548"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Dec 06 17:18:09 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 17:18:09 2024 -0800"
      },
      "message": "Better indentation for property access as binary operator operand. (#1615)\n\nBetter indentation for property access as binary operator operand.\r\n\r\nWhile I was at it, I figured out a more systematic way to hoist leading comments out from the subexpressions containing the token that the comments precede. That fixes this bug and also lets us get rid of many of the one-off places where we were manually hoisting comments out of some subexpressions.\r\n\r\nSurprisingly, even though this touches visitNode() which is a fairly hot method, it doesn\u0027t seem to measurably harm performance.\r\n"
    },
    {
      "commit": "e3aaaf27bcabefa6accaa80a5b3e9eef985b7548",
      "tree": "14b77ae5dfc8c4a8c147436646f08fb06fafd368",
      "parents": [
        "f270828c25ca44c271cb032690addc2562fa35ba"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Dec 06 17:03:28 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 17:03:28 2024 -0800"
      },
      "message": "Fix the name of a regression test directory. (#1614)\n\nIt was supposed to be rounded down to the nearest hundred. Oops."
    },
    {
      "commit": "f270828c25ca44c271cb032690addc2562fa35ba",
      "tree": "14b77ae5dfc8c4a8c147436646f08fb06fafd368",
      "parents": [
        "1208f9ea0a7d95da2bd747de4eeb829adb6bd725"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Dec 06 17:02:40 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 06 17:02:40 2024 -0800"
      },
      "message": "Handle comments and metadata before variables more gracefully. (#1612)\n\nHandle comments and metadata before variables more gracefully.\r\n\r\nComments and metadata before a declaration are always tricky because the formatter by default attaches comments to the innermost piece following the comment. So in:\r\n\r\n```dart\r\n// Comment\r\nint field;\r\n```\r\n\r\nWe want the comment attached to the Piece for the entire field declaration. But the formatter won\u0027t see the comment until it hits the `int` token and will end up attaching it to the piece for the type annotation which is embedded inside the field piece. That in turn means that the formatter will think there is a newline inside the type (because there is one between the comment and `int`) which then forces a split after the type annotation too:\r\n\r\n```dart\r\n// Comment\r\nint\r\nfield;\r\n```\r\n\r\nIn most places, this is handled by having the surrounding SequenceBuilder grab the comment before visiting the subsequent declaration. But that doesn\u0027t work when you have a comment after metadata:\r\n\r\n```dart\r\n@meta\r\n// Comment\r\nint field;\r\n```\r\n\r\nNow the comment isn\u0027t before the field declaration. It\u0027s stuck inside it. But we still want to hoist it out.\r\n\r\nThis PR fixes that for every place I could find: fields, functions, variables, and for-loop variables. The latter is particularly hard because for-in loops have some weird formatting already and it\u0027s also just a weird place for splits to occur.\r\n\r\nI wish I had a cleaner more systematic way of handling these but despite trying for most of today, I haven\u0027t been able to come up with a cleaner approach. This at least gets the formatter producing better output.\r\n\r\nFix #1604.\r\n"
    },
    {
      "commit": "1208f9ea0a7d95da2bd747de4eeb829adb6bd725",
      "tree": "27c6765e08b592bf1569c3c3e4eb743db3b5859d",
      "parents": [
        "c57d49cd4b02ab6fac3a57d5c85402489fcf946d"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Dec 05 17:48:03 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 05 17:48:03 2024 -0800"
      },
      "message": "Ensure comment formatting is idempotent. (#1610)\n\n* Ensure comment formatting is idempotent.\r\n\r\nIn some cases, a line comment can appear between two tokens that otherwise never split, like after \"if (\" and before the condition. That leads to some tricky edge case behavior. If you formatted:\r\n\r\n```dart\r\nif (\r\n  // Comment\r\n  condition) {\r\n  ;\r\n}\r\n```\r\n\r\nIt would see the newline before the comment and decide the comment was a \"leading comment\" which means it gets attached to the condition expression. Then the formatter would output it like:\r\n\r\n```dart\r\nif (// Comment\r\n  condition) {\r\n  ;\r\n}\r\n```\r\n\r\nThat\u0027s because leading comments don\u0027t write a newline before themselves. Then if you format that again, there\u0027s no newline before the `//`, so now it\u0027s a hanging comment. Hanging comments get a space before them, so you get:\r\n\r\n```dart\r\nif ( // Comment\r\n  condition) {\r\n  ;\r\n}\r\n```\r\n\r\nReally, leading comments (as the name implies) are intended to always begin a line. So this PR makes sure they do that.\r\n\r\nWhile I was at it, I modified the test runner to run the formatter twice on *every* test to ensure that everything is idempotent. That doesn\u0027t *prove* that the formatter will always produce idempotent output, but it at least gives us pretty good test coverage that it *does* behave idempotent-ly.\r\n\r\nIn practice, most normal looking code would never hit this edge case. You have to put a comment in an unusual spot where a split doesn\u0027t occur.\r\n\r\nThis still feels like a fairly brittle part of the formatter to me. Comments appearing between tokens that never split otherwise is handled on a pretty ad hoc basis (which is why some of the tests in this PR have weird indentation). I\u0027d like a cleaner more systematic solution, but I\u0027m not sure what that would look like.\r\n\r\nFix #1606.\r\n\r\n* Fix version number in CHANGELOG.\r\n\r\n* Update lib/src/back_end/code_writer.dart\r\n\r\nCo-authored-by: Nate Bosch \u003cnbosch@google.com\u003e\r\n\r\n* Apply review feedback.\r\n\r\n---------\r\n\r\nCo-authored-by: Nate Bosch \u003cnbosch@google.com\u003e"
    },
    {
      "commit": "c57d49cd4b02ab6fac3a57d5c85402489fcf946d",
      "tree": "8736244ae4090abbf4c61b0de4e2d75a8699f1a2",
      "parents": [
        "1de89eb3bd340315f9ff5f2afc319cc1d6131b8d"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Dec 02 16:38:23 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 02 16:38:23 2024 -0800"
      },
      "message": "Bump to publish 3.0.0. (#1609)\n\nAlso fixed the format-self call in the grinder script which was still\r\nusing the old CLI format."
    },
    {
      "commit": "1de89eb3bd340315f9ff5f2afc319cc1d6131b8d",
      "tree": "d60c0f0b5f867574b0a20e4674b640e8c7c181ff",
      "parents": [
        "a5f9e21973347423916e6fffa001b8289636607e"
      ],
      "author": {
        "name": "Sam Rawlins",
        "email": "srawlins@google.com",
        "time": "Mon Dec 02 15:20:51 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 02 15:20:51 2024 -0800"
      },
      "message": "Allow analyzer ^7.0.0 dep (#1608)\n\n"
    },
    {
      "commit": "a5f9e21973347423916e6fffa001b8289636607e",
      "tree": "b65410445fab705f26330808886ba6e931ac6dbf",
      "parents": [
        "f6d020e48cc531a0967c91fa88028c086fedfbf9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Dec 01 13:40:20 2024 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Dec 01 13:40:20 2024 +0000"
      },
      "message": "Bump dart-lang/setup-dart in the github-actions group (#1607)\n\nBumps the github-actions group with 1 update: [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart).\n\nUpdates `dart-lang/setup-dart` from 1.6.5 to 1.7.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/dart-lang/setup-dart/releases\"\u003edart-lang/setup-dart\u0027s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.7.0\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eInstall a Flutter SDK in the publish workflow allowing for publication of flutter packages.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md\"\u003edart-lang/setup-dart\u0027s changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.7.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eInstall flutter sdk in publishing step, allowing Flutter packages to be\npublished (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003e#68\u003c/a\u003e[])\u003c/p\u003e\n\u003cp\u003e\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003e#68\u003c/a\u003e: \u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003edart-lang/setup-dart#68\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.5\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix zip path handling on Windows 11 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003e#118\u003c/a\u003e[])\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003e#118\u003c/a\u003e: \u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003edart-lang/setup-dart#118\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.6.4\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRebuild JS code.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.3\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRoll \u003ccode\u003eundici\u003c/code\u003e dependency to address \u003ca href\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-m4v8-wqvr-p9f7\"\u003eCVE-2024-30260\u003c/a\u003e and \u003ca href\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-9qxr-qj54-h672\"\u003eCVE-2024-30261\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSwitch to running the workflow on \u003ccode\u003enode20`` from \u003c/code\u003enode16`. See also\n\u003ca href\u003d\"https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/\"\u003eTransitioning from Node 16 to Node 20\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated the google storage url for \u003ccode\u003emain\u003c/code\u003e channel releases.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEnable provisioning of the latest Dart SDK patch release by specifying just\nthe major and minor version (e.g. \u003ccode\u003e3.2\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.5.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eNo longer test the \u003ccode\u003esetup-dart\u003c/code\u003e action on pre-2.12 SDKs.\u003c/li\u003e\n\u003cli\u003eUpgrade JS interop code to use extension types\n(the new name for inline classes).\u003c/li\u003e\n\u003cli\u003eThe upcoming rename of the \u003ccode\u003ebe\u003c/code\u003e channel to \u003ccode\u003emain\u003c/code\u003e is now supported with\nforward compatibility that switches when the rename happens.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.5.0\u003c/h2\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/e630b99d28a3b71860378cafdc2a067c71107f94\"\u003e\u003ccode\u003ee630b99\u003c/code\u003e\u003c/a\u003e Fix link in CHANGELOG.md (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/144\"\u003e#144\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/cdcaf1297c175a0f0f1ec895cdbbee0479ddec2b\"\u003e\u003ccode\u003ecdcaf12\u003c/code\u003e\u003c/a\u003e Update changelog (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/143\"\u003e#143\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/c21802dc505e35765fa73ad4191bbe120ee94522\"\u003e\u003ccode\u003ec21802d\u003c/code\u003e\u003c/a\u003e Install a Flutter SDK in the publish workflow (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/141\"\u003e#141\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/f60b94591ab2d3da576c469969989fca99fabd3e\"\u003e\u003ccode\u003ef60b945\u003c/code\u003e\u003c/a\u003e Update publish.yml (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/142\"\u003e#142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/d0b01d2ac509deeb2d41d27918204416ba9b1947\"\u003e\u003ccode\u003ed0b01d2\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003e@âactions/core\u003c/code\u003e from 1.10.1 to 1.11.1 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/138\"\u003e#138\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/f6a6f58cab9dd4e0ba15826bd89d4558877fd25c\"\u003e\u003ccode\u003ef6a6f58\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003e@âactions/http-client\u003c/code\u003e from 2.2.1 to 2.2.3 (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/137\"\u003e#137\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/dart-lang/setup-dart/commit/e9a814f39d5452701455a47847735e0f482026c8\"\u003e\u003ccode\u003ee9a814f\u003c/code\u003e\u003c/a\u003e Bump dart-lang/setup-dart in the github-actions group (\u003ca href\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/136\"\u003e#136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href\u003d\"https://github.com/dart-lang/setup-dart/compare/0a8a0fc875eb934c15d08629302413c671d3f672...e630b99d28a3b71860378cafdc2a067c71107f94\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003ddart-lang/setup-dart\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d1.6.5\u0026new-version\u003d1.7.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s major version (unless you unignore this specific dependency\u0027s major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s minor version (unless you unignore this specific dependency\u0027s minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\u003c/details\u003e"
    },
    {
      "commit": "f6d020e48cc531a0967c91fa88028c086fedfbf9",
      "tree": "a413f56280c9ec1a3eb944d424950cffc4458ca5",
      "parents": [
        "6753ab40b3327c5cc4c9b1cd60c76e69f21ba494"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Nov 14 15:48:38 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 14 15:48:38 2024 -0800"
      },
      "message": "Remove an unused import. (#1601)\n\n"
    },
    {
      "commit": "6753ab40b3327c5cc4c9b1cd60c76e69f21ba494",
      "tree": "0eed2f5fea286893938097a3ff1894718ad6a9f6",
      "parents": [
        "02957e61b74a862051fb5e3fcce88ca66bab973b"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Nov 14 15:06:06 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 14 15:06:06 2024 -0800"
      },
      "message": "Make \"// @dart\u003d\" version comments affect the applied style. (#1600)\n\nThe formatter uses an incoming language version to control how the\r\nformatted code is parsed. The langauge version is also used to\r\ndetermine whether you get the short or tall style.\r\n\r\nPrior to this PR, a \"// @dart\u003d\" version comment in the formatted code\r\nwould affect the language version the code is parsed at. But it wouldn\u0027t\r\nuse that comment to determine whether you get the short or tall style.\r\nThis fixes that.\r\n\r\nFix #1599."
    },
    {
      "commit": "02957e61b74a862051fb5e3fcce88ca66bab973b",
      "tree": "5c93ba10163d951c7f6f2603cc0ea2411ab8da57",
      "parents": [
        "ecfc0cb22157fcac7caaa814f770303f4d9a8eb3"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Wed Nov 13 11:24:03 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 13 11:24:03 2024 -0800"
      },
      "message": "Use FastHash on Piece. (#1598)\n\nThis mixin overrides the default identity-based hash code with a stored integer hash code. That made a big difference in the old formatter\u0027s performance but for most of the times I tried it with the new one, it didn\u0027t help. But it seems that the new formatter is storing pieces in maps enough for it to make a difference.\r\n\r\nOn the microbenchmarks:\r\n\r\n```\r\nBenchmark (tall)                fastest   median  slowest  average  baseline\r\n-----------------------------  --------  -------  -------  -------  --------\r\nblock                             0.057    0.061    0.121    0.065    107.0%\r\nchain                             0.524    0.539    0.579    0.541    117.1%\r\ncollection                        0.247    0.256    0.273    0.257    107.1%\r\ncollection_large                  1.539    1.559    1.621    1.562    106.0%\r\nconditional                       0.060    0.061    0.079    0.062    107.0%\r\ncurry                             0.455    0.462    0.477    0.463    118.0%\r\nffi                               0.143    0.149    0.159    0.148    105.4%\r\nflutter_popup_menu_test           0.503    0.514    0.541    0.516    115.0%\r\nflutter_scrollbar_test            0.399    0.406    0.450    0.410    113.2%\r\nfunction_call                     1.658    1.709    1.849    1.716    106.0%\r\ninfix_large                       0.552    0.567    0.600    0.570    108.9%\r\ninfix_small                       0.145    0.148    0.162    0.149    105.3%\r\ninterpolation                     0.087    0.089    0.101    0.090    102.5%\r\ninterpolation_1516                0.070    0.071    0.085    0.071    100.7%\r\nlarge                             3.263    3.280    3.573    3.298    109.0%\r\ntop_level                         0.127    0.128    0.147    0.130    107.9%\r\n```\r\n\r\nAnd when formatting the Flutter repo:\r\n\r\n```\r\nCurrent formatter    10.138 \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\r\nOptimized             9.490 \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\r\nOld formatter         4.812 \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\r\nThe current formatter is 52.54% slower than the old formatter.\r\nThe optimized is 6.83% faster than the current formatter.\r\nThe optimized is 49.29% slower than the old formatter.\r\nThe optimization gets the formatter 12.17% of the way to the old one.\r\n```\r\n\r\nThat\u0027s pretty good for a one line change.\r\n\r\nAlso, this makes debugging the new formatter easier because now each Piece has a different debug string. Trying to figure out which of a hundred `Infix` pieces is the one you want gets pretty tedious..."
    },
    {
      "commit": "ecfc0cb22157fcac7caaa814f770303f4d9a8eb3",
      "tree": "77aa6b7bd3640d6f3c9277bc27ebf77b849a4a78",
      "parents": [
        "e62313b8f118da69da8beca2b193b87be91cbbb3"
      ],
      "author": {
        "name": "Sam Rawlins",
        "email": "srawlins@google.com",
        "time": "Mon Nov 11 10:33:34 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 11 10:33:34 2024 -0800"
      },
      "message": "Support a list of include paths in analysis options (#1594)\n\nSupport a list of include paths in analysis options\r\n\r\nThe implementation is fairly simple. If the include value in an analysis options file is a List, then iteratively merge included options files.\r\n\r\nFixes #1591.\r\n"
    },
    {
      "commit": "e62313b8f118da69da8beca2b193b87be91cbbb3",
      "tree": "e1c4f53fa1ab853e54b9ef27e135d824b7da3406",
      "parents": [
        "4e6f44d8812e3cf541c9534df33ce41ee9678651"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Nov 05 11:26:08 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 05 11:26:08 2024 -0800"
      },
      "message": "Simplify ChainPiece. (#1595)\n\nWe were still passing in allowNewlines to _formatCall() even though that\r\nparameter was no longer used once Piece got the allowChildInState() API.\r\nSo I removed that.\r\n\r\nThen I noticed that the switch in _formatCall() could be more cleanly\r\nhandled by having the cases in format() calculate separate directly. So\r\nI did that.\r\n\r\nThat left _formatCall() not actually doing anything useful, so I got rid\r\nof it.\r\n\r\nThere are no behavioral change, it\u0027s just a code clean-up."
    },
    {
      "commit": "4e6f44d8812e3cf541c9534df33ce41ee9678651",
      "tree": "6af9124ede190af3bc3d238f597cf18c7611f058",
      "parents": [
        "cab69766f4c0d47e6eabdc42cfe1dd58142dceac"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Nov 01 13:51:09 2024 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 01 13:51:09 2024 +0000"
      },
      "message": "Bump actions/checkout from 4.2.0 to 4.2.2 in the github-actions group (#1593)\n\nBumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).\n\nUpdates `actions/checkout` from 4.2.0 to 4.2.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/actions/checkout/releases\"\u003eactions/checkout\u0027s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev4.2.2\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eurl-helper.ts\u003c/code\u003e now leverages well-known environment variables by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@âjww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1941\"\u003eactions/checkout#1941\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eExpand unit test coverage for \u003ccode\u003eisGhes\u003c/code\u003e by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@âjww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1946\"\u003eactions/checkout#1946\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v4.2.1...v4.2.2\"\u003ehttps://github.com/actions/checkout/compare/v4.2.1...v4.2.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev4.2.1\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck out other refs/* by commit if provided, fall back to ref by \u003ca href\u003d\"https://github.com/orhantoy\"\u003e\u003ccode\u003e@âorhantoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1924\"\u003eactions/checkout#1924\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/Jcambass\"\u003e\u003ccode\u003e@âJcambass\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1919\"\u003eactions/checkout#1919\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href\u003d\"https://github.com/actions/checkout/compare/v4.2.0...v4.2.1\"\u003ehttps://github.com/actions/checkout/compare/v4.2.0...v4.2.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href\u003d\"https://github.com/actions/checkout/blob/main/CHANGELOG.md\"\u003eactions/checkout\u0027s changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eChangelog\u003c/h1\u003e\n\u003ch2\u003ev4.2.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eurl-helper.ts\u003c/code\u003e now leverages well-known environment variables by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@âjww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1941\"\u003eactions/checkout#1941\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eExpand unit test coverage for \u003ccode\u003eisGhes\u003c/code\u003e by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@âjww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1946\"\u003eactions/checkout#1946\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.2.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck out other refs/* by commit if provided, fall back to ref by \u003ca href\u003d\"https://github.com/orhantoy\"\u003e\u003ccode\u003e@âorhantoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1924\"\u003eactions/checkout#1924\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.2.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd Ref and Commit outputs by \u003ca href\u003d\"https://github.com/lucacome\"\u003e\u003ccode\u003e@âlucacome\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1180\"\u003eactions/checkout#1180\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDependency updates by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@âdependabot\u003c/code\u003e\u003c/a\u003e- \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1777\"\u003eactions/checkout#1777\u003c/a\u003e, \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1872\"\u003eactions/checkout#1872\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.7\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eBump the minor-npm-dependencies group across 1 directory with 4 updates by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@âdependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1739\"\u003eactions/checkout#1739\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/checkout from 3 to 4 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@âdependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1697\"\u003eactions/checkout#1697\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck out other refs/* by commit by \u003ca href\u003d\"https://github.com/orhantoy\"\u003e\u003ccode\u003e@âorhantoy\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1774\"\u003eactions/checkout#1774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePin actions/checkout\u0027s own workflows to a known, good, stable version. by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@âjww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1776\"\u003eactions/checkout#1776\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.6\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck platform to set archive extension appropriately by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@âcory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1732\"\u003eactions/checkout#1732\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.5\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate NPM dependencies by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@âcory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1703\"\u003eactions/checkout#1703\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump github/codeql-action from 2 to 3 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@âdependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1694\"\u003eactions/checkout#1694\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/setup-node from 1 to 4 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@âdependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1696\"\u003eactions/checkout#1696\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/upload-artifact from 2 to 4 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@âdependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1695\"\u003eactions/checkout#1695\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eREADME: Suggest \u003ccode\u003euser.email\u003c/code\u003e to be \u003ccode\u003e41898282+github-actions[bot]@users.noreply.github.com\u003c/code\u003e by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@âcory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1707\"\u003eactions/checkout#1707\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.4\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDisable \u003ccode\u003eextensions.worktreeConfig\u003c/code\u003e when disabling \u003ccode\u003esparse-checkout\u003c/code\u003e by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@âjww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1692\"\u003eactions/checkout#1692\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd dependabot config by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@âcory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1688\"\u003eactions/checkout#1688\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump the minor-actions-dependencies group with 2 updates by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@âdependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1693\"\u003eactions/checkout#1693\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump word-wrap from 1.2.3 to 1.2.5 by \u003ca href\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@âdependabot\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1643\"\u003eactions/checkout#1643\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.3\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCheck git version before attempting to disable \u003ccode\u003esparse-checkout\u003c/code\u003e by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@âjww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1656\"\u003eactions/checkout#1656\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd SSH user parameter by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@âcory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1685\"\u003eactions/checkout#1685\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate \u003ccode\u003eactions/checkout\u003c/code\u003e version in \u003ccode\u003eupdate-main-version.yml\u003c/code\u003e by \u003ca href\u003d\"https://github.com/jww3\"\u003e\u003ccode\u003e@âjww3\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1650\"\u003eactions/checkout#1650\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix: Disable sparse checkout whenever \u003ccode\u003esparse-checkout\u003c/code\u003e option is not present \u003ca href\u003d\"https://github.com/dscho\"\u003e\u003ccode\u003e@âdscho\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1598\"\u003eactions/checkout#1598\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCorrect link to GitHub Docs by \u003ca href\u003d\"https://github.com/peterbe\"\u003e\u003ccode\u003e@âpeterbe\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1511\"\u003eactions/checkout#1511\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLink to release page from what\u0027s new section by \u003ca href\u003d\"https://github.com/cory-miller\"\u003e\u003ccode\u003e@âcory-miller\u003c/code\u003e\u003c/a\u003e in \u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1514\"\u003eactions/checkout#1514\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev4.1.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://redirect.github.com/actions/checkout/pull/1396\"\u003eAdd support for partial checkout filters\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/11bd71901bbe5b1630ceea73d27597364c9af683\"\u003e\u003ccode\u003e11bd719\u003c/code\u003e\u003c/a\u003e Prepare 4.2.2 Release (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/1953\"\u003e#1953\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/e3d2460bbb42d7710191569f88069044cfb9d8cf\"\u003e\u003ccode\u003ee3d2460\u003c/code\u003e\u003c/a\u003e Expand unit test coverage (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/1946\"\u003e#1946\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/163217dfcd28294438ea1c1c149cfaf66eec283e\"\u003e\u003ccode\u003e163217d\u003c/code\u003e\u003c/a\u003e \u003ccode\u003eurl-helper.ts\u003c/code\u003e now leverages well-known environment variables. (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/1941\"\u003e#1941\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871\"\u003e\u003ccode\u003eeef6144\u003c/code\u003e\u003c/a\u003e Prepare 4.2.1 release (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/1925\"\u003e#1925\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/6b42224f41ee5dfe5395e27c8b2746f1f9955030\"\u003e\u003ccode\u003e6b42224\u003c/code\u003e\u003c/a\u003e Add workflow file for publishing releases to immutable action package (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/1919\"\u003e#1919\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/actions/checkout/commit/de5a000abf73b6f4965bd1bcdf8f8d94a56ea815\"\u003e\u003ccode\u003ede5a000\u003c/code\u003e\u003c/a\u003e Check out other refs/* by commit if provided, fall back to ref (\u003ca href\u003d\"https://redirect.github.com/actions/checkout/issues/1924\"\u003e#1924\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href\u003d\"https://github.com/actions/checkout/compare/d632683dd7b4114ad314bca15554477dd762a938...11bd71901bbe5b1630ceea73d27597364c9af683\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dactions/checkout\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d4.2.0\u0026new-version\u003d4.2.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s major version (unless you unignore this specific dependency\u0027s major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency\u0027s minor version (unless you unignore this specific dependency\u0027s minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\u003c/details\u003e"
    },
    {
      "commit": "cab69766f4c0d47e6eabdc42cfe1dd58142dceac",
      "tree": "255af06bedb5f73f51c86916eb3611a3e2584097",
      "parents": [
        "cf0954a11ef399cbde47df99899d30fa8c7baf3a"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Nov 01 06:44:13 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 01 06:44:13 2024 -0700"
      },
      "message": "Clean up README and TODO comments. (#1592)\n\nClean up README and TODO comments.\r\n\r\nUpdated the example in the README to one that uses the new style. I\r\nalso took the opportunity to find a more interesting example and\r\ngenerally rewrote things based on how the formatter is used today.\r\n\r\nWhen we were in the middle of the rewrite, I used \"TODO(tall)\" and\r\n\"TODO(perf)\" comments to track things I wanted to look into before I\r\nconsidered the rewrite \"done\". Now that the rewrite is basically good\r\nenough, I went through those. If I think the TODO is no longer worth\r\ndoing at all, I just deleted it. Otherwise, I turned it into a general\r\n\"TODO(rnystrom)\" for us to keep in mind at some unspecified time.\r\n"
    },
    {
      "commit": "cf0954a11ef399cbde47df99899d30fa8c7baf3a",
      "tree": "7affb9548659722e0c521b3345be09359dd0ba68",
      "parents": [
        "dc13a2f8e667825980cbc1a06ed645620f9bed70"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Oct 31 13:46:42 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 31 13:46:42 2024 -0700"
      },
      "message": "Change firstWhereOrNull() to nonNulls.firstOrNull. (#1590)\n\n"
    },
    {
      "commit": "dc13a2f8e667825980cbc1a06ed645620f9bed70",
      "tree": "bf21a8a606bf45df31f5e7ef7f08333a8b7859f4",
      "parents": [
        "0f448ba13b9540303030ecb78b035852848a2cb6"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Oct 24 11:23:43 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 24 11:23:43 2024 -0700"
      },
      "message": "Don\u0027t crash on a doc comment before a pattern variable statement. (#1589)\n\nThis is a funny corner of the analyzer AST API where a\r\nPatternVariableDeclarationStatement wraps an inner\r\nPatternVariableDeclaration. The statement class isn\u0027t itself an\r\nAnnotatedNode so doesn\u0027t get caught by the first couple of cases. But\r\nits beginToken comes from the inner PatternVariableDeclaration, which\r\n*is* an AnnotatedNode, so we need to recurse into that.\r\n\r\nFix #1586."
    },
    {
      "commit": "0f448ba13b9540303030ecb78b035852848a2cb6",
      "tree": "c17256909dbe7d6fb10608cffbd15d9144314cf7",
      "parents": [
        "9a8a34241acfb5656e3a85948a73d843f0ab26a9"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Oct 24 11:23:20 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 24 11:23:20 2024 -0700"
      },
      "message": "Don\u0027t move a comment between a modifier and return type. (#1588)\n\nWhen formatting a function, method, getter, or function type, the\r\nformatter hoists any leading comments out so that they don\u0027t force a\r\nsplit between the return type and body.\r\n\r\nHowever, it failed to take into account modifiers that may occur before\r\nthe return type but after the comment. If that happened, the comment\r\nwould get moved before the modifiers.\r\n\r\nFix #1585."
    },
    {
      "commit": "9a8a34241acfb5656e3a85948a73d843f0ab26a9",
      "tree": "8a44e45eda29cf7953c1a3ad3014c4968d5ee6ff",
      "parents": [
        "89577e750840c3655e5703004fb774d6564e02b9"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Oct 24 11:22:47 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 24 11:22:47 2024 -0700"
      },
      "message": "Don\u0027t drop comments in collection literals with preserved newlines. (#1587)\n\nA line comment in a collection literal triggers special formatting\r\nwhere we allow multiple elements in a single line, like:\r\n\r\n```\r\nlist \u003d [\r\n  // Comment.\r\n  1, 2, 3\r\n  4, 5,\r\n  6,\r\n];\r\n```\r\n\r\nThe formatter models that by having a DelimitedListBuilder for the\r\nentire collection literal. Then the elements that should be packed onto\r\na single line are formatted using a separate DelimitedListBuilder for\r\neach line.\r\n\r\nIn the very rare case where you have a comment after the last element\r\non a line but *before* the subsequent comma, the comment would get\r\ndropped. This is because the comment was sitting in the inner\r\nDelimitedListBuilder for the line waiting to be put somewhere, but we\r\nthen discard that builder to start a new line or when the whole list is\r\ndone.\r\n\r\nThis fixes that. Whenever we\u0027re done with a line, we hoist any remaining\r\ncomments up to the outer DelimitedListBuilder. That way the comment gets\r\nput after the comma at the end of the line.\r\n\r\nAlso bump the min SDK constraint to 3.4.0. I don\u0027t think dart_style\r\nworks with an older version because of analyzer\u0027s SDK constraints.\r\n\r\nFix #1584."
    },
    {
      "commit": "89577e750840c3655e5703004fb774d6564e02b9",
      "tree": "a1b07af07cb5798c0b63b36fa7e44cfea68cab54",
      "parents": [
        "63caad33c75777efa6c3dd75c7b7b8612b1733d1"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Oct 15 15:35:22 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 15 15:35:22 2024 -0700"
      },
      "message": "Allow a factory constructor with metadata before it to split. (#1580)\n\nPrior to this PR, if there was metadata before a constructor, it would\r\nbe attached to the \"header\" piece of the constructor -- the leading\r\nkeywords and name -- instead of the entire constructor piece.\r\n\r\nThat in turn meant that the newline after the metadata would lead the\r\nformatter to think a split had occurred inside the header itself,\r\ninstead of before the entire constructor. That would in turn confuse\r\nthe solver and it ended up trying to disallow splitting anywhere in the\r\nconstructor, even if that led to an overflowing line.\r\n\r\nThis fixes that so that the metadata is attached to the entire\r\nconstructor piece, not just the nested header part."
    },
    {
      "commit": "63caad33c75777efa6c3dd75c7b7b8612b1733d1",
      "tree": "55be0fc33cae04d86159ceeb3ff7981dd5bbe437",
      "parents": [
        "154537e27ce16452e2293d7017db6b269d4e4f6a"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Oct 14 17:57:49 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 14 17:57:49 2024 -0700"
      },
      "message": "Don\u0027t split return type if there is a comment after function metadata. (#1579)\n\nThis situation rarely occurs in practice, since users typically put the\r\ncomment before the metadata too (which is why we never noticed this bug\r\nuntil now).\r\n\r\nBut if it does occur, it\u0027s definitely wrong to force the return type to\r\nsplit unnecessarily."
    },
    {
      "commit": "154537e27ce16452e2293d7017db6b269d4e4f6a",
      "tree": "2f91b257080e244da02e47102855f314bbb2cb8f",
      "parents": [
        "7d4acb8ebc5bc991559bad659b5fbcc6d723888c"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Oct 14 14:50:06 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 14 14:50:06 2024 -0700"
      },
      "message": "Ship the \"tall-style\" experiment. (#1578)\n\nShip the \"tall-style\" experiment.\r\n\r\nThis PR does a few things:\r\n\r\n- Remove the \"tall-style\" experiment flag and treat it as always enabled.\r\n\r\n- Use language version instead of the experiment flag to determine which style you get. If the version is 3.7 or higher, you get the tall style. Otherwise, you get the short style.\r\n\r\n- Clean up the CHANGELOG.md and README.md a bit. I\u0027ll probably do some more copy editing on them before this gets published, but I wanted to get things roughly in order.\r\n\r\nCo-authored-by: Nate Bosch \u003cnbosch@google.com\u003e\r\n"
    },
    {
      "commit": "7d4acb8ebc5bc991559bad659b5fbcc6d723888c",
      "tree": "f9b3f9e757f3312a278c7b6d778cbc07b0738c7d",
      "parents": [
        "f4083506e4fed27964a772995ef4758819b833da"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Thu Oct 10 14:41:09 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 10 14:41:09 2024 -0700"
      },
      "message": "Rename \"--line-length\" option to \"--page-width\". (#1577)\n\nRename \"--line-length\" option to \"--page-width\".\r\n\r\nThe formatter has always been inconsistent about how to refer to the\r\nlimit that it tries to fit code in. The option name (which is older\r\nthan when I started working on the formatter) is \"--line-length\". But\r\nthe public API and all of the internal code uses \"page width\".\r\n\r\nThis renames that option to \"--page-width\". The old name is still\r\nsupported (but hidden in help) for backwards compatibility.\r\n\r\nIn practice, this option isn\u0027t used often, so this likely won\u0027t affect\r\nmany users.\r\n\r\nCo-authored-by: Nate Bosch \u003cnbosch@google.com\u003e\r\n"
    },
    {
      "commit": "f4083506e4fed27964a772995ef4758819b833da",
      "tree": "0b68671e1cc683caae09aa5304e64a0e7f5ce722",
      "parents": [
        "618883f734f8af5df2a0e7ae47dec970fff016f8"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Tue Oct 08 16:38:38 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 08 16:38:38 2024 -0700"
      },
      "message": "Better formatting for long type parameter bounds. (#1576)\n\nBetter formatting for long type parameter bounds.\r\n\r\nThe tall style was already doing a better job on #1568 than the old\r\nshort style does. (I don\u0027t know why it leaves an overly long line there.\r\nIt seems like a bug but perhaps a nasty subtle one in the solver.)\r\n\r\nBut it still didn\u0027t allow splitting before `extends` in a bound which\r\ncould leave long lines in cases where the type parameter and bound name\r\nare both quite long. Rare, but we may as well do a better job.\r\n\r\nSo this introduces a new piece that allows splitting before `extends`\r\nif needed.\r\n\r\nFix #1568.\r\n"
    },
    {
      "commit": "618883f734f8af5df2a0e7ae47dec970fff016f8",
      "tree": "b6d67fa2ce6d1ebadeee9bcedbaf531c75c474e4",
      "parents": [
        "9c17d3b2ad08a5f86be2b45216b16c71aca24f38"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Oct 07 18:22:13 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 07 18:22:13 2024 -0700"
      },
      "message": "Use the latest language version if we can\u0027t find a package. (#1573)\n\nUse the latest language version if we can\u0027t find a package.\r\n\r\nIn the new tall-style behavior where we look for a surrounding package\r\nconfig to infer the language version of each file, we have to decide\r\nwhat to do when that look-up process fails (either because there is no\r\npackage config, or it\u0027s malformed).\r\n\r\nInitially, I had it error out on that file. That\u0027s consistent with the\r\nlibrary API where the formatter *requires* a language version before it\r\nwill do anything.\r\n\r\nBut it\u0027s not consistent with the language spec and our other tools. For\r\nthem, if there is no valid surrounding package config, the file should\r\nbe treated as the latest language version.\r\n\r\nThis PR does that.\r\n\r\nIt also fixes the catastrophic UX that the current code has which is\r\nthat when a file can\u0027t have its language version inferred... it is\r\nsilently skipped without telling the user anything. Oops. Now it just\r\nformats the file as expected."
    },
    {
      "commit": "9c17d3b2ad08a5f86be2b45216b16c71aca24f38",
      "tree": "0b77754743767b9d62a2d4f0cbcb7916a2d66bab",
      "parents": [
        "fb00aab5558c807525f2ec134bd67a5f89e31873"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Mon Oct 07 15:56:15 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 07 15:56:15 2024 -0700"
      },
      "message": "Allow configuring project-wide page width using a surrounding analysis_options.yaml file (#1571)\n\nWhen using the dart format CLI (and not the library API), if the user doesn\u0027t specify a page width using --line-length, then the formatter will walk the directories surrounding each formatted file looking for an analysis_options.yaml file. If one is found, then it looks for a configured page width like:\r\n\r\n```\r\nformatter:\r\n  page_width: 123\r\n```\r\n\r\nIf found, then the file is formatted at that page width. If any sort of failure occurs, the default page width is used instead.\r\n\r\nThis is hidden behind the \"tall-style\" experiment flag and the intent is to ship this when the rest of the new tall style ships.\r\n\r\nThis is a fairly large change. To try to make it easier to review, I broke it into a series of hopefully more digestible commits. You might want to review those separately.\r\n\r\nFix #833."
    },
    {
      "commit": "fb00aab5558c807525f2ec134bd67a5f89e31873",
      "tree": "6cad3e9ebb23a3d2bd96b6395879479dbd2ff319",
      "parents": [
        "a5ec37d3563f9c77e932f5f32f67496ab841a5f5"
      ],
      "author": {
        "name": "Bob Nystrom",
        "email": "rnystrom@google.com",
        "time": "Fri Oct 04 18:44:47 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 04 18:44:47 2024 -0700"
      },
      "message": "Allow a comment in code to explicitly configure the page width. (#1574)\n\nAllow a comment in code to explicitly configure the page width.\r\n\r\nIf the code being formatted begins with a comment like:\r\n\r\n```\r\n// dart format width\u003d123\r\n```\r\n\r\nThen the code is formatted at that width instead of the default width.\r\n\r\nThe intent is that tools that generate code and then format it will put\r\nthis comment in the generated code. That way, the tool doesn\u0027t have to\r\nhandle the complex logic to find a surrounding analysis_options.yaml\r\nfile and get the user\u0027s project-wide page width configuration.\r\n\r\nEnd users may also want to use this comment in rare cases. For example,\r\nmaybe they have a library that contains a large value of data that looks\r\nbetter as a big wide table but they don\u0027t want their entire project to\r\nhave a wider page width.\r\n"
    }
  ],
  "next": "a5ec37d3563f9c77e932f5f32f67496ab841a5f5"
}
