linter: catch fields referenced in a pattern field

Fixes https://github.com/dart-lang/sdk/issues/53674

Change-Id: I87effd3cc4b3d3227cd26c3fdeb68b7f7e2d0ca9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/330880
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
Auto-Submit: Samuel Rawlins <srawlins@google.com>
diff --git a/pkg/linter/lib/src/rules/unreachable_from_main.dart b/pkg/linter/lib/src/rules/unreachable_from_main.dart
index 6da7ebd..c5a3f92 100644
--- a/pkg/linter/lib/src/rules/unreachable_from_main.dart
+++ b/pkg/linter/lib/src/rules/unreachable_from_main.dart
@@ -316,6 +316,15 @@
   }
 
   @override
+  void visitPatternField(PatternField node) {
+    var e = node.element;
+    if (e != null) {
+      _addDeclaration(e);
+    }
+    super.visitPatternField(node);
+  }
+
+  @override
   void visitPostfixExpression(PostfixExpression node) {
     _visitCompoundAssignmentExpression(node);
     super.visitPostfixExpression(node);
diff --git a/pkg/linter/test/rules/unreachable_from_main_test.dart b/pkg/linter/test/rules/unreachable_from_main_test.dart
index 20346e9..1f3ecf7 100644
--- a/pkg/linter/test/rules/unreachable_from_main_test.dart
+++ b/pkg/linter/test/rules/unreachable_from_main_test.dart
@@ -20,6 +20,22 @@
   @override
   String get lintRule => 'unreachable_from_main';
 
+  test_class_instanceField_reachable_matchedInPattern() async {
+    await assertNoDiagnostics(r'''
+void main() {
+  var x = switch (C(1)) {
+    C(:final f) => f.round(),
+  };
+  print(x);
+}
+
+class C {
+  final int f;
+  C(this.f);
+}
+''');
+  }
+
   test_class_instanceField_reachable_overrides_local() async {
     await assertDiagnostics(r'''
 void main() {