blob: 5083fa621e4872f1cee933aec4a3b5859d6008df [file] [log] [blame]
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;
}
}