Analyzer: Don't report all optional parameters on private ctors as unused

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

Change-Id: Ie0f3b004de2761145b7f8acffc3aa82b59a0aea2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/173420
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index c4368cf..03496ce 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -97,6 +97,15 @@
   }
 
   @override
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
+    for (var argument in node.argumentList.arguments) {
+      var parameter = argument.staticParameterElement;
+      usedElements.elements.add(parameter);
+    }
+    super.visitInstanceCreationExpression(node);
+  }
+
+  @override
   void visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement enclosingExecOld = _enclosingExec;
     try {
diff --git a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
index fc48249..95cf0b8 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
@@ -957,26 +957,13 @@
     ]);
   }
 
-  test_optionalParameter_constructor_named_notUsed() async {
-    await assertErrorsInCode(r'''
-class A {
-  A._([int a]);
-}
-f() => A._();
-''', [
-      error(HintCode.UNUSED_ELEMENT_PARAMETER, 21, 1),
-    ]);
-  }
-
-  test_optionalParameter_constructor_unnamed_notUsed() async {
-    await assertErrorsInCode(r'''
+  test_optionalParameter_isUsed_constructor() async {
+    await assertNoErrorsInCode(r'''
 class _A {
-  _A([int a]);
+  _A([int a = 0]);
 }
-f() => _A();
-''', [
-      error(HintCode.UNUSED_ELEMENT_PARAMETER, 21, 1),
-    ]);
+f() => _A(0);
+''');
   }
 
   test_optionalParameter_isUsed_functionTearoff() async {
@@ -1104,6 +1091,28 @@
 ''');
   }
 
+  test_optionalParameter_notUsed_constructor_named() async {
+    await assertErrorsInCode(r'''
+class A {
+  A._([int a]);
+}
+f() => A._();
+''', [
+      error(HintCode.UNUSED_ELEMENT_PARAMETER, 21, 1),
+    ]);
+  }
+
+  test_optionalParameter_notUsed_constructor_unnamed() async {
+    await assertErrorsInCode(r'''
+class _A {
+  _A([int a]);
+}
+f() => _A();
+''', [
+      error(HintCode.UNUSED_ELEMENT_PARAMETER, 21, 1),
+    ]);
+  }
+
   test_optionalParameter_notUsed_extension() async {
     await assertErrorsInCode(r'''
 extension E on String {