Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 69b194e

Browse files
[cfe] Implements ValueClassScanner
Change-Id: I36b839280513a75d92797d5999ecb567e6999a5c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162180 Commit-Queue: Javier López-Contreras <[email protected]> Reviewed-by: Dmitry Stefantsov <[email protected]>
1 parent a8f9f08 commit 69b194e

File tree

2 files changed

+73
-6
lines changed

2 files changed

+73
-6
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
library kernel.transformations.scanner;
2+
3+
import '../ast.dart';
4+
import '../kernel.dart';
5+
6+
abstract class Scanner<X extends TreeNode, Y extends TreeNode> {
7+
final Scanner<Y, TreeNode> next;
8+
Scanner(this.next);
9+
bool predicate(X x);
10+
ScanResult<X, Y> scan(TreeNode node);
11+
}
12+
13+
class ScanResult<X extends TreeNode, Y extends TreeNode> {
14+
Map<X, ScanResult<Y, TreeNode>> targets;
15+
Map<X, ScanError> errors;
16+
}
17+
18+
class ScanError {}
19+
20+
abstract class ClassScanner<Y extends TreeNode> implements Scanner<Class, Y> {
21+
final Scanner<Y, TreeNode> next;
22+
23+
ClassScanner(this.next);
24+
25+
bool predicate(Class node);
26+
27+
ScanResult<Class, Y> scan(TreeNode node) {
28+
ScanResult<Class, Y> result = new ScanResult();
29+
result.targets = new Map();
30+
if (node is Class) {
31+
if (predicate(node)) {
32+
result.targets[node] = next?.scan(node);
33+
}
34+
} else if (node is Library) {
35+
for (Class cls in node.classes) {
36+
if (predicate(cls)) {
37+
result.targets[cls] = next?.scan(cls);
38+
}
39+
}
40+
} else if (node is Component) {
41+
for (Library library in node.libraries) {
42+
for (Class cls in library.classes) {
43+
if (predicate(cls)) {
44+
result.targets[cls] = next?.scan(cls);
45+
}
46+
}
47+
}
48+
}
49+
return result;
50+
}
51+
}

pkg/kernel/lib/transformations/value_class.dart

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,31 @@ import '../ast.dart';
88
import '../kernel.dart';
99
import '../core_types.dart' show CoreTypes;
1010
import '../class_hierarchy.dart' show ClassHierarchy;
11+
import './scanner.dart';
12+
13+
class ValueClassScanner extends ClassScanner<Null> {
14+
ValueClassScanner() : super(null);
15+
16+
bool predicate(Class node) {
17+
for (Expression annotation in node.annotations) {
18+
if (annotation is ConstantExpression &&
19+
annotation.constant is StringConstant) {
20+
StringConstant constant = annotation.constant;
21+
if (constant.value == 'valueClass') {
22+
return true;
23+
}
24+
}
25+
}
26+
return false;
27+
}
28+
}
1129

1230
void transformComponent(
1331
Component node, CoreTypes coreTypes, ClassHierarchy hierarchy) {
14-
for (Library library in node.libraries) {
15-
for (Class cls in library.classes) {
16-
if (isValueClass(cls)) {
17-
transformValueClass(cls, coreTypes, hierarchy);
18-
}
19-
}
32+
ValueClassScanner scanner = new ValueClassScanner();
33+
ScanResult<Class, Null> valueClasses = scanner.scan(node);
34+
for (Class valueClass in valueClasses.targets.keys) {
35+
transformValueClass(valueClass, coreTypes, hierarchy);
2036
}
2137
}
2238

0 commit comments

Comments
 (0)