Version 2.17.0-59.0.dev

Merge commit '577ba6251638377373e9a2fa086fd49aab748928' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
index fae7630..0749150 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
@@ -65,6 +65,12 @@
   String get name;
 }
 
+/// Base class for all Declarations which have a surrounding class.
+abstract class ClassMemberDeclaration implements Declaration {
+  /// The class that defines this method.
+  NamedTypeAnnotation get definingClass;
+}
+
 /// A declaration that defines a new type in the program.
 ///
 /// See subtypes [ClassDeclaration] and [TypeAliasDeclaration].
@@ -145,10 +151,8 @@
 }
 
 /// Method introspection information.
-abstract class MethodDeclaration implements FunctionDeclaration {
-  /// The class that defines this method.
-  NamedTypeAnnotation get definingClass;
-}
+abstract class MethodDeclaration
+    implements FunctionDeclaration, ClassMemberDeclaration {}
 
 /// Constructor introspection information.
 abstract class ConstructorDeclaration implements MethodDeclaration {
@@ -175,11 +179,9 @@
   ExpressionCode? get initializer;
 }
 
-/// Field introspection information ..
-abstract class FieldDeclaration implements VariableDeclaration {
-  /// The class that defines this method.
-  NamedTypeAnnotation get definingClass;
-}
+/// Field introspection information.
+abstract class FieldDeclaration
+    implements VariableDeclaration, ClassMemberDeclaration {}
 
 /// Parameter introspection information.
 abstract class ParameterDeclaration implements Declaration {
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart
index 577e7bf..c423331 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart
@@ -140,7 +140,7 @@
   Future<VariableDefinitionBuilder> buildField(String name) async {
     FieldDeclaration field = (await classIntrospector.fieldsOf(declaration))
         .firstWhere((field) => field.name == name);
-    return new FieldDefinitionBuilderImpl(
+    return new VariableDefinitionBuilderImpl(
         field, classIntrospector, typeResolver, typeDeclarationResolver,
         parentAugmentations: _augmentations);
   }
@@ -149,7 +149,7 @@
   Future<FunctionDefinitionBuilder> buildMethod(String name) async {
     MethodDeclaration method = (await classIntrospector.methodsOf(declaration))
         .firstWhere((method) => method.name == name);
-    return new MethodDefinitionBuilderImpl(
+    return new FunctionDefinitionBuilderImpl(
         method, classIntrospector, typeResolver, typeDeclarationResolver,
         parentAugmentations: _augmentations);
   }
@@ -171,31 +171,14 @@
 
   @override
   void augment(FunctionBodyCode body) {
-    _augmentations.add(_buildFunctionAugmentation(body, declaration));
-  }
-}
-
-/// Implementation of [MethodDefinitionBuilderImpl].
-class MethodDefinitionBuilderImpl extends FunctionDefinitionBuilderImpl {
-  @override
-  final MethodDeclaration declaration;
-
-  MethodDefinitionBuilderImpl(
-      this.declaration,
-      ClassIntrospector classIntrospector,
-      TypeResolver typeResolver,
-      TypeDeclarationResolver typeDeclarationResolver,
-      {List<DeclarationCode>? parentAugmentations})
-      : super(declaration, classIntrospector, typeResolver,
-            typeDeclarationResolver,
-            parentAugmentations: parentAugmentations);
-
-  @override
-  void augment(FunctionBodyCode body) {
-    _augmentations.add(_buildClassAugmentation(
-      declaration.definingClass,
-      [_buildFunctionAugmentation(body, declaration)],
-    ));
+    DeclarationCode augmentation =
+        _buildFunctionAugmentation(body, declaration);
+    if (declaration is ClassMemberDeclaration) {
+      augmentation = _buildClassAugmentation(
+          (declaration as ClassMemberDeclaration).definingClass,
+          [augmentation]);
+    }
+    _augmentations.add(augmentation);
   }
 }
 
@@ -241,33 +224,20 @@
       {DeclarationCode? getter,
       DeclarationCode? setter,
       ExpressionCode? initializer}) {
-    _augmentations.addAll(_buildVariableAugmentations(declaration,
-        getter: getter, setter: setter, initializer: initializer));
-  }
-}
+    List<DeclarationCode> augmentations = _buildVariableAugmentations(
+        declaration,
+        getter: getter,
+        setter: setter,
+        initializer: initializer);
+    if (declaration is ClassMemberDeclaration) {
+      augmentations = [
+        _buildClassAugmentation(
+            (declaration as ClassMemberDeclaration).definingClass,
+            augmentations)
+      ];
+    }
 
