)]}'
{
  "commit": "bce3eb8d4a4d88f10708aa23252896587932be02",
  "tree": "ecd5fe07e15204374a945136f946564d53985b0a",
  "parents": [
    "05be806c3ccaddfb8226d1995d729ed4d04f7203"
  ],
  "author": {
    "name": "Paul Berry",
    "email": "paulberry@google.com",
    "time": "Fri Oct 04 13:44:40 2024 +0000"
  },
  "committer": {
    "name": "dart-internal-monorepo",
    "email": "dart-internal-monorepo@dart-ci-internal.iam.gserviceaccount.com",
    "time": "Fri Oct 04 06:46:47 2024 -0700"
  },
  "message": "[flow analysis] Remove ExpressionInfo.after.\n\nPreviously, the base `ExpressionInfo` class contained four fields:\n\n- `type`: the type of the expression.\n\n- `ifTrue`: a flow model describing the state of the program after the\n  expression is evaluated, assuming the expression evaluates to\n  `true`.\n\n- `ifFalse`: a flow model describing the state of the program after\n  the expression is evaluated, assuming the expression evaluates to\n  `false`.\n\n- `after`: a flow model describing the state of the prorgam after the\n  expression is evaluated, making no assumptions about what value the\n  expression evaluates to.\n\nThe `after` field was largely redundant, since it tracked the same\ninformation as `FlowAnalysisImpl._current`. In fact, flow analysis\ncontained a substantial amount of code to copy from\n`ExpressionInfo.after` to `FlowAnalysisImpl._current`, or vice versa,\nin order to keep the two in sync.\n\nThe one exception was in `FlowAnalysisImpl.conditional_end`, which is\ncalled at the end of visiting a conditional expression (`e1 ? e2 :\ne3`): it joined the `after` flow models from `e2` and `e3` in order to\ndetermine the state of the program after the conditional expression\ncompletes. To preserve this behavior, a small amount of extra\naccounting logic had to be added to the handling of conditional\nexpressions, to keep track of these flow models. (`e2.after` is now\nstored in `_ConditionalContext.thenModel`, and `e3.after` comes from\nthe state of `_current` at the time of entry into\n`FlowAnalysisImpl.conditional_end`).\n\nChange-Id: I46e771f8b029550d43a5fe50366177f189a6a91d\nReviewed-on: https://dart-review.googlesource.com/c/sdk/+/388081\nCommit-Queue: Paul Berry \u003cpaulberry@google.com\u003e\nReviewed-by: Kallen Tu \u003ckallentu@google.com\u003e\n\nhttps://dart.googlesource.com/sdk/+/38c08f919d0e9c0cfabfcd04af797e091f0bbaac\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f0a7bab3d43f12f6fc560acb120f639296c0e5cf",
      "old_mode": 33188,
      "old_path": "DEPS",
      "new_id": "0939ec6c83159e6b5b20ad3ae0405f4663c6f68a",
      "new_mode": 33188,
      "new_path": "DEPS"
    },
    {
      "type": "modify",
      "old_id": "87c3f6209191a2eaba069300980c287d47546bec",
      "old_mode": 33188,
      "old_path": "commits.json",
      "new_id": "d03a7cba583f35a250047da527f4042dbf4bf526",
      "new_mode": 33188,
      "new_path": "commits.json"
    }
  ]
}
