[CFE] Fix crash on extension type with duplicate and no parent set

Change-Id: Iaac58e179a84bdd90c8a6d9973156520e4c2a5b3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/397360
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
diff --git a/pkg/front_end/lib/src/source/source_library_builder.dart b/pkg/front_end/lib/src/source/source_library_builder.dart
index 818bf69..8d1d162 100644
--- a/pkg/front_end/lib/src/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/source/source_library_builder.dart
@@ -1315,6 +1315,9 @@
           .build(coreLibrary, addMembersToLibrary: !declaration.isDuplicate);
       if (!declaration.isAugmenting && !declaration.isDuplicate) {
         library.addExtensionTypeDeclaration(extensionTypeDeclaration);
+      } else if (declaration.isDuplicate) {
+        // Set parent so an `enclosingLibrary` call won't crash.
+        extensionTypeDeclaration.parent = library;
       }
     } else if (declaration is SourceMemberBuilder) {
       declaration.buildOutlineNodes((
diff --git a/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart
new file mode 100644
index 0000000..50f2c51
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+int DuplicateName = 42;
+
+extension type DuplicateName._(int _x){
+  DuplicateName(this._x) {
+    bar;
+  }
+  int get bar => 42;
+}
diff --git a/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.expect b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.expect
new file mode 100644
index 0000000..0493c93
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:7:16: Error: 'DuplicateName' is already declared in this scope.
+// extension type DuplicateName._(int _x){
+//                ^^^^^^^^^^^^^
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:5:5: Context: Previous declaration of 'DuplicateName'.
+// int DuplicateName = 42;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:11:11: Error: 'DuplicateName' isn't a type.
+//   int get bar => 42;
+//           ^
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:11:11: Context: This isn't a type.
+//   int get bar => 42;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int DuplicateName = 42;
diff --git a/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.modular.expect b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.modular.expect
new file mode 100644
index 0000000..0493c93
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.modular.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:7:16: Error: 'DuplicateName' is already declared in this scope.
+// extension type DuplicateName._(int _x){
+//                ^^^^^^^^^^^^^
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:5:5: Context: Previous declaration of 'DuplicateName'.
+// int DuplicateName = 42;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:11:11: Error: 'DuplicateName' isn't a type.
+//   int get bar => 42;
+//           ^
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:11:11: Context: This isn't a type.
+//   int get bar => 42;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int DuplicateName = 42;
diff --git a/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.outline.expect b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.outline.expect
new file mode 100644
index 0000000..47b0520
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.outline.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:7:16: Error: 'DuplicateName' is already declared in this scope.
+// extension type DuplicateName._(int _x){
+//                ^^^^^^^^^^^^^
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:5:5: Context: Previous declaration of 'DuplicateName'.
+// int DuplicateName = 42;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:11:11: Error: 'DuplicateName' isn't a type.
+//   int get bar => 42;
+//           ^
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:11:11: Context: This isn't a type.
+//   int get bar => 42;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int DuplicateName;
diff --git a/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.transformed.expect
new file mode 100644
index 0000000..0493c93
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:7:16: Error: 'DuplicateName' is already declared in this scope.
+// extension type DuplicateName._(int _x){
+//                ^^^^^^^^^^^^^
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:5:5: Context: Previous declaration of 'DuplicateName'.
+// int DuplicateName = 42;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:11:11: Error: 'DuplicateName' isn't a type.
+//   int get bar => 42;
+//           ^
+// pkg/front_end/testcases/regress/extension_type_duplicate_name.dart:11:11: Context: This isn't a type.
+//   int get bar => 42;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int DuplicateName = 42;
diff --git a/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.textual_outline.expect b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.textual_outline.expect
new file mode 100644
index 0000000..4e63767
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+int DuplicateName = 42;
+
+extension type DuplicateName._(int _x) {
+  DuplicateName(this._x) {}
+  int get bar => 42;
+}
diff --git a/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..185cd1b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_duplicate_name.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+extension type DuplicateName._(int _x) {
+  DuplicateName(this._x) {}
+  int get bar => 42;
+}
+
+int DuplicateName = 42;