[CFE] Fix crash in extension type declared instance field type pointing to method

Change-Id: I6d1d34f487d0095c306c3144e61cca7bd4bc559d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/397920
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart
index 784fbe2..963a977 100644
--- a/pkg/front_end/lib/src/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder.dart
@@ -3342,7 +3342,8 @@
           (setterBuilder.isField || setterBuilder.isStatic)) {
         setterBuilder = null;
       }
-      if (declaration == null && setterBuilder == null) {
+      if ((declaration == null && setterBuilder == null) ||
+          thisVariable == null) {
         return new UnresolvedNameGenerator(
             this, nameToken, new Name(name, libraryBuilder.nameOrigin),
             unresolvedReadKind: UnresolvedKind.Unknown);
diff --git a/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart
new file mode 100644
index 0000000..045ca6c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart
@@ -0,0 +1,8 @@
+// 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.
+
+extension Foo on int {
+  bar(){}
+  bar baz;
+}
diff --git a/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.expect b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.expect
new file mode 100644
index 0000000..e50d2dd
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.expect
@@ -0,0 +1,28 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:7:7: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   bar baz;
+//       ^^^
+//
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:7:3: Error: 'bar' isn't a type.
+//   bar baz;
+//   ^^^
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:6:3: Context: This isn't a type.
+//   bar(){}
+//   ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Foo on core::int {
+  method bar = self::Foo|bar;
+  method tearoff bar = self::Foo|get#bar;
+  field baz = self::Foo|baz;
+}
+static field invalid-type Foo|baz;
+static extension-member method Foo|bar(lowered final core::int #this) → dynamic {}
+static extension-member method Foo|get#bar(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::Foo|bar(#this);
diff --git a/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.modular.expect b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.modular.expect
new file mode 100644
index 0000000..e50d2dd
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.modular.expect
@@ -0,0 +1,28 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:7:7: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   bar baz;
+//       ^^^
+//
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:7:3: Error: 'bar' isn't a type.
+//   bar baz;
+//   ^^^
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:6:3: Context: This isn't a type.
+//   bar(){}
+//   ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Foo on core::int {
+  method bar = self::Foo|bar;
+  method tearoff bar = self::Foo|get#bar;
+  field baz = self::Foo|baz;
+}
+static field invalid-type Foo|baz;
+static extension-member method Foo|bar(lowered final core::int #this) → dynamic {}
+static extension-member method Foo|get#bar(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::Foo|bar(#this);
diff --git a/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.outline.expect b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.outline.expect
new file mode 100644
index 0000000..3b8750f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.outline.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:7:7: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   bar baz;
+//       ^^^
+//
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:7:3: Error: 'bar' isn't a type.
+//   bar baz;
+//   ^^^
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:6:3: Context: This isn't a type.
+//   bar(){}
+//   ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Foo on core::int {
+  method bar = self::Foo|bar;
+  method tearoff bar = self::Foo|get#bar;
+  field baz = self::Foo|baz;
+}
+static field invalid-type Foo|baz;
+static extension-member method Foo|bar(lowered final core::int #this) → dynamic
+  ;
+static extension-member method Foo|get#bar(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::Foo|bar(#this);
diff --git a/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..e50d2dd
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.strong.transformed.expect
@@ -0,0 +1,28 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:7:7: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   bar baz;
+//       ^^^
+//
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:7:3: Error: 'bar' isn't a type.
+//   bar baz;
+//   ^^^
+// pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart:6:3: Context: This isn't a type.
+//   bar(){}
+//   ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Foo on core::int {
+  method bar = self::Foo|bar;
+  method tearoff bar = self::Foo|get#bar;
+  field baz = self::Foo|baz;
+}
+static field invalid-type Foo|baz;
+static extension-member method Foo|bar(lowered final core::int #this) → dynamic {}
+static extension-member method Foo|get#bar(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::Foo|bar(#this);
diff --git a/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.textual_outline.expect b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.textual_outline.expect
new file mode 100644
index 0000000..bd45fff
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+extension Foo on int {
+  bar(){}
+  bar baz;
+}
diff --git a/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..bd45fff
--- /dev/null
+++ b/pkg/front_end/testcases/regress/extension_type_field_has_method_type.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+extension Foo on int {
+  bar(){}
+  bar baz;
+}