Index: pkg/kernel/lib/checks.dart |
diff --git a/pkg/kernel/lib/checks.dart b/pkg/kernel/lib/checks.dart |
deleted file mode 100644 |
index 5d77332d64fd873e8c544e54ccd4b020a9267558..0000000000000000000000000000000000000000 |
--- a/pkg/kernel/lib/checks.dart |
+++ /dev/null |
@@ -1,167 +0,0 @@ |
-// Copyright (c) 2016, 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. |
-library kernel.checks; |
- |
-import 'ast.dart'; |
-import 'transformations/flags.dart'; |
- |
-void runSanityChecks(Program program) { |
- SanityCheck.check(program); |
-} |
- |
-/// Checks that references refer to something in scope. |
-/// |
-/// Currently only checks member, class, and type parameter references. |
-class SanityCheck extends RecursiveVisitor { |
- final Set<Class> classes = new Set<Class>(); |
- final Set<TypeParameter> typeParameters = new Set<TypeParameter>(); |
- |
- Member currentMember; |
- Class currentClass; |
- TreeNode currentParent; |
- |
- TreeNode get context => currentMember ?? currentClass; |
- |
- static void check(Program program) { |
- program.accept(new SanityCheck()); |
- } |
- |
- defaultTreeNode(TreeNode node) { |
- visitChildren(node); |
- } |
- |
- void visitChildren(TreeNode node) { |
- if (!identical(node.parent, currentParent)) { |
- throw 'Parent pointer on ${node.runtimeType} ' |
- 'is ${node.parent.runtimeType} ' |
- 'but should be ${currentParent.runtimeType}'; |
- } |
- var oldParent = currentParent; |
- currentParent = node; |
- node.visitChildren(this); |
- currentParent = oldParent; |
- } |
- |
- void declareMember(Member member) { |
- if (member.transformerFlags & TransformerFlag.seenBySanityCheck != 0) { |
- throw '$member has been declared more than once'; |
- } |
- member.transformerFlags |= TransformerFlag.seenBySanityCheck; |
- } |
- |
- void undeclareMember(Member member) { |
- member.transformerFlags &= ~TransformerFlag.seenBySanityCheck; |
- } |
- |
- visitProgram(Program program) { |
- for (var library in program.libraries) { |
- classes.addAll(library.classes); |
- library.members.forEach(declareMember); |
- for (var class_ in library.classes) { |
- class_.members.forEach(declareMember); |
- } |
- } |
- visitChildren(program); |
- for (var library in program.libraries) { |
- library.members.forEach(undeclareMember); |
- for (var class_ in library.classes) { |
- class_.members.forEach(undeclareMember); |
- } |
- } |
- } |
- |
- defaultMember(Member node) { |
- currentMember = node; |
- visitChildren(node); |
- currentMember = null; |
- } |
- |
- visitClass(Class node) { |
- currentClass = node; |
- typeParameters.addAll(node.typeParameters); |
- visitChildren(node); |
- typeParameters.removeAll(node.typeParameters); |
- currentClass = null; |
- } |
- |
- visitFunctionNode(FunctionNode node) { |
- typeParameters.addAll(node.typeParameters); |
- visitChildren(node); |
- typeParameters.removeAll(node.typeParameters); |
- } |
- |
- visitFunctionType(FunctionType node) { |
- for (int i = 1; i < node.namedParameters.length; ++i) { |
- if (node.namedParameters[i - 1].compareTo(node.namedParameters[i]) >= 0) { |
- throw 'Named parameters are not sorted on function type found in ' |
- '$context'; |
- } |
- } |
- typeParameters.addAll(node.typeParameters); |
- for (var typeParameter in node.typeParameters) { |
- typeParameter.bound?.accept(this); |
- } |
- visitList(node.positionalParameters, this); |
- visitList(node.namedParameters, this); |
- node.returnType.accept(this); |
- typeParameters.removeAll(node.typeParameters); |
- } |
- |
- @override |
- defaultMemberReference(Member node) { |
- if (node.transformerFlags & TransformerFlag.seenBySanityCheck == 0) { |
- throw 'Dangling reference to $node found in $context.\n' |
- 'Parent pointer is set to ${node.parent}'; |
- } |
- } |
- |
- @override |
- visitClassReference(Class node) { |
- if (!classes.contains(node)) { |
- throw 'Dangling reference to $node found in $context.\n' |
- 'Parent pointer is set to ${node.parent}'; |
- } |
- } |
- |
- @override |
- visitTypeParameterType(TypeParameterType node) { |
- if (!typeParameters.contains(node.parameter)) { |
- throw 'Type parameter ${node.parameter} referenced out of scope ' |
- 'in $context.\n' |
- 'Parent pointer is set to ${node.parameter.parent}'; |
- } |
- } |
- |
- @override |
- visitInterfaceType(InterfaceType node) { |
- node.visitChildren(this); |
- if (node.typeArguments.length != node.classNode.typeParameters.length) { |
- throw 'Type $node provides ${node.typeArguments.length} type arguments ' |
- 'but the class declares ${node.classNode.typeParameters.length} ' |
- 'parameters. Found in $context.'; |
- } |
- } |
-} |
- |
-class CheckParentPointers extends Visitor { |
- static void check(TreeNode node) { |
- node.accept(new CheckParentPointers(node.parent)); |
- } |
- |
- TreeNode parent; |
- |
- CheckParentPointers([this.parent]); |
- |
- defaultTreeNode(TreeNode node) { |
- if (node.parent != parent) { |
- throw 'Parent pointer on ${node.runtimeType} ' |
- 'is ${node.parent.runtimeType} ' |
- 'but should be ${parent.runtimeType}'; |
- } |
- var oldParent = parent; |
- parent = node; |
- node.visitChildren(this); |
- parent = oldParent; |
- } |
-} |