Skip to content

Commit 09f674e

Browse files
authored
[macros] Add ClassGeneratorMacro. (#3869)
1 parent 3e96a79 commit 09f674e

File tree

4 files changed

+54
-120
lines changed

4 files changed

+54
-120
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'dart:async';
6+
7+
import 'package:dart_model/model.dart';
8+
import 'package:dart_model/query.dart';
9+
import 'package:macro_client/macro.dart';
10+
import 'package:macro_protocol/host.dart';
11+
import 'package:macro_protocol/message.dart';
12+
13+
abstract class ClassGeneratorMacro implements Macro {
14+
final Model model = Model();
15+
16+
@override
17+
Future<void> start(Host host) async {
18+
final stream = await host.watch(Query.annotation(name));
19+
stream.listen((round) => generate(host, round));
20+
}
21+
22+
void generate(Host host, Round round) async {
23+
final delta = round.delta;
24+
delta.update(model);
25+
26+
final augmentationsByUri = <String, String>{};
27+
for (final uri in delta.uris) {
28+
final library = model.library(uri)!;
29+
final result = StringBuffer();
30+
for (final scope in library.scopes) {
31+
final clazz = scope.asInterface!;
32+
result.write(generateFor(clazz));
33+
}
34+
35+
augmentationsByUri[uri] = result.toString();
36+
}
37+
38+
unawaited(host.augment(
39+
macro: name,
40+
round: round.round,
41+
augmentationsByUri: augmentationsByUri));
42+
}
43+
44+
String generateFor(Interface clazz);
45+
}

working/macros/dart_model/testing/test_macros/lib/equals_macro.dart

Lines changed: 3 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,52 +2,15 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'dart:async';
6-
75
import 'package:dart_model/model.dart';
8-
import 'package:dart_model/query.dart';
9-
import 'package:macro_client/macro.dart';
10-
import 'package:macro_protocol/host.dart';
11-
import 'package:macro_protocol/message.dart';
12-
13-
class EqualsMacro implements Macro {
14-
final Model model = Model();
6+
import 'package:macro_client/class_generator_macro.dart';
157

8+
class EqualsMacro extends ClassGeneratorMacro {
169
@override
1710
QualifiedName get name => QualifiedName(
18-
uri: 'package:test_macros/equals_macro.dart', name: 'EqualsMacro');
11+
uri: 'package:test_macros_annotations/annotations.dart', name: 'Equals');
1912

2013
@override
21-
Future<void> start(Host host) async {
22-
final stream = await host.watch(Query.annotation(QualifiedName(
23-
uri: 'package:test_macro_annotations/annotations.dart',
24-
name: 'Equals',
25-
)));
26-
stream.listen((round) => generate(host, round));
27-
}
28-
29-
void generate(Host host, Round round) async {
30-
final delta = round.delta;
31-
delta.update(model);
32-
33-
final augmentationsByUri = <String, String>{};
34-
for (final uri in delta.uris) {
35-
final library = model.library(uri)!;
36-
final result = StringBuffer();
37-
for (final scope in library.scopes) {
38-
final clazz = scope.asInterface!;
39-
result.write(generateFor(clazz));
40-
}
41-
42-
augmentationsByUri[uri] = result.toString();
43-
}
44-
45-
unawaited(host.augment(
46-
macro: name,
47-
round: round.round,
48-
augmentationsByUri: augmentationsByUri));
49-
}
50-
5114
String generateFor(Interface clazz) {
5215
final result = StringBuffer();
5316

working/macros/dart_model/testing/test_macros/lib/hash_code_macro.dart

Lines changed: 3 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,52 +2,15 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'dart:async';
6-
75
import 'package:dart_model/model.dart';
8-
import 'package:dart_model/query.dart';
9-
import 'package:macro_client/macro.dart';
10-
import 'package:macro_protocol/host.dart';
11-
import 'package:macro_protocol/message.dart';
12-
13-
class HashCodeMacro implements Macro {
14-
final Model model = Model();
6+
import 'package:macro_client/class_generator_macro.dart';
157

8+
class HashCodeMacro extends ClassGeneratorMacro {
169
@override
1710
QualifiedName get name => QualifiedName(
18-
uri: 'package:test_macros/hash_code_macro.dart', name: 'HashCodeMacro');
11+
uri: 'package:test_macro_annotations/annotations.dart', name: 'HashCode');
1912

2013
@override
21-
Future<void> start(Host host) async {
22-
final stream = await host.watch(Query.annotation(QualifiedName(
23-
uri: 'package:test_macro_annotations/annotations.dart',
24-
name: 'HashCode',
25-
)));
26-
stream.listen((round) => generate(host, round));
27-
}
28-
29-
void generate(Host host, Round round) async {
30-
final delta = round.delta;
31-
delta.update(model);
32-
33-
final augmentationsByUri = <String, String>{};
34-
for (final uri in delta.uris) {
35-
final library = model.library(uri)!;
36-
final result = StringBuffer();
37-
for (final scope in library.scopes) {
38-
final clazz = scope.asInterface!;
39-
result.write(generateFor(clazz));
40-
}
41-
42-
augmentationsByUri[uri] = result.toString();
43-
}
44-
45-
unawaited(host.augment(
46-
macro: name,
47-
round: round.round,
48-
augmentationsByUri: augmentationsByUri));
49-
}
50-
5114
String generateFor(Interface clazz) {
5215
final result = StringBuffer();
5316

working/macros/dart_model/testing/test_macros/lib/to_string_macro.dart

Lines changed: 3 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,52 +2,15 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'dart:async';
6-
75
import 'package:dart_model/model.dart';
8-
import 'package:dart_model/query.dart';
9-
import 'package:macro_client/macro.dart';
10-
import 'package:macro_protocol/host.dart';
11-
import 'package:macro_protocol/message.dart';
12-
13-
class ToStringMacro implements Macro {
14-
final Model model = Model();
6+
import 'package:macro_client/class_generator_macro.dart';
157

8+
class ToStringMacro extends ClassGeneratorMacro {
169
@override
1710
QualifiedName get name => QualifiedName(
18-
uri: 'package:test_macros/to_string_macro.dart', name: 'ToStringMacro');
11+
uri: 'package:test_macro_annotations/annotations.dart', name: 'ToString');
1912

2013
@override
21-
Future<void> start(Host host) async {
22-
final stream = await host.watch(Query.annotation(QualifiedName(
23-
uri: 'package:test_macro_annotations/annotations.dart',
24-
name: 'ToString',
25-
)));
26-
stream.listen((round) => generate(host, round));
27-
}
28-
29-
void generate(Host host, Round round) async {
30-
final delta = round.delta;
31-
delta.update(model);
32-
33-
final augmentationsByUri = <String, String>{};
34-
for (final uri in delta.uris) {
35-
final library = model.library(uri)!;
36-
final result = StringBuffer();
37-
for (final scope in library.scopes) {
38-
final clazz = scope.asInterface!;
39-
result.write(generateFor(clazz));
40-
}
41-
42-
augmentationsByUri[uri] = result.toString();
43-
}
44-
45-
unawaited(host.augment(
46-
macro: name,
47-
round: round.round,
48-
augmentationsByUri: augmentationsByUri));
49-
}
50-
5114
String generateFor(Interface clazz) {
5215
final result = StringBuffer();
5316

0 commit comments

Comments
 (0)