blob: 9b3df34aae8fbb8cad08886ceb91d4c78131562c [file] [log] [blame]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'package:_fe_analyzer_shared/src/macros/api.dart';
macro
class ToStringMacro implements ClassDeclarationsMacro {
const ToStringMacro();
@override
FutureOr<void> buildDeclarationsForClass(ClassDeclaration clazz,
ClassMemberDeclarationBuilder builder) async {
Iterable<MethodDeclaration> methods = await builder.methodsOf(clazz);
if (!methods.any((m) => m.identifier.name == 'toString')) {
Iterable<FieldDeclaration> fields = await builder.fieldsOf(clazz);
Uri dartCore = Uri.parse('dart:core');
Identifier stringClass =
await builder.resolveIdentifier(dartCore, 'String');
List<Object> parts = [stringClass, '''
toString() {
return "${clazz.identifier.name}('''
];
String comma = '';
for (FieldDeclaration field in fields) {
parts.add(comma);
parts.add('${field.identifier.name}=\${');
parts.add(field.identifier.name);
parts.add('}');
comma = ',';
}
parts.add(''')";
}''');
builder.declareInClass(new DeclarationCode.fromParts(parts));
}
}
}
macro
class InjectMacro implements ClassDeclarationsMacro {
const InjectMacro();
@override
FutureOr<void> buildDeclarationsForClass(ClassDeclaration clazz,
ClassMemberDeclarationBuilder builder) async {
Iterable<MethodDeclaration> methods = await builder.methodsOf(clazz);
if (!methods.any((m) => m.identifier.name == 'injectedMethod')) {
builder.declareInClass(new DeclarationCode.fromString('''
void injectedMethod() {}'''));
}
}
}