analyzer: Check deprecated member use on DotShorthandInvocation

Change-Id: Ie8cdb4f3b063cb8a5fdd2486ced421d481339f31
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/451662
Reviewed-by: Kallen Tu <kallentu@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 169fc14..a71825c5 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -374,8 +374,9 @@
   @override
   void visitDotShorthandInvocation(DotShorthandInvocation node) {
     _deprecatedFunctionalityVerifier.dotShorthandInvocation(node);
-    // TODO(srawlins): I imagine we need to check with
-    // `_deprecatedMemberUseVerifier` here...
+    for (var v in _elementUsageFrontierDetectors) {
+      v.dotShorthandInvocation(node);
+    }
     super.visitDotShorthandInvocation(node);
   }
 
diff --git a/pkg/analyzer/lib/src/error/element_usage_detector.dart b/pkg/analyzer/lib/src/error/element_usage_detector.dart
index 2017369..90a90f5 100644
--- a/pkg/analyzer/lib/src/error/element_usage_detector.dart
+++ b/pkg/analyzer/lib/src/error/element_usage_detector.dart
@@ -131,6 +131,10 @@
     _invocationArguments(node.constructorName.element, node.argumentList);
   }
 
+  void dotShorthandInvocation(DotShorthandInvocation node) {
+    _invocationArguments(node.memberName.element, node.argumentList);
+  }
+
   void exportDirective(ExportDirective node) {
     checkUsage(node.libraryExport?.exportedLibrary, node);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index f591535..39f4f41 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -13,10 +13,10 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(DeprecatedMemberUse_PackageConfigWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_BlazeWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_GnWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_PackageBuildWorkspaceTest);
+    defineReflectiveTests(DeprecatedMemberUse_PackageConfigWorkspaceTest);
   });
 }
 
@@ -551,6 +551,29 @@
     );
   }
 
+  test_dotShorthandInvocation_deprecatedMethod() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', r'''
+class A {
+  @deprecated
+  static A m() => A();
+}
+''');
+
+    await assertErrorsInCode(
+      r'''
+import 'package:aaa/a.dart';
+
+void f() {
+  A a = .m();
+}
+''',
+      [
+        error(WarningCode.unusedLocalVariable, 45, 1),
+        error(HintCode.deprecatedMemberUse, 50, 1),
+      ],
+    );
+  }
+
   test_export() async {
     newFile('$workspaceRootPath/aaa/lib/a.dart', r'''
 @deprecated