Index: tests/try/poi/forget_element_test.dart |
diff --git a/tests/try/poi/forget_element_test.dart b/tests/try/poi/forget_element_test.dart |
deleted file mode 100644 |
index 095b52cecb0d9c125ecc67063d83b1a771ab52d2..0000000000000000000000000000000000000000 |
--- a/tests/try/poi/forget_element_test.dart |
+++ /dev/null |
@@ -1,404 +0,0 @@ |
-// Copyright (c) 2014, 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. |
- |
-// Test of Compiler.forgetElement. |
-library trydart.forget_element_test; |
- |
-import 'package:compiler/src/elements/elements.dart' show |
- AstElement, |
- ClassElement, |
- Element, |
- FunctionElement, |
- LocalFunctionElement, |
- MetadataAnnotation, |
- ScopeContainerElement, |
- VariableElement; |
- |
-import 'package:compiler/src/js_backend/js_backend.dart' show |
- JavaScriptBackend; |
- |
-import 'package:compiler/src/tree/tree.dart' as tree; |
- |
-import 'package:compiler/src/parser/partial_elements.dart' show |
- PartialMetadataAnnotation; |
- |
-import 'package:compiler/src/elements/visitor.dart' show |
- ElementVisitor; |
- |
-import 'package:compiler/src/compile_time_constants.dart' show |
- DartConstantCompiler; |
- |
-import 'package:compiler/src/universe/universe.dart' show |
- Universe; |
- |
-import 'package:compiler/src/dart_types.dart' show |
- DartType; |
- |
-import 'compiler_test_case.dart'; |
- |
-import 'forget_element_assertion.dart' show |
- assertUnimplementedLocalMetadata; |
- |
-class ForgetElementTestCase extends CompilerTestCase { |
- final int expectedClosureCount; |
- |
- final int expectedMetadataCount; |
- |
- final int expectedConstantCount; |
- |
- final int expectedInitialValueCount; |
- |
- final int expectedInitialDartValueCount; |
- |
- final int additionalClosureClassMaps; |
- |
- JavaScriptBackend get backend => compiler.backend; |
- |
- DartConstantCompiler get dartConstants => |
- backend.constantCompilerTask.dartConstantCompiler; |
- |
- Universe get codegenUniverse => compiler.enqueuer.codegen.universe; |
- |
- Universe get resolutionUniverse => compiler.enqueuer.resolution.universe; |
- |
- ForgetElementTestCase( |
- String source, |
- {int closureCount: 0, |
- int metadataCount: 0, |
- int constantCount: 0, |
- int initialValueCount: 0, |
- int initialDartValueCount: null, |
- this.additionalClosureClassMaps: 0}) |
- : this.expectedClosureCount = closureCount, |
- this.expectedMetadataCount = metadataCount, |
- this.expectedConstantCount = constantCount, |
- this.expectedInitialValueCount = initialValueCount, |
- // Sometimes these numbers aren't the same. Appears to happen with |
- // non-const fields, because those aren't compile-time constants in the |
- // strict language specification sense. |
- this.expectedInitialDartValueCount = (initialDartValueCount == null) |
- ? initialValueCount : initialDartValueCount, |
- super(source); |
- |
- Future run() => compile().then((LibraryElement library) { |
- |
- // Check that the compiler has recorded the expected number of closures. |
- Expect.equals( |
- expectedClosureCount, closuresInLibrary(library).length, |
- 'closure count'); |
- |
- // Check that the compiler has recorded the expected number of metadata |
- // annotations. |
- Expect.equals( |
- expectedMetadataCount, metadataInLibrary(library).length, |
- 'metadata count'); |
- |
- // Check that the compiler has recorded the expected number of |
- // constants. Since metadata is also constants, those must also be counted. |
- Expect.equals( |
- expectedConstantCount + expectedMetadataCount, |
- constantsIn(library).length, |
- 'constant count'); |
- |
- // Check that the compiler has recorded the expected number of initial |
- // values. |
- Expect.equals( |
- expectedInitialValueCount, |
- elementsWithJsInitialValuesIn(library).length, |
- 'number of fields with initial values (JS)'); |
- Expect.equals( |
- expectedInitialDartValueCount, |
- elementsWithDartInitialValuesIn(library).length, |
- 'number of fields with initial values (Dart)'); |
- |
- // Check that the compiler has recorded the expected number of closure |
- // class maps. There's always at least one, from main. Each top-level |
- // element also seems to induce one. |
- Expect.equals( |
- expectedClosureCount + additionalClosureClassMaps, |
- closureClassMapsIn(library).length - 1, |
- 'closure class map count ${closureClassMapsIn(library)}'); |
- |
- |
- // Forget about all elements. |
- library.forEachLocalMember(compiler.forgetElement); |
- |
- // Check that all the closures were forgotten. |
- Expect.isTrue(closuresInLibrary(library).isEmpty, 'closures'); |
- |
- // Check that the metadata annotations were forgotten. |
- Expect.isTrue(metadataInLibrary(library).isEmpty, 'metadata'); |
- |
- // Check that the constants were forgotten. |
- Expect.isTrue(constantsIn(library).isEmpty, 'constants'); |
- |
- // Check that initial values were forgotten. |
- Expect.isTrue( |
- elementsWithJsInitialValuesIn(library).isEmpty, |
- 'fields with initial values (JS)'); |
- Expect.isTrue( |
- elementsWithDartInitialValuesIn(library).isEmpty, |
- 'fields with initial values (Dart)'); |
- |
- // Check that closure class maps were forgotten. |
- Expect.isTrue(closureClassMapsIn(library).isEmpty, 'closure class maps'); |
- |
- // Check that istantiated types and classes were forgotten. |
- Expect.isTrue( |
- resolutionTypesIn(library).isEmpty, 'resolution instantiatedTypes'); |
- Expect.isTrue( |
- resolutionClassesIn(library).isEmpty, 'resolution instantiatedClasses'); |
- Expect.isTrue( |
- codegenTypesIn(library).isEmpty, 'codegen instantiatedTypes'); |
- Expect.isTrue( |
- codegenClassesIn(library).isEmpty, 'codegen instantiatedClasses'); |
- |
- // Check that other members remembered by [Universe] were forgotten. |
- Expect.isTrue( |
- resolutionMembersIn(library).isEmpty, 'resolution misc members'); |
- Expect.isTrue( |
- codegenMembersIn(library).isEmpty, 'codegen misc members'); |
- |
- // Check that classes remembered by the enqueuer have been forgotten. |
- Expect.isTrue( |
- codegenSeenClassesIn(library).isEmpty, 'codegen seen classes'); |
- Expect.isTrue( |
- resolutionSeenClassesIn(library).isEmpty, 'resolution seen classes'); |
- }); |
- |
- Iterable closuresInLibrary(LibraryElement library) { |
- return compiler.enqueuer.resolution.universe.allClosures.where( |
- (LocalFunctionElement closure) => closure.library == library); |
- } |
- |
- Iterable metadataInLibrary(LibraryElement library) { |
- return backend.constants.metadataConstantMap.keys.where( |
- (MetadataAnnotation metadata) { |
- return metadata.annotatedElement.library == library; |
- }); |
- } |
- |
- Iterable<tree.Node> nodesIn(LibraryElement library) { |
- NodeCollector collector = new NodeCollector(); |
- library.forEachLocalMember((e) { |
- if (e is AstElement && e.hasNode) { |
- e.node.accept(collector); |
- } |
- |
- // Due to quirks of history, only parameter metadata is recorded in AST |
- // nodes, so they must be extracted from the elements. |
- for (MetadataAnnotation metadata in e.metadata) { |
- if (metadata is PartialMetadataAnnotation) { |
- if (metadata.cachedNode != null) { |
- metadata.cachedNode.accept(collector); |
- } |
- } |
- } |
- }); |
- |
- List<MetadataAnnotation> metadata = |
- (new MetadataCollector()..visit(library, null)).metadata; |
- return collector.nodes; |
- } |
- |
- Iterable constantsIn(LibraryElement library) { |
- return nodesIn(library) |
- .map((node) => backend.constants.nodeConstantMap[node]) |
- .where((constant) => constant != null); |
- } |
- |
- Iterable elementsWithJsInitialValuesIn(LibraryElement library) { |
- return backend.constants.initialVariableValues.keys.where( |
- (VariableElement element) => element.library == library); |
- } |
- |
- Iterable elementsWithDartInitialValuesIn(LibraryElement library) { |
- return dartConstants.initialVariableValues.keys.where( |
- (VariableElement element) => element.library == library); |
- } |
- |
- Iterable closureClassMapsIn(LibraryElement library) { |
- Map cache = compiler.closureToClassMapper.closureMappingCache; |
- return nodesIn(library).where((node) => cache[node] != null); |
- } |
- |
- Iterable codegenTypesIn(LibraryElement library) { |
- return codegenUniverse.instantiatedTypes.where( |
- (DartType type) => type.element.library == library); |
- } |
- |
- Iterable codegenClassesIn(LibraryElement library) { |
- return codegenUniverse.directlyInstantiatedClasses.where( |
- (ClassElement cls) => cls.library == library); |
- } |
- |
- Iterable codegenMembersIn(LibraryElement library) { |
- sameLibrary(e) => e.library == library; |
- return new Set() |
- ..addAll(codegenUniverse.closurizedMembers.where(sameLibrary)) |
- ..addAll(codegenUniverse.fieldSetters.where(sameLibrary)) |
- ..addAll(codegenUniverse.fieldGetters.where(sameLibrary)); |
- } |
- |
- Iterable resolutionTypesIn(LibraryElement library) { |
- return resolutionUniverse.instantiatedTypes.where( |
- (DartType type) => type.element.library == library); |
- } |
- |
- Iterable resolutionClassesIn(LibraryElement library) { |
- return resolutionUniverse.directlyInstantiatedClasses.where( |
- (ClassElement cls) => cls.library == library); |
- } |
- |
- Iterable resolutionMembersIn(LibraryElement library) { |
- sameLibrary(e) => e.library == library; |
- return new Set() |
- ..addAll(resolutionUniverse.closurizedMembers.where(sameLibrary)) |
- ..addAll(resolutionUniverse.fieldSetters.where(sameLibrary)) |
- ..addAll(resolutionUniverse.fieldGetters.where(sameLibrary)); |
- } |
- |
- Iterable codegenSeenClassesIn(LibraryElement library) { |
- return compiler.enqueuer.codegen.processedClasses.where( |
- (e) => e.library == library); |
- } |
- |
- Iterable resolutionSeenClassesIn(LibraryElement library) { |
- return compiler.enqueuer.resolution.processedClasses.where( |
- (e) => e.library == library); |
- } |
-} |
- |
-class NodeCollector extends tree.Visitor { |
- final List<tree.Node> nodes = <tree.Node>[]; |
- |
- void visitNode(tree.Node node) { |
- nodes.add(node); |
- node.visitChildren(this); |
- } |
-} |
- |
-class MetadataCollector extends ElementVisitor { |
- final List<MetadataAnnotation> metadata = <MetadataAnnotation>[]; |
- |
- void visitElement(Element e, _) { |
- metadata.addAll(e.metadata.toList()); |
- } |
- |
- void visitScopeContainerElement(ScopeContainerElement e, _) { |
- super.visitScopeContainerElement(e); |
- e.forEachLocalMember(this.visit); |
- } |
- |
- void visitFunctionElement(FunctionElement e, _) { |
- super.visitFunctionElement(e); |
- if (e.hasFunctionSignature) { |
- e.functionSignature.forEachParameter(this.visit); |
- } |
- } |
-} |
- |
-void main() { |
- runTests(tests); |
-} |
- |
-List<CompilerTestCase> get tests => <CompilerTestCase>[ |
- |
- // Edge case: empty body. |
- new ForgetElementTestCase( |
- 'main() {}'), |
- |
- // Edge case: simple arrow function. |
- new ForgetElementTestCase( |
- 'main() => null;'), |
- |
- // Test that a local closure is discarded correctly. |
- new ForgetElementTestCase( |
- 'main() => (() => null)();', |
- closureCount: 1), |
- |
- // Test that nested closures are discarded correctly. |
- new ForgetElementTestCase( |
- 'main() => (() => (() => null)())();', |
- closureCount: 2), |
- |
- // Test that nested closures are discarded correctly. |
- new ForgetElementTestCase( |
- 'main() => (() => (() => (() => null)())())();', |
- closureCount: 3), |
- |
- // Test that metadata on top-level function is discarded correctly. |
- new ForgetElementTestCase( |
- '@Constant() main() => null; $CONSTANT_CLASS', |
- metadataCount: 1), |
- |
- // Test that metadata on top-level variable is discarded correctly. |
- new ForgetElementTestCase( |
- '@Constant() var x; main() => x; $CONSTANT_CLASS', |
- metadataCount: 1, |
- initialValueCount: 1, |
- initialDartValueCount: 0), |
- |
- // Test that metadata on parameter on a local function is discarded |
- // correctly. |
- new ForgetElementTestCase( |
- 'main() => ((@Constant() x) => x)(null); $CONSTANT_CLASS', |
- closureCount: 1, |
- metadataCount: 1), |
- |
- // Test that a constant in a top-level method body is discarded |
- // correctly. |
- new ForgetElementTestCase( |
- 'main() => const Constant(); $CONSTANT_CLASS', |
- constantCount: 1), |
- |
- // Test that a constant in a nested function body is discarded |
- // correctly. |
- new ForgetElementTestCase( |
- 'main() => (() => const Constant())(); $CONSTANT_CLASS', |
- constantCount: 1, |
- closureCount: 1), |
- |
- // Test that a constant in a nested function body is discarded |
- // correctly. |
- new ForgetElementTestCase( |
- 'main() => (() => (() => const Constant())())(); $CONSTANT_CLASS', |
- constantCount: 1, |
- closureCount: 2), |
- |
- // Test that a constant in a top-level variable initializer is |
- // discarded correctly. |
- new ForgetElementTestCase( |
- 'main() => x; var x = const Constant(); $CONSTANT_CLASS', |
- constantCount: 1, |
- initialValueCount: 1, |
- initialDartValueCount: 0, |
- additionalClosureClassMaps: 1), |
- |
- // Test that a constant in a parameter initializer is discarded |
- // correctly. |
- new ForgetElementTestCase( |
- 'main([x = const Constant()]) => x; $CONSTANT_CLASS', |
- constantCount: 1, |
- initialValueCount: 1), |
- |
- // Test that a constant in a parameter initializer is discarded |
- // correctly (nested function). |
- new ForgetElementTestCase( |
- 'main() => (([x = const Constant()]) => x)(); $CONSTANT_CLASS', |
- closureCount: 1, |
- constantCount: 1, |
- initialValueCount: 1), |
- |
- // Test that a constant in a parameter initializer is discarded |
- // correctly (deeply nested function). |
- new ForgetElementTestCase( |
- 'main() => (() => (([x = const Constant()]) => x)())();' |
- ' $CONSTANT_CLASS', |
- closureCount: 2, |
- constantCount: 1, |
- initialValueCount: 1), |
- |
- // TODO(ahe): Add test for super sends [backend.aliasedSuperMembers]. |
-]..addAll(assertUnimplementedLocalMetadata()); |