| Index: pkg/analyzer2dart/test/tree_shaker_test.dart
|
| diff --git a/pkg/analyzer2dart/test/tree_shaker_test.dart b/pkg/analyzer2dart/test/tree_shaker_test.dart
|
| deleted file mode 100644
|
| index cedb449c580d835d3ecee5814bd1db0a82a98703..0000000000000000000000000000000000000000
|
| --- a/pkg/analyzer2dart/test/tree_shaker_test.dart
|
| +++ /dev/null
|
| @@ -1,546 +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.
|
| -
|
| -import 'mock_sdk.dart';
|
| -import 'package:analyzer/file_system/memory_file_system.dart';
|
| -import 'package:analyzer/src/generated/ast.dart';
|
| -import 'package:analyzer/src/generated/element.dart';
|
| -import 'package:analyzer/src/generated/sdk.dart';
|
| -import 'package:analyzer/src/generated/source.dart';
|
| -import 'package:compiler/src/dart2jslib.dart' show NullSink;
|
| -import 'package:unittest/unittest.dart';
|
| -
|
| -import '../lib/src/closed_world.dart';
|
| -import '../lib/src/driver.dart';
|
| -
|
| -main() {
|
| - test('Toplevel function', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -main() {
|
| - foo();
|
| -}
|
| -foo() {
|
| -}
|
| -''');
|
| - helper.assertHasFunction('main');
|
| - helper.assertHasFunction('foo');
|
| - });
|
| -
|
| - test('Toplevel field read', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -main() {
|
| - return foo;
|
| -}
|
| -var foo;
|
| -var bar;
|
| -''');
|
| - helper.assertHasFunction('main');
|
| - helper.assertHasVariable('foo');
|
| - helper.assertNoVariable('bar');
|
| - });
|
| -
|
| - test('Toplevel field write', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -main() {
|
| - foo = 1;
|
| -}
|
| -var foo;
|
| -var bar;
|
| -''');
|
| - helper.assertHasFunction('main');
|
| - helper.assertHasVariable('foo');
|
| - helper.assertNoVariable('bar');
|
| - });
|
| -
|
| - test('Toplevel field invocation', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -main() {
|
| - return foo();
|
| -}
|
| -var foo;
|
| -var bar;
|
| -''');
|
| - helper.assertHasFunction('main');
|
| - helper.assertHasVariable('foo');
|
| - helper.assertNoVariable('bar');
|
| - });
|
| -
|
| - test('Member field invocation', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - void call() {}
|
| - void baz() {}
|
| -}
|
| -main() {
|
| - new A();
|
| - foo();
|
| -}
|
| -var foo;
|
| -var bar;
|
| -''');
|
| - helper.assertHasFunction('main');
|
| - helper.assertHasVariable('foo');
|
| - helper.assertNoVariable('bar');
|
| - helper.assertHasInstantiatedClass('A');
|
| - helper.assertHasMethod('A.call');
|
| - helper.assertNoMethod('A.baz');
|
| - });
|
| -
|
| - test('Class instantiation', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -main() {
|
| - var x = new A();
|
| -}
|
| -class A {}
|
| -class B {}
|
| -''');
|
| - helper.assertHasInstantiatedClass('A');
|
| - helper.assertNoInstantiatedClass('B');
|
| - });
|
| -
|
| - test('Super class instantiation', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -main() {
|
| - var x = new B();
|
| -}
|
| -class A {}
|
| -class B extends A {}
|
| -''');
|
| - helper.assertHasInstantiatedClass('A');
|
| - helper.assertHasInstantiatedClass('B');
|
| - });
|
| -
|
| - test('Method invocation', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -main() {
|
| - var x = new A().foo();
|
| -}
|
| -class A {
|
| - foo() {}
|
| - bar() {}
|
| -}
|
| -class B {
|
| - foo() {}
|
| - bar() {}
|
| -}
|
| -''');
|
| - helper.assertHasMethod('A.foo');
|
| - helper.assertNoMethod('A.bar');
|
| - helper.assertNoMethod('B.foo');
|
| - helper.assertNoMethod('B.bar');
|
| - });
|
| -
|
| - test('Method invocation on dynamic', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - m1() {}
|
| - m2() {}
|
| -}
|
| -foo(dynamic x) {
|
| - x.m1();
|
| -}
|
| -main() {
|
| - foo(new A());
|
| -}
|
| -''');
|
| - helper.assertHasMethod('A.m1');
|
| - helper.assertNoMethod('A.m2');
|
| - });
|
| -
|
| - test('Method invocation on dynamic via cascade', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - m1() {}
|
| - m2() {}
|
| -}
|
| -foo(dynamic x) {
|
| - x..m1()..m2();
|
| -}
|
| -main() {
|
| - foo(new A());
|
| -}
|
| -''');
|
| - helper.assertHasMethod('A.m1');
|
| - helper.assertHasMethod('A.m2');
|
| - });
|
| -
|
| - test('Getter usage', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - get g1 => null;
|
| - get g2 => null;
|
| - set g1(x) {}
|
| - set g2(x) {}
|
| -}
|
| -class B {
|
| - get g1 => null;
|
| - get g2 => null;
|
| - set g1(x) {}
|
| - set g2(x) {}
|
| -}
|
| -main() {
|
| - new A().g1;
|
| -}
|
| -''');
|
| - helper.assertHasGetter('A.g1');
|
| - helper.assertNoGetter('A.g2');
|
| - helper.assertNoGetter('B.g1');
|
| - helper.assertNoGetter('B.g2');
|
| - helper.assertNoSetter('A.g1');
|
| - helper.assertNoSetter('A.g2');
|
| - helper.assertNoSetter('B.g1');
|
| - helper.assertNoSetter('B.g2');
|
| - });
|
| -
|
| - test('Setter usage', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - get g1 => null;
|
| - get g2 => null;
|
| - set g1(x) {}
|
| - set g2(x) {}
|
| -}
|
| -class B {
|
| - get g1 => null;
|
| - get g2 => null;
|
| - set g1(x) {}
|
| - set g2(x) {}
|
| -}
|
| -main() {
|
| - new A().g1 = 1;
|
| -}
|
| -''');
|
| - helper.assertHasSetter('A.g1');
|
| - helper.assertNoSetter('A.g2');
|
| - helper.assertNoSetter('B.g1');
|
| - helper.assertNoSetter('B.g2');
|
| - helper.assertNoGetter('A.g1');
|
| - helper.assertNoGetter('A.g2');
|
| - helper.assertNoGetter('B.g1');
|
| - helper.assertNoGetter('B.g2');
|
| - });
|
| -
|
| - test('Field read', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - var f1;
|
| - var f2;
|
| -}
|
| -class B {
|
| - var f1;
|
| - var f2;
|
| -}
|
| -main() {
|
| - new A().f1;
|
| -}
|
| -''');
|
| - helper.assertHasField('A.f1');
|
| - helper.assertNoField('A.f2');
|
| - helper.assertNoField('B.f1');
|
| - helper.assertNoField('B.f2');
|
| - });
|
| -
|
| - test('Field write', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - var f1;
|
| - var f2;
|
| -}
|
| -class B {
|
| - var f1;
|
| - var f2;
|
| -}
|
| -main() {
|
| - new A().f1 = 1;
|
| -}
|
| -''');
|
| - helper.assertHasField('A.f1');
|
| - helper.assertNoField('A.f2');
|
| - helper.assertNoField('B.f1');
|
| - helper.assertNoField('B.f2');
|
| - });
|
| -
|
| - test('Ordinary constructor with initializer list', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - A() : x = f();
|
| - var x;
|
| - foo() {}
|
| -}
|
| -f() {}
|
| -main() {
|
| - new A().foo();
|
| -}
|
| -''');
|
| - helper.assertHasMethod('A.foo');
|
| - helper.assertHasFunction('f');
|
| - });
|
| -
|
| - test('Redirecting constructor', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - A.a1() : this.a2();
|
| - A.a2();
|
| - foo() {}
|
| -}
|
| -main() {
|
| - new A.a1().foo();
|
| -}
|
| -''');
|
| - helper.assertHasMethod('A.foo');
|
| - });
|
| -
|
| - test('Factory constructor', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - factory A() {
|
| - return new B();
|
| - }
|
| - foo() {}
|
| -}
|
| -class B {
|
| - B();
|
| - foo() {}
|
| -}
|
| -main() {
|
| - new A().foo();
|
| -}
|
| -''');
|
| - helper.assertHasMethod('B.foo');
|
| - helper.assertNoMethod('A.foo');
|
| - });
|
| -
|
| - test('Redirecting factory constructor', () {
|
| - var helper = new TreeShakerTestHelper('''
|
| -class A {
|
| - factory A() = B;
|
| - foo() {}
|
| -}
|
| -class B {
|
| - B();
|
| - foo() {}
|
| -}
|
| -main() {
|
| - new A().foo();
|
| -}
|
| -''');
|
| - helper.assertHasMethod('B.foo');
|
| - helper.assertNoMethod('A.foo');
|
| - });
|
| -}
|
| -
|
| -class TreeShakerTestHelper {
|
| - /**
|
| - * The name of the root file.
|
| - */
|
| - String rootFile = '/root.dart';
|
| -
|
| - /**
|
| - * ClosedWorld that resulted from tree shaking.
|
| - */
|
| - ClosedWorld world;
|
| -
|
| - /**
|
| - * Functions contained in [world], indexed by name.
|
| - */
|
| - Map<String, FunctionDeclaration> functions = <String, FunctionDeclaration>{};
|
| -
|
| - /**
|
| - * Methods contained in [world], indexed by className.methodName.
|
| - */
|
| - Map<String, MethodDeclaration> methods = <String, MethodDeclaration>{};
|
| -
|
| - /**
|
| - * Getters contained in [world], indexed by className.propertyName.
|
| - */
|
| - Map<String, MethodDeclaration> getters = <String, MethodDeclaration>{};
|
| -
|
| - /**
|
| - * Setters contained in [world], indexed by className.propertyName.
|
| - */
|
| - Map<String, MethodDeclaration> setters = <String, MethodDeclaration>{};
|
| -
|
| - /**
|
| - * Fields contained in [world], indexed by className.fieldName.
|
| - */
|
| - Map<String, VariableDeclaration> fields = <String, VariableDeclaration>{};
|
| -
|
| - /**
|
| - * Top level variables contained in [world], indexed by name.
|
| - */
|
| - Map<String, VariableDeclaration> variables = <String, VariableDeclaration>{};
|
| -
|
| - /**
|
| - * Classes instantiated in [world], indexed by name.
|
| - */
|
| - Map<String, ClassDeclaration> instantiatedClasses = <String,
|
| - ClassDeclaration>{};
|
| -
|
| - /**
|
| - * Create a TreeShakerTestHelper based on the given file contents.
|
| - */
|
| - TreeShakerTestHelper(String contents) {
|
| - MemoryResourceProvider provider = new MemoryResourceProvider();
|
| - DartSdk sdk = new MockSdk();
|
| - Driver driver = new Driver(provider, sdk, NullSink.outputProvider);
|
| - provider.newFile(rootFile, contents);
|
| - Source rootSource = driver.setRoot(rootFile);
|
| - FunctionElement entryPoint = driver.resolveEntryPoint(rootSource);
|
| - world = driver.computeWorld(entryPoint);
|
| - world.executableElements.forEach(
|
| - (ExecutableElement element, Declaration node) {
|
| - if (element is FunctionElement) {
|
| - FunctionDeclaration declaration = node as FunctionDeclaration;
|
| - expect(declaration, isNotNull);
|
| - expect(declaration.element, equals(element));
|
| - functions[element.name] = declaration;
|
| - } else if (element is MethodElement) {
|
| - MethodDeclaration declaration = node as MethodDeclaration;
|
| - expect(declaration, isNotNull);
|
| - expect(declaration.element, equals(element));
|
| - methods['${element.enclosingElement.name}.${element.name}'] =
|
| - declaration;
|
| - } else if (element is PropertyAccessorElement) {
|
| - MethodDeclaration declaration = node as MethodDeclaration;
|
| - expect(declaration, isNotNull);
|
| - expect(declaration.element, equals(element));
|
| - if (declaration.isGetter) {
|
| - getters['${element.enclosingElement.name}.${element.name}'] =
|
| - declaration;
|
| - } else if (declaration.isSetter) {
|
| - setters['${element.enclosingElement.name}.${element.displayName}'] =
|
| - declaration;
|
| - } else {
|
| - fail('Unexpected property accessor (neither getter nor setter)');
|
| - }
|
| - }
|
| - });
|
| - world.instantiatedClasses.forEach(
|
| - (ClassElement element, ClassDeclaration declaration) {
|
| - expect(declaration, isNotNull);
|
| - expect(declaration.element, equals(element));
|
| - instantiatedClasses[element.name] = declaration;
|
| - });
|
| - world.fields.forEach(
|
| - (FieldElement element, VariableDeclaration declaration) {
|
| - expect(declaration, isNotNull);
|
| - expect(declaration.element, equals(element));
|
| - fields['${element.enclosingElement.name}.${element.name}'] = declaration;
|
| - });
|
| - world.variables.forEach(
|
| - (TopLevelVariableElement element, VariableDeclaration declaration) {
|
| - expect(declaration, isNotNull);
|
| - expect(declaration.element, equals(element));
|
| - variables['${element.name}'] = declaration;
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] contains a field with the given qualified name.
|
| - */
|
| - void assertHasField(String qualifiedName) {
|
| - expect(fields, contains(qualifiedName));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] contains a top level variable with the given name.
|
| - */
|
| - void assertHasVariable(String name) {
|
| - expect(variables, contains(name));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] contains a top-level function with the given name.
|
| - */
|
| - void assertHasFunction(String name) {
|
| - expect(functions, contains(name));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] contains a getter with the given qualified name.
|
| - */
|
| - void assertHasGetter(String qualifiedName) {
|
| - expect(getters, contains(qualifiedName));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] contains a setter with the given qualified name.
|
| - */
|
| - void assertHasSetter(String qualifiedName) {
|
| - expect(setters, contains(qualifiedName));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] instantiates a class with the given name.
|
| - */
|
| - void assertHasInstantiatedClass(String name) {
|
| - expect(instantiatedClasses, contains(name));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] contains a method with the given qualified name.
|
| - *
|
| - * [qualifiedName] - the qualified name in form 'className.methodName'.
|
| - */
|
| - void assertHasMethod(String qualifiedName) {
|
| - expect(methods, contains(qualifiedName));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] doesn't contain a field with the given qualified
|
| - * name.
|
| - */
|
| - void assertNoField(String qualifiedName) {
|
| - expect(fields, isNot(contains(qualifiedName)));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] doesn't contain a top level variable with the given
|
| - * name.
|
| - */
|
| - void assertNoVariable(String name) {
|
| - expect(variables, isNot(contains(name)));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] doesn't contain a top-level function with the given
|
| - * name.
|
| - */
|
| - void assertNoFunction(String name) {
|
| - expect(functions, isNot(contains(name)));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] doesn't contain a getter with the given qualified
|
| - * name.
|
| - */
|
| - void assertNoGetter(String qualifiedName) {
|
| - expect(getters, isNot(contains(qualifiedName)));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] doesn't contain a setter with the given qualified
|
| - * name.
|
| - */
|
| - void assertNoSetter(String qualifiedName) {
|
| - expect(setters, isNot(contains(qualifiedName)));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] doesn't instantiate a class with the given name.
|
| - */
|
| - void assertNoInstantiatedClass(String name) {
|
| - expect(instantiatedClasses, isNot(contains(name)));
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [world] doesn't contain a method with the given qualified
|
| - * name.
|
| - *
|
| - * [qualifiedName] - the qualified name in form 'className.methodName'.
|
| - */
|
| - void assertNoMethod(String qualifiedName) {
|
| - expect(methods, isNot(contains(qualifiedName)));
|
| - }
|
| -}
|
|
|