-class FieldDefinitionBuilderImpl extends DefinitionBuilderBase
-    implements VariableDefinitionBuilder {
-  final FieldDeclaration declaration;
-
-  FieldDefinitionBuilderImpl(
-      this.declaration,
-      ClassIntrospector classIntrospector,
-      TypeResolver typeResolver,
-      TypeDeclarationResolver typeDeclarationResolver,
-      {List<DeclarationCode>? parentAugmentations})
-      : super(classIntrospector, typeResolver, typeDeclarationResolver,
-            parentAugmentations: parentAugmentations);
-
-  @override
-  void augment(
-      {DeclarationCode? getter,
-      DeclarationCode? setter,
-      ExpressionCode? initializer}) {
-    _augmentations.add(_buildClassAugmentation(
-        declaration.definingClass,
-        _buildVariableAugmentations(declaration,
-            getter: getter, setter: setter, initializer: initializer)));
+    _augmentations.addAll(augmentations);
   }
 }
 
@@ -336,7 +306,7 @@
       declaration.returnType.code,
       ' ',
     ],
-    declaration.name,
+    declaration.name.trimEquals(),
     if (declaration.typeParameters.isNotEmpty) ...[
       '<',
       for (TypeParameterDeclaration typeParam
@@ -399,3 +369,7 @@
     body,
   ]);
 }
