Files
sdk/pkg/kernel/lib/transformations/scanner.dart
T
jlcontreras 69b194e88f [cfe] Implements ValueClassScanner
Change-Id: I36b839280513a75d92797d5999ecb567e6999a5c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162180
Commit-Queue: Javier López-Contreras <jlcontreras@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
2020-09-09 14:10:08 +00:00

52 lines
1.3 KiB
Dart

library kernel.transformations.scanner;
import '../ast.dart';
import '../kernel.dart';
abstract class Scanner<X extends TreeNode, Y extends TreeNode> {
final Scanner<Y, TreeNode> next;
Scanner(this.next);
bool predicate(X x);
ScanResult<X, Y> scan(TreeNode node);
}
class ScanResult<X extends TreeNode, Y extends TreeNode> {
Map<X, ScanResult<Y, TreeNode>> targets;
Map<X, ScanError> errors;
}
class ScanError {}
abstract class ClassScanner<Y extends TreeNode> implements Scanner<Class, Y> {
final Scanner<Y, TreeNode> next;
ClassScanner(this.next);
bool predicate(Class node);
ScanResult<Class, Y> scan(TreeNode node) {
ScanResult<Class, Y> result = new ScanResult();
result.targets = new Map();
if (node is Class) {
if (predicate(node)) {
result.targets[node] = next?.scan(node);
}
} else if (node is Library) {
for (Class cls in node.classes) {
if (predicate(cls)) {
result.targets[cls] = next?.scan(cls);
}
}
} else if (node is Component) {
for (Library library in node.libraries) {
for (Class cls in library.classes) {
if (predicate(cls)) {
result.targets[cls] = next?.scan(cls);
}
}
}
}
return result;
}
}