add migration engine support for top level setters

Change-Id: I436e673370ed0094b0615d99796f117145c8fbaf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/106923
Commit-Queue: Dan Rubel <danrubel@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/nnbd_migration/lib/src/graph_builder.dart b/pkg/nnbd_migration/lib/src/graph_builder.dart
index 19d1efd..a6942d2 100644
--- a/pkg/nnbd_migration/lib/src/graph_builder.dart
+++ b/pkg/nnbd_migration/lib/src/graph_builder.dart
@@ -638,12 +638,10 @@
         staticElement is LocalVariableElement) {
       return getOrComputeElementType(staticElement);
     } else if (staticElement is PropertyAccessorElement) {
-      if (staticElement.isGetter) {
-        return getOrComputeElementType(staticElement).returnType;
-      } else {
-        // TODO(danrubel) handle setter
-        _unimplemented(node, 'Setter');
-      }
+      var elementType = getOrComputeElementType(staticElement);
+      return staticElement.isGetter
+          ? elementType.returnType
+          : elementType.positionalParameters[0];
     } else if (staticElement is ClassElement) {
       return _nonNullableTypeType;
     } else {
diff --git a/pkg/nnbd_migration/test/graph_builder_test.dart b/pkg/nnbd_migration/test/graph_builder_test.dart
index 31b274b..d9a7a43 100644
--- a/pkg/nnbd_migration/test/graph_builder_test.dart
+++ b/pkg/nnbd_migration/test/graph_builder_test.dart
@@ -1662,6 +1662,24 @@
     assertNoUpstreamNullability(decoratedTypeAnnotation('int').node);
   }
 
+  test_topLevelSetter() async {
+    await analyze('''
+void set x(int value) {}
+main() { x = 1; }
+''');
+    var setXType = decoratedTypeAnnotation('int value');
+    assertEdge(never, setXType.node, hard: false);
+  }
+
+  test_topLevelSetter_nullable() async {
+    await analyze('''
+void set x(int value) {}
+main() { x = null; }
+''');
+    var setXType = decoratedTypeAnnotation('int value');
+    assertEdge(always, setXType.node, hard: false);
+  }
+
   test_topLevelVar_reference() async {
     await analyze('''
 double pi = 3.1415;