blob: 6857d34b08114b7a1127ec119c71497ff5a68201 [file] [log] [blame]
// Copyright (c) 2021, 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 'package:analyzer/dart/ast/ast.dart' as ast;
import 'package:analyzer/src/macro/api/code.dart';
import 'package:analyzer/src/macro/api/macro.dart';
class ObservableMacro implements FieldDeclarationMacro {
const ObservableMacro();
@override
void visitFieldDeclaration(
ast.FieldDeclaration node,
ClassDeclarationBuilder builder,
) {
var typeNode = node.fields.type;
if (typeNode == null) {
throw ArgumentError('@observable can only annotate typed fields.');
}
var typeCode = builder.typeAnnotationCode(typeNode);
var fields = node.fields.variables;
for (var field in fields) {
var name = field.name.name;
if (!name.startsWith('_')) {
throw ArgumentError(
'@observable can only annotate private fields, and it will create '
'public getters and setters for them, but the public field '
'$name was annotated.',
);
}
var publicName = name.substring(1);
var getter = Declaration(
'$typeCode get $publicName => $name;',
);
builder.addToClass(getter);
var setter = Declaration('''
set $publicName($typeCode val) {
print('Setting $publicName to \${val}');
$name = val;
}''');
builder.addToClass(setter);
}
}
}