+
+extension _ on String {
+  String trimEquals() => endsWith('=') ? substring(0, length - 1) : this;
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/execute_macro.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/execute_macro.dart
index 4448b1e..c1367a2 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/execute_macro.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/execute_macro.dart
@@ -44,47 +44,54 @@
     Declaration declaration,
     ClassIntrospector classIntrospector,
     TypeResolver typeResolver) async {
-  if (declaration is FunctionDeclaration) {
-    if (macro is ConstructorDeclarationsMacro &&
-        declaration is ConstructorDeclaration) {
-      ClassMemberDeclarationBuilderImpl builder =
-          new ClassMemberDeclarationBuilderImpl(
-              declaration.definingClass, classIntrospector, typeResolver);
-      await macro.buildDeclarationsForConstructor(declaration, builder);
-      return builder.result;
-    } else if (macro is MethodDeclarationsMacro &&
-        declaration is MethodDeclaration) {
-      ClassMemberDeclarationBuilderImpl builder =
-          new ClassMemberDeclarationBuilderImpl(
-              declaration.definingClass, classIntrospector, typeResolver);
-      await macro.buildDeclarationsForMethod(declaration, builder);
-      return builder.result;
-    } else if (macro is FunctionDeclarationsMacro) {
-      DeclarationBuilderImpl builder =
-          new DeclarationBuilderImpl(classIntrospector, typeResolver);
-      await macro.buildDeclarationsForFunction(declaration, builder);
-      return builder.result;
-    }
-  } else if (declaration is VariableDeclaration) {
-    if (macro is FieldDeclarationsMacro && declaration is FieldDeclaration) {
-      ClassMemberDeclarationBuilderImpl builder =
-          new ClassMemberDeclarationBuilderImpl(
-              declaration.definingClass, classIntrospector, typeResolver);
-      await macro.buildDeclarationsForField(declaration, builder);
-      return builder.result;
-    } else if (macro is VariableDeclarationsMacro) {
-      DeclarationBuilderImpl builder =
-          new DeclarationBuilderImpl(classIntrospector, typeResolver);
-      await macro.buildDeclarationsForVariable(declaration, builder);
-      return builder.result;
-    }
-  } else if (macro is ClassDeclarationsMacro &&
-      declaration is ClassDeclaration) {
+  if (declaration is ClassDeclaration && macro is ClassDeclarationsMacro) {
     ClassMemberDeclarationBuilderImpl builder =
         new ClassMemberDeclarationBuilderImpl(
             declaration.type, classIntrospector, typeResolver);
     await macro.buildDeclarationsForClass(declaration, builder);
     return builder.result;
+  } else if (declaration is ClassMemberDeclaration) {
+    ClassMemberDeclarationBuilderImpl builder =
+        new ClassMemberDeclarationBuilderImpl(
+            declaration.definingClass, classIntrospector, typeResolver);
+    if (declaration is FunctionDeclaration) {
+      if (macro is ConstructorDeclarationsMacro &&
+          declaration is ConstructorDeclaration) {
+        await macro.buildDeclarationsForConstructor(declaration, builder);
+        return builder.result;
+      } else if (macro is MethodDeclarationsMacro &&
+          declaration is MethodDeclaration) {
+        await macro.buildDeclarationsForMethod(declaration, builder);
+        return builder.result;
+      } else if (macro is FunctionDeclarationsMacro) {
+        await macro.buildDeclarationsForFunction(
+            declaration as FunctionDeclaration, builder);
+        return builder.result;
+      }
+    } else if (declaration is VariableDeclaration) {
+      if (macro is FieldDeclarationsMacro && declaration is FieldDeclaration) {
+        await macro.buildDeclarationsForField(declaration, builder);
+        return builder.result;
+      } else if (macro is VariableDeclarationsMacro) {
+        DeclarationBuilderImpl builder =
+            new DeclarationBuilderImpl(classIntrospector, typeResolver);
+        await macro.buildDeclarationsForVariable(
+            declaration as VariableDeclaration, builder);
+        return builder.result;
+      }
+    }
+  } else {
+    DeclarationBuilderImpl builder =
+        new DeclarationBuilderImpl(classIntrospector, typeResolver);
+    if (declaration is FunctionDeclaration &&
+        macro is FunctionDeclarationsMacro) {
+      await macro.buildDeclarationsForFunction(declaration, builder);
+      return builder.result;
+    } else if (macro is VariableDeclarationsMacro &&
+        declaration is VariableDeclaration) {
+      await macro.buildDeclarationsForVariable(declaration, builder);
+      return builder.result;
+    }
   }
   throw new UnsupportedError('Unsupported macro type or invalid declaration:\n'
       'macro: $macro\ndeclaration: $declaration');
@@ -105,39 +112,27 @@
               typeResolver, typeDeclarationResolver);
       await macro.buildDefinitionForConstructor(declaration, builder);
       return builder.result;
-    } else if (macro is MethodDefinitionMacro &&
-        declaration is MethodDeclaration) {
-      MethodDefinitionBuilderImpl builder = new MethodDefinitionBuilderImpl(
-          declaration,
-          classIntrospector,
-          typeResolver,
-          typeDeclarationResolver);
-      await macro.buildDefinitionForMethod(declaration, builder);
-      return builder.result;
-    } else if (macro is FunctionDefinitionMacro) {
+    } else {
       FunctionDefinitionBuilderImpl builder = new FunctionDefinitionBuilderImpl(
           declaration,
           classIntrospector,
           typeResolver,
           typeDeclarationResolver);
-      await macro.buildDefinitionForFunction(declaration, builder);
-      return builder.result;
+      if (macro is MethodDefinitionMacro && declaration is MethodDeclaration) {
+        await macro.buildDefinitionForMethod(declaration, builder);
+        return builder.result;
+      } else if (macro is FunctionDefinitionMacro) {
+        await macro.buildDefinitionForFunction(declaration, builder);
+        return builder.result;
+      }
     }
   } else if (declaration is VariableDeclaration) {
+    VariableDefinitionBuilderImpl builder = new VariableDefinitionBuilderImpl(
+        declaration, classIntrospector, typeResolver, typeDeclarationResolver);
     if (macro is FieldDefinitionMacro && declaration is FieldDeclaration) {
-      FieldDefinitionBuilderImpl builder = new FieldDefinitionBuilderImpl(
-          declaration,
-          classIntrospector,
-          typeResolver,
-          typeDeclarationResolver);
       await macro.buildDefinitionForField(declaration, builder);
       return builder.result;
     } else if (macro is VariableDefinitionMacro) {
-      VariableDefinitionBuilderImpl builder = new VariableDefinitionBuilderImpl(
-          declaration,
-          classIntrospector,
-          typeResolver,
-          typeDeclarationResolver);
       await macro.buildDefinitionForVariable(declaration, builder);
       return builder.result;
     }
diff --git a/pkg/_fe_analyzer_shared/test/macros/isolated_executor/isolated_executor_test.dart b/pkg/_fe_analyzer_shared/test/macros/isolated_executor/isolated_executor_test.dart
index ce7d844..cdd1725 100644
--- a/pkg/_fe_analyzer_shared/test/macros/isolated_executor/isolated_executor_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/isolated_executor/isolated_executor_test.dart
@@ -7,8 +7,6 @@
 
 import 'package:_fe_analyzer_shared/src/macros/bootstrap.dart';
 import 'package:_fe_analyzer_shared/src/macros/executor.dart';
-import 'package:_fe_analyzer_shared/src/macros/executor_shared/introspection_impls.dart';
-import 'package:_fe_analyzer_shared/src/macros/executor_shared/remote_instance.dart';
 import 'package:_fe_analyzer_shared/src/macros/isolated_executor/isolated_executor.dart'
     as isolatedExecutor;
 
@@ -80,160 +78,65 @@
   });
 
   group('run macros', () {
-    var stringType = NamedTypeAnnotationImpl(
-        id: RemoteInstance.uniqueId,
-        name: 'String',
-        isNullable: false,
-        typeArguments: const []);
-
-    var myInterfaceType = NamedTypeAnnotationImpl(
-        id: RemoteInstance.uniqueId,
-        name: 'MyInterface',
-        isNullable: false,
-        typeArguments: const []);
-    var myMixinType = NamedTypeAnnotationImpl(
-        id: RemoteInstance.uniqueId,
-        name: 'MyMixin',
-        isNullable: false,
-        typeArguments: const []);
-    var mySuperclassType = NamedTypeAnnotationImpl(
-        id: RemoteInstance.uniqueId,
-        name: 'MySuperclass',
-        isNullable: false,
-        typeArguments: const []);
-    var myClassType = NamedTypeAnnotationImpl(
-        id: RemoteInstance.uniqueId,
-        name: 'MyClass',
-        isNullable: false,
-        typeArguments: const []);
-
-    var myClass = ClassDeclarationImpl(
-        id: RemoteInstance.uniqueId,
-        name: myClassType.name,
-        type: myClassType,
-        typeParameters: [],
-        interfaces: [myInterfaceType],
-        isAbstract: false,
-        isExternal: false,
-        mixins: [myMixinType],
-        superclass: mySuperclassType);
-    var myConstructor = ConstructorDeclarationImpl(
-        id: RemoteInstance.uniqueId,
-        name: 'myConstructor',
-        isAbstract: false,
-        isExternal: false,
-        isGetter: false,
-        isSetter: false,
-        namedParameters: [],
-        positionalParameters: [],
-        returnType: myClassType,
-        typeParameters: [],
-        definingClass: myClassType,
-        isFactory: false);
-    var myField = FieldDeclarationImpl(
-        id: RemoteInstance.uniqueId,
-        name: 'myField',
-        initializer: null,
-        isExternal: false,
-        isFinal: false,
-        isLate: false,
-        type: stringType,
-        definingClass: myClassType);
-    var myInterface = ClassDeclarationImpl(
-        id: RemoteInstance.uniqueId,
-        name: myInterfaceType.name,
-        type: myInterfaceType,
-        typeParameters: [],
-        interfaces: [],
-        isAbstract: false,
-        isExternal: false,
-        mixins: [],
-        superclass: null);
-    var myMethod = MethodDeclarationImpl(
-        id: RemoteInstance.uniqueId,
-        name: 'myMethod',
-        isAbstract: false,
-        isExternal: false,
-        isGetter: false,
-        isSetter: false,
-        namedParameters: [],
-        positionalParameters: [],
-        returnType: stringType,
-        typeParameters: [],
-        definingClass: myClassType);
-    var myMixin = ClassDeclarationImpl(
-        id: RemoteInstance.uniqueId,
-        name: myMixinType.name,
-        type: myMixinType,
-        typeParameters: [],
-        interfaces: [],
-        isAbstract: false,
-        isExternal: false,
-        mixins: [],
-        superclass: null);
-    var mySuperclass = ClassDeclarationImpl(
-        id: RemoteInstance.uniqueId,
-        name: mySuperclassType.name,
-        type: mySuperclassType,
-        typeParameters: [],
-        interfaces: [],
-        isAbstract: false,
-        isExternal: false,
-        mixins: [],
-        superclass: null);
-
-    var myClassStaticType = TestNamedStaticType(
-        'package:my_package/my_package.dart', myClassType.name, []);
-
-    var testTypeResolver = TestTypeResolver({
-      stringType: TestNamedStaticType('dart:core', stringType.name, []),
-      myClassType: myClassStaticType,
-    });
-    var testClassIntrospector = TestClassIntrospector(
-      constructors: {
-        myClass: [myConstructor],
-      },
-      fields: {
-        myClass: [myField],
-      },
-      interfaces: {
-        myClass: [myInterface],
-      },
-      methods: {
-        myClass: [myMethod],
-      },
-      mixins: {
-        myClass: [myMixin],
-      },
-      superclass: {
-        myClass: mySuperclass,
-      },
-    );
-    var testTypeDeclarationResolver =
-        TestTypeDeclarationResolver({myClassStaticType: myClass});
-
     group('in the types phase', () {
+      test('on functions', () async {
+        var result =
+            await executor.executeTypesPhase(instanceId, Fixtures.myFunction);
+        expect(result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace('class GeneratedByMyFunction {}'));
+      });
+
       test('on methods', () async {
-        var result = await executor.executeTypesPhase(instanceId, myMethod);
+        var result =
+            await executor.executeTypesPhase(instanceId, Fixtures.myMethod);
         expect(result.augmentations.single.debugString().toString(),
             equalsIgnoringWhitespace('class GeneratedByMyMethod {}'));
       });
 
+      test('on getters', () async {
+        var result = await executor.executeTypesPhase(
+          instanceId,
+          Fixtures.myVariableGetter,
+        );
+        expect(result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace('class GeneratedByMyVariableGetter {}'));
+      });
+
+      test('on setters', () async {
+        var result = await executor.executeTypesPhase(
+          instanceId,
+          Fixtures.myVariableSetter,
+        );
+        expect(result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace('class GeneratedByMyVariableSetter {}'));
+      });
+
+      test('on variables', () async {
+        var result = await executor.executeTypesPhase(
+          instanceId,
+          Fixtures.myVariable,
+        );
+        expect(result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace('class GeneratedBy_myVariable {}'));
+      });
+
       test('on constructors', () async {
-        var result =
-            await executor.executeTypesPhase(instanceId, myConstructor);
+        var result = await executor.executeTypesPhase(
+            instanceId, Fixtures.myConstructor);
         expect(result.augmentations.single.debugString().toString(),
             equalsIgnoringWhitespace('class GeneratedByMyConstructor {}'));
       });
 
       test('on fields', () async {
-        var result = await executor.executeTypesPhase(instanceId, myField);
+        var result =
+            await executor.executeTypesPhase(instanceId, Fixtures.myField);
         expect(result.augmentations.single.debugString().toString(),
             equalsIgnoringWhitespace('class GeneratedByMyField {}'));
       });
 
       test('on classes', () async {
-        var result = await executor.executeTypesPhase(instanceId, myClass);
+        var result =
+            await executor.executeTypesPhase(instanceId, Fixtures.myClass);
         expect(
             result.augmentations.single.debugString().toString(),
             equalsIgnoringWhitespace(
@@ -242,9 +145,24 @@
     });
 
     group('in the declaration phase', () {
+      test('on functions', () async {
+        var result = await executor.executeDeclarationsPhase(
+            instanceId,
+            Fixtures.myFunction,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector);
+        expect(
+            result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace(
+                'String delegateMyFunction() => myFunction();'));
+      });
+
       test('on methods', () async {
         var result = await executor.executeDeclarationsPhase(
-            instanceId, myMethod, testTypeResolver, testClassIntrospector);
+            instanceId,
+            Fixtures.myMethod,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector);
         expect(
             result.augmentations.single.debugString().toString(),
             equalsIgnoringWhitespace(
@@ -253,7 +171,10 @@
 
       test('on constructors', () async {
         var result = await executor.executeDeclarationsPhase(
-            instanceId, myConstructor, testTypeResolver, testClassIntrospector);
+            instanceId,
+            Fixtures.myConstructor,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector);
         expect(result.augmentations.single.debugString().toString(),
             equalsIgnoringWhitespace('''
               augment class MyClass {
@@ -261,9 +182,45 @@
               }'''));
       });
 
+      test('on getters', () async {
+        var result = await executor.executeDeclarationsPhase(
+            instanceId,
+            Fixtures.myVariableGetter,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector);
+        expect(result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace('''
+                String get delegateMyVariable => myVariable;'''));
+      });
+
+      test('on setters', () async {
+        var result = await executor.executeDeclarationsPhase(
+            instanceId,
+            Fixtures.myVariableSetter,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector);
+        expect(result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace('''
+                void set delegateMyVariable(String value) => myVariable = value;'''));
+      });
+
+      test('on variables', () async {
+        var result = await executor.executeDeclarationsPhase(
+            instanceId,
+            Fixtures.myVariable,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector);
+        expect(result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace('''
+                String get delegate_myVariable => _myVariable;'''));
+      });
+
       test('on fields', () async {
         var result = await executor.executeDeclarationsPhase(
-            instanceId, myField, testTypeResolver, testClassIntrospector);
+            instanceId,
+            Fixtures.myField,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector);
         expect(result.augmentations.single.debugString().toString(),
             equalsIgnoringWhitespace('''
               augment class MyClass {
@@ -273,7 +230,10 @@
 
       test('on classes', () async {
         var result = await executor.executeDeclarationsPhase(
-            instanceId, myClass, testTypeResolver, testClassIntrospector);
+            instanceId,
+            Fixtures.myClass,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector);
         expect(result.augmentations.single.debugString().toString(),
             equalsIgnoringWhitespace('''
               augment class MyClass {
@@ -283,13 +243,32 @@
     });
 
     group('in the definition phase', () {
+      test('on functions', () async {
+        var result = await executor.executeDefinitionsPhase(
+            instanceId,
+            Fixtures.myFunction,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector,
+            Fixtures.testTypeDeclarationResolver);
+        expect(result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace('''
+                augment String myFunction() {
+                  print('isAbstract: false');
+                  print('isExternal: false');
+                  print('isGetter: false');
+                  print('isSetter: false');
+                  print('returnType: String');
+                  return augment super();
+                }'''));
+      });
+
       test('on methods', () async {
         var definitionResult = await executor.executeDefinitionsPhase(
             instanceId,
-            myMethod,
-            testTypeResolver,
-            testClassIntrospector,
-            testTypeDeclarationResolver);
+            Fixtures.myMethod,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector,
+            Fixtures.testTypeDeclarationResolver);
         expect(definitionResult.augmentations, hasLength(2));
         var augmentationStrings = definitionResult.augmentations
             .map((a) => a.debugString().toString())
@@ -300,22 +279,89 @@
       test('on constructors', () async {
         var definitionResult = await executor.executeDefinitionsPhase(
             instanceId,
-            myConstructor,
-            testTypeResolver,
-            testClassIntrospector,
-            testTypeDeclarationResolver);
+            Fixtures.myConstructor,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector,
+            Fixtures.testTypeDeclarationResolver);
         expect(definitionResult.augmentations, hasLength(1));
         expect(definitionResult.augmentations.first.debugString().toString(),
             constructorDefinitionMatcher);
       });
 
+      test('on getters', () async {
+        var result = await executor.executeDefinitionsPhase(
+            instanceId,
+            Fixtures.myVariableGetter,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector,
+            Fixtures.testTypeDeclarationResolver);
+        expect(result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace('''
+                augment String myVariable() {
+                  print('isAbstract: false');
+                  print('isExternal: false');
+                  print('isGetter: true');
+                  print('isSetter: false');
+                  print('returnType: String');
+                  return augment super;
+                }'''));
+      });
+
+      test('on setters', () async {
+        var result = await executor.executeDefinitionsPhase(
+            instanceId,
+            Fixtures.myVariableSetter,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector,
+            Fixtures.testTypeDeclarationResolver);
+        expect(result.augmentations.single.debugString().toString(),
+            equalsIgnoringWhitespace('''
+                augment void myVariable(String value, ) {
+                  print('isAbstract: false');
+                  print('isExternal: false');
+                  print('isGetter: false');
+                  print('isSetter: true');
+                  print('returnType: void');
+                  print('positionalParam: String value');
+                  return augment super = value;
+                }'''));
+      });
+
+      test('on variables', () async {
+        var result = await executor.executeDefinitionsPhase(
+            instanceId,
+            Fixtures.myVariable,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector,
+            Fixtures.testTypeDeclarationResolver);
+        expect(
+            result.augmentations.map((a) => a.debugString().toString()),
+            unorderedEquals([
+              equalsIgnoringWhitespace('''
+                augment String get _myVariable {
+                  print('parentClass: ');
+                  print('isExternal: false');
+                  print('isFinal: true');
+                  print('isLate: false');
+                  return augment super;
+                }'''),
+              equalsIgnoringWhitespace('''
+                augment set _myVariable(String value) {
+                  augment super = value;
+                }'''),
+              equalsIgnoringWhitespace('''
+                augment final String _myVariable = '';
+                '''),
+            ]));
+      });
+
       test('on fields', () async {
         var definitionResult = await executor.executeDefinitionsPhase(
             instanceId,
-            myField,
-            testTypeResolver,
-            testClassIntrospector,
-            testTypeDeclarationResolver);
+            Fixtures.myField,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector,
+            Fixtures.testTypeDeclarationResolver);
         expect(definitionResult.augmentations, hasLength(1));
         expect(definitionResult.augmentations.first.debugString().toString(),
             fieldDefinitionMatcher);
@@ -324,10 +370,10 @@
       test('on classes', () async {
         var definitionResult = await executor.executeDefinitionsPhase(
             instanceId,
-            myClass,
-            testTypeResolver,
-            testClassIntrospector,
-            testTypeDeclarationResolver);
+            Fixtures.myClass,
+            Fixtures.testTypeResolver,
+            Fixtures.testClassIntrospector,
+            Fixtures.testTypeDeclarationResolver);
         var augmentationStrings = definitionResult.augmentations
             .map((a) => a.debugString().toString())
             .toList();
@@ -366,8 +412,8 @@
     print('isLate: false');
     return augment super;
   }
-  augment set (String value) {
-    augment super(value);
+  augment set myField(String value) {
+    augment super = value;
   }
 }''');
 
diff --git a/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart b/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart
index 222e1cd..40ad337 100644
--- a/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart
@@ -68,14 +68,31 @@
   @override
   FutureOr<void> buildDeclarationsForFunction(
       FunctionDeclaration function, DeclarationBuilder builder) {
-    if (function.positionalParameters.isNotEmpty ||
-        function.namedParameters.isNotEmpty) {
+    if (!function.isSetter &&
+        (function.positionalParameters.isNotEmpty ||
+            function.namedParameters.isNotEmpty)) {
       throw new UnsupportedError(
           'Can only run on functions with no parameters!');
     }
     builder.declareInLibrary(DeclarationCode.fromParts([
       function.returnType,
-      ' delegate${function.name.capitalize()}() => ${function.name}();',
+      if (function.isGetter) ' get' else if (function.isSetter) ' set ',
+      ' delegate${function.name.capitalize().trimEquals()}',
+      if (!function.isGetter) ...[
+        '(',
+        if (function.isSetter) ...[
+          function.positionalParameters.first.type,
+          ' value',
+        ],
+        ')',
+      ],
+      ' => ${function.name.trimEquals()}',
+      function.isGetter
+          ? ''
+          : function.isSetter
+              ? ' = value'
+              : '()',
+      ';',
     ]));
   }
 
@@ -237,8 +254,13 @@
           return augment super;
         }''',
       ]),
-      setter: DeclarationCode.fromParts(
-          ['set (', variable.type, ' value) { augment super(value); }']),
+      setter: DeclarationCode.fromParts([
+        'set ',
+        variable.name,
+        '(',
+        variable.type,
+        ' value) { augment super = value; }'
+      ]),
       initializer: variable.initializer,
     );
   }
@@ -296,8 +318,14 @@
   @override
   FutureOr<void> buildTypesForFunction(
       FunctionDeclaration function, TypeBuilder builder) {
+    var suffix = function.isGetter
+        ? 'Getter'
+        : function.isSetter
+            ? 'Setter'
+            : '';
     builder.declareType(DeclarationCode.fromString(
-        'class GeneratedBy${function.name.capitalize()} {}'));
+        'class GeneratedBy${function.name.capitalize().trimEquals()}'
+        '$suffix {}'));
   }
 
   @override
@@ -349,11 +377,17 @@
         if (param.bounds != null) param.bounds!,
         "');\n",
       ],
-      '''
-      return augment super();
+      'return augment super',
+      if (function.isSetter)
+        ' = ${function.positionalParameters.first.name}'
+      else if (!function.isGetter)
+        '()',
+      ''';
     }''',
     ]);
 
 extension _ on String {
-  String capitalize() => '${this[0].toUpperCase()}${this.substring(1)}';
+  String capitalize() => '${this[0].toUpperCase()}${substring(1)}';
+
+  String trimEquals() => endsWith('=') ? substring(0, length - 1) : this;
 }
diff --git a/pkg/_fe_analyzer_shared/test/macros/util.dart b/pkg/_fe_analyzer_shared/test/macros/util.dart
index ef73298..b4749fc 100644
--- a/pkg/_fe_analyzer_shared/test/macros/util.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/util.dart
@@ -6,6 +6,7 @@
 
 import 'package:_fe_analyzer_shared/src/macros/api.dart';
 import 'package:_fe_analyzer_shared/src/macros/executor_shared/introspection_impls.dart';
+import 'package:_fe_analyzer_shared/src/macros/executor_shared/remote_instance.dart';
 
 import 'package:test/fake.dart';
 import 'package:test/test.dart';
@@ -214,3 +215,193 @@
     return true;
   }
 }
+
+class Fixtures {
+  static final stringType = NamedTypeAnnotationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'String',
+      isNullable: false,
+      typeArguments: const []);
+  static final voidType = NamedTypeAnnotationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'void',
+      isNullable: false,
+      typeArguments: const []);
+
+  // Top level, non-class declarations.
+  static final myFunction = FunctionDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'myFunction',
+      isAbstract: false,
+      isExternal: false,
+      isGetter: false,
+      isSetter: false,
+      namedParameters: [],
+      positionalParameters: [],
+      returnType: stringType,
+      typeParameters: []);
+  static final myVariable = VariableDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: '_myVariable',
+      initializer: ExpressionCode.fromString("''"),
+      isExternal: false,
+      isFinal: true,
+      isLate: false,
+      type: stringType);
+  static final myVariableGetter = FunctionDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'myVariable',
+      isAbstract: false,
+      isExternal: false,
+      isGetter: true,
+      isSetter: false,
+      namedParameters: [],
+      positionalParameters: [],
+      returnType: stringType,
+      typeParameters: []);
+  static final myVariableSetter = FunctionDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'myVariable=',
+      isAbstract: false,
+      isExternal: false,
+      isGetter: false,
+      isSetter: true,
+      namedParameters: [],
+      positionalParameters: [
+        ParameterDeclarationImpl(
+            id: RemoteInstance.uniqueId,
+            name: 'value',
+            defaultValue: null,
+            isNamed: false,
+            isRequired: true,
+            type: stringType)
+      ],
+      returnType: voidType,
+      typeParameters: []);
+
+  // Class and member declarations
+  static final myInterfaceType = NamedTypeAnnotationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'MyInterface',
+      isNullable: false,
+      typeArguments: const []);
+  static final myMixinType = NamedTypeAnnotationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'MyMixin',
+      isNullable: false,
+      typeArguments: const []);
+  static final mySuperclassType = NamedTypeAnnotationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'MySuperclass',
+      isNullable: false,
+      typeArguments: const []);
+  static final myClassType = NamedTypeAnnotationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'MyClass',
+      isNullable: false,
+      typeArguments: const []);
+  static final myClass = ClassDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: myClassType.name,
+      type: myClassType,
+      typeParameters: [],
+      interfaces: [myInterfaceType],
+      isAbstract: false,
+      isExternal: false,
+      mixins: [myMixinType],
+      superclass: mySuperclassType);
+  static final myConstructor = ConstructorDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'myConstructor',
+      isAbstract: false,
+      isExternal: false,
+      isGetter: false,
+      isSetter: false,
+      namedParameters: [],
+      positionalParameters: [],
+      returnType: myClassType,
+      typeParameters: [],
+      definingClass: myClassType,
+      isFactory: false);
+  static final myField = FieldDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'myField',
+      initializer: null,
+      isExternal: false,
+      isFinal: false,
+      isLate: false,
+      type: stringType,
+      definingClass: myClassType);
+  static final myInterface = ClassDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: myInterfaceType.name,
+      type: myInterfaceType,
+      typeParameters: [],
+      interfaces: [],
+      isAbstract: false,
+      isExternal: false,
+      mixins: [],
+      superclass: null);
+  static final myMethod = MethodDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: 'myMethod',
+      isAbstract: false,
+      isExternal: false,
+      isGetter: false,
+      isSetter: false,
+      namedParameters: [],
+      positionalParameters: [],
+      returnType: stringType,
+      typeParameters: [],
+      definingClass: myClassType);
+  static final myMixin = ClassDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: myMixinType.name,
+      type: myMixinType,
+      typeParameters: [],
+      interfaces: [],
+      isAbstract: false,
+      isExternal: false,
+      mixins: [],
+      superclass: null);
+  static final mySuperclass = ClassDeclarationImpl(
+      id: RemoteInstance.uniqueId,
+      name: mySuperclassType.name,
+      type: mySuperclassType,
+      typeParameters: [],
+      interfaces: [],
+      isAbstract: false,
+      isExternal: false,
+      mixins: [],
+      superclass: null);
+
+  static final myClassStaticType = TestNamedStaticType(
+      'package:my_package/my_package.dart', myClassType.name, []);
+
+  static final testTypeResolver = TestTypeResolver({
+    stringType: TestNamedStaticType('dart:core', stringType.name, []),
+    myClassType: myClassStaticType,
+  });
+  static final testClassIntrospector = TestClassIntrospector(
+    constructors: {
+      myClass: [myConstructor],
+    },
+    fields: {
+      myClass: [myField],
+    },
+    interfaces: {
+      myClass: [myInterface],
+    },
+    methods: {
+      myClass: [myMethod],
+    },
+    mixins: {
+      myClass: [myMixin],
+    },
+    superclass: {
+      myClass: mySuperclass,
+    },
+  );
+  static final testTypeDeclarationResolver =
+      TestTypeDeclarationResolver({myClassStaticType: myClass});
+}
diff --git a/tools/VERSION b/tools/VERSION
index 1cdff08..58a38b3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 58
+PRERELEASE 59
 PRERELEASE_PATCH 0
\ No newline at end of file