)]}'
{
  "commit": "676a40ec54c1a7779b9058d041d9670eee6107c9",
  "tree": "ddc152214f0c8c07c8ecb9355b8568d9cb7f4f2a",
  "parents": [
    "8124814de564db8a026c66ac4c0c378df97a432b"
  ],
  "author": {
    "name": "Kallen Tu",
    "email": "kallentu@google.com",
    "time": "Mon Jul 21 11:45:32 2025 -0700"
  },
  "committer": {
    "name": "Commit Queue",
    "email": "dart-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Mon Jul 21 11:45:32 2025 -0700"
  },
  "message": "[parser] Dot shorthands: Recover as a DotShorthandPropertyAccess rather than a PrefixedIdentifier.\n\nThis change mainly has side effects for code completion, making sure we\u0027re suggesting the right members. When the user writes something like `E e \u003d .^` where `^` is the cursor, they\u0027re most likely intending to write a dot shorthand.\n\nSo this parser recovery change ensures that we recover as a dot shorthand node and not as a prefixed identifier (missing it\u0027s target) in the analyzer. We don\u0027t need special casing in the code completion pass to handle dot shorthands in the prefixed identifier visitor now.\n\nThe CFE should have no notable changes, but I added a few tests since it uncovered some crashing behavior. The duplicate errors have always been the case even prior to this change.\n\nBug: https://github.com/dart-lang/sdk/issues/59836\nChange-Id: I6c4a9f2c8cc376e4dedd715af76967da471aa681\nReviewed-on: https://dart-review.googlesource.com/c/sdk/+/439140\nCommit-Queue: Kallen Tu \u003ckallentu@google.com\u003e\nReviewed-by: Brian Wilkerson \u003cbrianwilkerson@google.com\u003e\nReviewed-by: Paul Berry \u003cpaulberry@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "adcb66a21b8638dcca560482eb3805b296208d0d",
      "old_mode": 33188,
      "old_path": "pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart",
      "new_id": "87baef0b7faa081c91480530646651b5696377bb",
      "new_mode": 33188,
      "new_path": "pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart"
    },
    {
      "type": "modify",
      "old_id": "bc2db3065b3b36361f3045415af8228d6d35cc01",
      "old_mode": 33188,
      "old_path": "pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart",
      "new_id": "ae54fd163183eb702a467ac91d27e461603d4c49",
      "new_mode": 33188,
      "new_path": "pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart"
    },
    {
      "type": "modify",
      "old_id": "f24b4edfe189c332329af6cee06a018eec65848b",
      "old_mode": 33188,
      "old_path": "pkg/analysis_server/test/services/completion/dart/location/dot_shorthand_property_access_test.dart",
      "new_id": "54d72d926810b02aa75dea814a9a1d1e9580a7c2",
      "new_mode": 33188,
      "new_path": "pkg/analysis_server/test/services/completion/dart/location/dot_shorthand_property_access_test.dart"
    },
    {
      "type": "modify",
      "old_id": "fbe448762c8ce59b53e37cbd711aece6309a7212",
      "old_mode": 33188,
      "old_path": "pkg/analyzer/test/generated/recovery_parser_test.dart",
      "new_id": "083ae282b8a38da77b051830e2b94dd553672a33",
      "new_mode": 33188,
      "new_path": "pkg/analyzer/test/generated/recovery_parser_test.dart"
    },
    {
      "type": "modify",
      "old_id": "aeb464f39bc81d61e67135d6c673929384417cad",
      "old_mode": 33188,
      "old_path": "pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart",
      "new_id": "1fbd9a5059c4059bbc87bb966d52cb559cfad8bc",
      "new_mode": 33188,
      "new_path": "pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart"
    },
    {
      "type": "modify",
      "old_id": "98536c2ed636402de5f6bb60d731502db16a0906",
      "old_mode": 33188,
      "old_path": "pkg/front_end/lib/src/kernel/body_builder.dart",
      "new_id": "6d42e234435f185138e99eb48306a8ff0fd82690",
      "new_mode": 33188,
      "new_path": "pkg/front_end/lib/src/kernel/body_builder.dart"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "61e2310672bdf603279a8c525eedc774043beb0c",
      "new_mode": 33188,
      "new_path": "pkg/front_end/parser_testcases/dot_shorthands/no_identifier_no_context_recovery.dart"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e5ea2256509e28dae679ff00e86698285d325660",
      "new_mode": 33188,
      "new_path": "pkg/front_end/parser_testcases/dot_shorthands/no_identifier_no_context_recovery.dart.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7ff454f0ff870b548cfe9ef1f95b8065fecc6170",
      "new_mode": 33188,
      "new_path": "pkg/front_end/parser_testcases/dot_shorthands/no_identifier_no_context_recovery.dart.intertwined.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ff2b2cc42633f399d745ac40924bda42a31daaab",
      "new_mode": 33188,
      "new_path": "pkg/front_end/parser_testcases/dot_shorthands/no_identifier_no_context_recovery.dart.parser.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7c737288aec183b9e7ea038809b23b6cbabc7c56",
      "new_mode": 33188,
      "new_path": "pkg/front_end/parser_testcases/dot_shorthands/no_identifier_no_context_recovery.dart.scanner.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "61e2310672bdf603279a8c525eedc774043beb0c",
      "new_mode": 33188,
      "new_path": "pkg/front_end/parser_testcases/dot_shorthands/no_identifier_recovery.dart"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5d2897b77ccdd51e86160e276ae3f1bafa0a1745",
      "new_mode": 33188,
      "new_path": "pkg/front_end/parser_testcases/dot_shorthands/no_identifier_recovery.dart.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7ff454f0ff870b548cfe9ef1f95b8065fecc6170",
      "new_mode": 33188,
      "new_path": "pkg/front_end/parser_testcases/dot_shorthands/no_identifier_recovery.dart.intertwined.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ff2b2cc42633f399d745ac40924bda42a31daaab",
      "new_mode": 33188,
      "new_path": "pkg/front_end/parser_testcases/dot_shorthands/no_identifier_recovery.dart.parser.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7c737288aec183b9e7ea038809b23b6cbabc7c56",
      "new_mode": 33188,
      "new_path": "pkg/front_end/parser_testcases/dot_shorthands/no_identifier_recovery.dart.scanner.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "55e332d51ee79de5730003de5d26221b1c0398f0",
      "new_mode": 33188,
      "new_path": "pkg/front_end/testcases/dot_shorthands/no_identifier_recovery.dart"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4b8b67ed883328ed75af5927dc9fbc1013eccb51",
      "new_mode": 33188,
      "new_path": "pkg/front_end/testcases/dot_shorthands/no_identifier_recovery.dart.strong.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4b8b67ed883328ed75af5927dc9fbc1013eccb51",
      "new_mode": 33188,
      "new_path": "pkg/front_end/testcases/dot_shorthands/no_identifier_recovery.dart.strong.modular.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2615832b7df5ed914fbf6f5304a953821626d559",
      "new_mode": 33188,
      "new_path": "pkg/front_end/testcases/dot_shorthands/no_identifier_recovery.dart.strong.outline.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4b8b67ed883328ed75af5927dc9fbc1013eccb51",
      "new_mode": 33188,
      "new_path": "pkg/front_end/testcases/dot_shorthands/no_identifier_recovery.dart.strong.transformed.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "56757a701bf5cfd58c3d4b546d3444da4cf30711",
      "new_mode": 33188,
      "new_path": "pkg/front_end/testcases/dot_shorthands/no_identifier_recovery.dart.textual_outline.expect"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "56757a701bf5cfd58c3d4b546d3444da4cf30711",
      "new_mode": 33188,
      "new_path": "pkg/front_end/testcases/dot_shorthands/no_identifier_recovery.dart.textual_outline_modelled.expect"
    }
  ]
}
