Index: pkg/analyzer2dart/test/identifier_semantics_test.dart |
diff --git a/pkg/analyzer2dart/test/identifier_semantics_test.dart b/pkg/analyzer2dart/test/identifier_semantics_test.dart |
deleted file mode 100644 |
index 0801e7a3d78eee4d7bed07cc066421f3d168cd79..0000000000000000000000000000000000000000 |
--- a/pkg/analyzer2dart/test/identifier_semantics_test.dart |
+++ /dev/null |
@@ -1,2536 +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 'package:analyzer/analyzer.dart'; |
-import 'package:analyzer/file_system/file_system.dart'; |
-import 'package:analyzer/file_system/memory_file_system.dart'; |
-import 'package:analyzer/src/generated/element.dart'; |
-import 'package:analyzer/src/generated/engine.dart'; |
-import 'package:analyzer/src/generated/sdk.dart'; |
-import 'package:analyzer/src/generated/source.dart'; |
-import 'package:analyzer/src/generated/source_io.dart'; |
-import 'package:analyzer2dart/src/identifier_semantics.dart'; |
-import 'package:unittest/unittest.dart'; |
- |
-import 'mock_sdk.dart'; |
- |
-main() { |
- test('Call function defined at top level', () { |
- Helper helper = new Helper(''' |
-g() {} |
- |
-f() { |
- g(); |
-} |
-'''); |
- helper.checkStaticMethod('g()', null, 'g', true, isInvoke: true); |
- }); |
- |
- test('Call function defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.g(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-g() {} |
-'''); |
- helper.checkStaticMethod('l.g()', null, 'g', true, isInvoke: true); |
- }); |
- |
- test('Call method defined statically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static g() {} |
- |
- f() { |
- g(); |
- } |
-} |
-'''); |
- helper.checkStaticMethod('g()', 'A', 'g', true, isInvoke: true); |
- }); |
- |
- test('Call method defined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static g() {} |
-} |
-f() { |
- A.g(); |
-} |
-'''); |
- helper.checkStaticMethod('A.g()', 'A', 'g', true, isInvoke: true); |
- }); |
- |
- test( |
- 'Call method defined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.A.g(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A { |
- static g() {} |
-} |
-'''); |
- helper.checkStaticMethod('l.A.g()', 'A', 'g', true, isInvoke: true); |
- }); |
- |
- test('Call method defined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- g() {} |
- |
- f() { |
- g(); |
- } |
-} |
-'''); |
- helper.checkDynamic('g()', null, 'g', isInvoke: true); |
- }); |
- |
- test( |
- 'Call method defined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- g() {} |
-} |
-f(A a) { |
- a.g(); |
-} |
-'''); |
- helper.checkDynamic('a.g()', 'a', 'g', isInvoke: true); |
- }); |
- |
- test( |
- 'Call method defined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- g() {} |
-} |
-A h() => null; |
-f() { |
- h().g(); |
-} |
-'''); |
- helper.checkDynamic('h().g()', 'h()', 'g', isInvoke: true); |
- }); |
- |
- test( |
- 'Call method defined dynamically in class from outside class via dynamic var', |
- () { |
- Helper helper = new Helper(''' |
-f(a) { |
- a.g(); |
-} |
-'''); |
- helper.checkDynamic('a.g()', 'a', 'g', isInvoke: true); |
- }); |
- |
- test( |
- 'Call method defined dynamically in class from outside class via dynamic expression', |
- () { |
- Helper helper = new Helper(''' |
-h() => null; |
-f() { |
- h().g(); |
-} |
-'''); |
- helper.checkDynamic('h().g()', 'h()', 'g', isInvoke: true); |
- }); |
- |
- test('Call method defined locally', () { |
- Helper helper = new Helper(''' |
-f() { |
- g() {} |
- g(); |
-} |
-'''); |
- helper.checkLocalFunction('g()', 'g', isInvoke: true); |
- }); |
- |
- test('Call method undefined at top level', () { |
- Helper helper = new Helper(''' |
-f() { |
- g(); |
-} |
-'''); |
- // Undefined top level invocations are treated as dynamic. |
- // TODO(paulberry): not sure if this is a good idea. In general, when such |
- // a call appears inside an instance method, it is dynamic, because "this" |
- // might be an instance of a derived class that implements g(). However, |
- // in this case, we are not inside an instance method, so we know that the |
- // target is undefined. |
- helper.checkDynamic('g()', null, 'g', isInvoke: true); |
- }); |
- |
- test('Call method undefined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.g(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
-'''); |
- // Undefined top level invocations are treated as dynamic. |
- // TODO(paulberry): not sure if this is a good idea, for similar reasons to |
- // the case above. |
- helper.checkDynamic('l.g()', null, 'g', isInvoke: true); |
- }); |
- |
- test('Call method undefined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-f() { |
- A.g(); |
-} |
-'''); |
- helper.checkStaticMethod('A.g()', 'A', 'g', false, isInvoke: true); |
- }); |
- |
- test( |
- 'Call method undefined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.A.g(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A {} |
-'''); |
- helper.checkStaticMethod('l.A.g()', 'A', 'g', false, isInvoke: true); |
- }); |
- |
- test('Call method undefined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- f() { |
- g(); |
- } |
-} |
-'''); |
- helper.checkDynamic('g()', null, 'g', isInvoke: true); |
- }); |
- |
- test( |
- 'Call method undefined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-f(A a) { |
- a.g(); |
-} |
-'''); |
- helper.checkDynamic('a.g()', 'a', 'g', isInvoke: true); |
- }); |
- |
- test( |
- 'Call method undefined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-A h() => null; |
- |
-f() { |
- h().g(); |
-} |
-'''); |
- helper.checkDynamic('h().g()', 'h()', 'g', isInvoke: true); |
- }); |
- |
- test('Call variable defined at top level', () { |
- Helper helper = new Helper(''' |
-var x; |
- |
-f() { |
- x(); |
-} |
-'''); |
- helper.checkStaticField('x()', null, 'x', isInvoke: true); |
- }); |
- |
- test('Call variable defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.x(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-var x; |
-'''); |
- helper.checkStaticField('l.x()', null, 'x', isInvoke: true); |
- }); |
- |
- test('Call field defined statically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static var x; |
- |
- f() { |
- return x(); |
- } |
-} |
-'''); |
- helper.checkStaticField('x()', 'A', 'x', isInvoke: true); |
- }); |
- |
- test('Call field defined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static var x; |
-} |
- |
-f() { |
- return A.x(); |
-} |
-'''); |
- helper.checkStaticField('A.x()', 'A', 'x', isInvoke: true); |
- }); |
- |
- test( |
- 'Call field defined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.A.x(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A { |
- static var x; |
-} |
-'''); |
- helper.checkStaticField('l.A.x()', 'A', 'x', isInvoke: true); |
- }); |
- |
- test('Call field defined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
- |
- f() { |
- return x(); |
- } |
-} |
-'''); |
- helper.checkDynamic('x()', null, 'x', isInvoke: true); |
- }); |
- |
- test( |
- 'Call field defined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
-} |
- |
-f(A a) { |
- return a.x(); |
-} |
-'''); |
- helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true); |
- }); |
- |
- test( |
- 'Call field defined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
-} |
- |
-A h() => null; |
- |
-f() { |
- return h().x(); |
-} |
-'''); |
- helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true); |
- }); |
- |
- test( |
- 'Call field defined dynamically in class from outside class via dynamic var', |
- () { |
- Helper helper = new Helper(''' |
-f(a) { |
- return a.x(); |
-} |
-'''); |
- helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true); |
- }); |
- |
- test( |
- 'Call field defined dynamically in class from outside class via dynamic expression', |
- () { |
- Helper helper = new Helper(''' |
-h() => null; |
- |
-f() { |
- return h().x(); |
-} |
-'''); |
- helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true); |
- }); |
- |
- test('Call variable defined locally', () { |
- Helper helper = new Helper(''' |
-f() { |
- var x; |
- return x(); |
-} |
-'''); |
- helper.checkLocalVariable('x()', 'x', isInvoke: true); |
- }); |
- |
- test('Call variable defined in parameter', () { |
- Helper helper = new Helper(''' |
-f(x) { |
- return x(); |
-} |
-'''); |
- helper.checkParameter('x()', 'x', isInvoke: true); |
- }); |
- |
- test('Call accessor defined at top level', () { |
- Helper helper = new Helper(''' |
-get x => null; |
- |
-f() { |
- return x(); |
-} |
-'''); |
- helper.checkStaticProperty('x()', null, 'x', true, isInvoke: true); |
- }); |
- |
- test('Call accessor defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.x(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-get x => null; |
-'''); |
- helper.checkStaticProperty('l.x()', null, 'x', true, isInvoke: true); |
- }); |
- |
- test('Call accessor defined statically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static get x => null; |
- |
- f() { |
- return x(); |
- } |
-} |
-'''); |
- helper.checkStaticProperty('x()', 'A', 'x', true, isInvoke: true); |
- }); |
- |
- test('Call accessor defined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static get x => null; |
-} |
- |
-f() { |
- return A.x(); |
-} |
-'''); |
- helper.checkStaticProperty('A.x()', 'A', 'x', true, isInvoke: true); |
- }); |
- |
- test( |
- 'Call accessor defined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.A.x(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A { |
- static get x => null; |
-} |
-'''); |
- helper.checkStaticProperty('l.A.x()', 'A', 'x', true, isInvoke: true); |
- }); |
- |
- test('Call accessor defined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- get x => null; |
- |
- f() { |
- return x(); |
- } |
-} |
-'''); |
- helper.checkDynamic('x()', null, 'x', isInvoke: true); |
- }); |
- |
- test( |
- 'Call accessor defined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- get x => null; |
-} |
- |
-f(A a) { |
- return a.x(); |
-} |
-'''); |
- helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true); |
- }); |
- |
- test( |
- 'Call accessor defined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- get x => null; |
-} |
- |
-A h() => null; |
- |
-f() { |
- return h().x(); |
-} |
-'''); |
- helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true); |
- }); |
- |
- test( |
- 'Call accessor defined dynamically in class from outside class via dynamic var', |
- () { |
- Helper helper = new Helper(''' |
-f(a) { |
- return a.x(); |
-} |
-'''); |
- helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true); |
- }); |
- |
- test( |
- 'Call accessor defined dynamically in class from outside class via dynamic expression', |
- () { |
- Helper helper = new Helper(''' |
-h() => null; |
- |
-f() { |
- return h().x(); |
-} |
-'''); |
- helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true); |
- }); |
- |
- test('Call class defined at top level', () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-f() { |
- A(); |
-} |
-'''); |
- helper.checkTypeReference( |
- 'A()', |
- 'A', |
- AccessKind.TOPLEVEL_TYPE, |
- isInvoke: true); |
- }); |
- |
- test('Call class defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.A(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A {} |
-'''); |
- helper.checkTypeReference( |
- 'l.A()', |
- 'A', |
- AccessKind.TOPLEVEL_TYPE, |
- isInvoke: true); |
- }); |
- |
- test('Call dynamic type undefined at toplevel', () { |
- Helper helper = new Helper(''' |
-f() { |
- dynamic(); |
-} |
-'''); |
- // Since it is legal to define a toplevel function or a class member called |
- // dynamic, "dynamic()" must be treated as a dynamic access to a function |
- // called "dynamic". |
- helper.checkDynamic('dynamic()', null, 'dynamic', isInvoke: true); |
- }); |
- |
- test('Call function typedef defined at top level', () { |
- Helper helper = new Helper(''' |
-typedef F(); |
- |
-f() { |
- F(); |
-} |
-'''); |
- helper.checkTypeReference( |
- 'F()', |
- 'F', |
- AccessKind.TOPLEVEL_TYPE, |
- isInvoke: true); |
- }); |
- |
- test('Call function typedef defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.F(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-typedef F(); |
-'''); |
- helper.checkTypeReference( |
- 'l.F()', |
- 'F', |
- AccessKind.TOPLEVEL_TYPE, |
- isInvoke: true); |
- }); |
- |
- test('Call mixin application defined at top level', () { |
- Helper helper = new Helper(''' |
-class A {} |
-class B {} |
-class C = A with B; |
- |
-f() { |
- C(); |
-} |
-'''); |
- helper.checkTypeReference( |
- 'C()', |
- 'C', |
- AccessKind.TOPLEVEL_TYPE, |
- isInvoke: true); |
- }); |
- |
- test('Call mixin application defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.C(); |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A {} |
-class B {} |
-class C = A with B; |
-'''); |
- helper.checkTypeReference( |
- 'l.C()', |
- 'C', |
- AccessKind.TOPLEVEL_TYPE, |
- isInvoke: true); |
- }); |
- |
- test('Call type parameter of enclosing class', () { |
- Helper helper = new Helper(''' |
-class A<T, U> { |
- f() { |
- U(); |
- } |
-} |
-'''); |
- helper.checkTypeReference( |
- 'U()', |
- 'U', |
- AccessKind.TYPE_PARAMETER, |
- isInvoke: true); |
- }); |
- |
- test('Get function defined at top level', () { |
- Helper helper = new Helper(''' |
-g() {} |
- |
-f() { |
- return g; |
-} |
-'''); |
- helper.checkStaticMethod('g', null, 'g', true, isRead: true); |
- }); |
- |
- test('Get function defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.g; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-g() {} |
-'''); |
- helper.checkStaticMethod('l.g', null, 'g', true, isRead: true); |
- }); |
- |
- test('Get method defined statically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static g() {} |
- |
- f() { |
- return g; |
- } |
-} |
-'''); |
- helper.checkStaticMethod('g', 'A', 'g', true, isRead: true); |
- }); |
- |
- test('Get method defined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static g() {} |
-} |
-f() { |
- return A.g; |
-} |
-'''); |
- helper.checkStaticMethod('A.g', 'A', 'g', true, isRead: true); |
- }); |
- |
- test( |
- 'Get method defined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.A.g; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A { |
- static g() {} |
-} |
-'''); |
- helper.checkStaticMethod('l.A.g', 'A', 'g', true, isRead: true); |
- }); |
- |
- test('Get method defined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- g() {} |
- |
- f() { |
- return g; |
- } |
-} |
-'''); |
- helper.checkDynamic('g', null, 'g', isRead: true); |
- }); |
- |
- test( |
- 'Get method defined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- g() {} |
-} |
-f(A a) { |
- return a.g; |
-} |
-'''); |
- helper.checkDynamic('a.g', 'a', 'g', isRead: true); |
- }); |
- |
- test( |
- 'Get method defined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- g() {} |
-} |
-A h() => null; |
-f() { |
- return h().g; |
-} |
-'''); |
- helper.checkDynamic('h().g', 'h()', 'g', isRead: true); |
- }); |
- |
- test('Get method defined locally', () { |
- Helper helper = new Helper(''' |
-f() { |
- g() {} |
- return g; |
-} |
-'''); |
- helper.checkLocalFunction('g', 'g', isRead: true); |
- }); |
- |
- test('Get variable defined at top level', () { |
- Helper helper = new Helper(''' |
-var x; |
- |
-f() { |
- return x; |
-} |
-'''); |
- helper.checkStaticField('x', null, 'x', isRead: true); |
- }); |
- |
- test('Get variable defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.x; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-var x; |
-'''); |
- helper.checkStaticField('l.x', null, 'x', isRead: true); |
- }); |
- |
- test('Get field defined statically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static var x; |
- |
- f() { |
- return x; |
- } |
-} |
-'''); |
- helper.checkStaticField('x', 'A', 'x', isRead: true); |
- }); |
- |
- test('Get field defined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static var x; |
-} |
- |
-f() { |
- return A.x; |
-} |
-'''); |
- helper.checkStaticField('A.x', 'A', 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get field defined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.A.x; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A { |
- static var x; |
-} |
-'''); |
- helper.checkStaticField('l.A.x', 'A', 'x', isRead: true); |
- }); |
- |
- test('Get field defined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
- |
- f() { |
- return x; |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get field defined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
-} |
- |
-f(A a) { |
- return a.x; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get field defined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
-} |
- |
-A h() => null; |
- |
-f() { |
- return h().x; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get field defined dynamically in class from outside class via dynamic var', |
- () { |
- Helper helper = new Helper(''' |
-f(a) { |
- return a.x; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get field defined dynamically in class from outside class via dynamic expression', |
- () { |
- Helper helper = new Helper(''' |
-h() => null; |
- |
-f() { |
- return h().x; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isRead: true); |
- }); |
- |
- test('Get variable defined locally', () { |
- Helper helper = new Helper(''' |
-f() { |
- var x; |
- return x; |
-} |
-'''); |
- helper.checkLocalVariable('x', 'x', isRead: true); |
- }); |
- |
- test('Get variable defined in parameter', () { |
- Helper helper = new Helper(''' |
-f(x) { |
- return x; |
-} |
-'''); |
- helper.checkParameter('x', 'x', isRead: true); |
- }); |
- |
- test('Get accessor defined at top level', () { |
- Helper helper = new Helper(''' |
-get x => null; |
- |
-f() { |
- return x; |
-} |
-'''); |
- helper.checkStaticProperty('x', null, 'x', true, isRead: true); |
- }); |
- |
- test('Get accessor defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.x; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-get x => null; |
-'''); |
- helper.checkStaticProperty('l.x', null, 'x', true, isRead: true); |
- }); |
- |
- test('Get accessor defined statically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static get x => null; |
- |
- f() { |
- return x; |
- } |
-} |
-'''); |
- helper.checkStaticProperty('x', 'A', 'x', true, isRead: true); |
- }); |
- |
- test('Get accessor defined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static get x => null; |
-} |
- |
-f() { |
- return A.x; |
-} |
-'''); |
- helper.checkStaticProperty('A.x', 'A', 'x', true, isRead: true); |
- }); |
- |
- test( |
- 'Get accessor defined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.A.x; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A { |
- static get x => null; |
-} |
-'''); |
- helper.checkStaticProperty('l.A.x', 'A', 'x', true, isRead: true); |
- }); |
- |
- test('Get accessor defined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- get x => null; |
- |
- f() { |
- return x; |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get accessor defined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- get x => null; |
-} |
- |
-f(A a) { |
- return a.x; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get accessor defined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- get x => null; |
-} |
- |
-A h() => null; |
- |
-f() { |
- return h().x; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get accessor defined dynamically in class from outside class via dynamic var', |
- () { |
- Helper helper = new Helper(''' |
-f(a) { |
- return a.x; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get accessor defined dynamically in class from outside class via dynamic expression', |
- () { |
- Helper helper = new Helper(''' |
-h() => null; |
- |
-f() { |
- return h().x; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isRead: true); |
- }); |
- |
- test('Get accessor undefined at top level', () { |
- Helper helper = new Helper(''' |
-f() { |
- return x; |
-} |
-'''); |
- // Undefined top level property accesses are treated as dynamic. |
- // TODO(paulberry): not sure if this is a good idea. In general, when such |
- // an access appears inside an instance method, it is dynamic, because |
- // "this" might be an instance of a derived class that implements x. |
- // However, in this case, we are not inside an instance method, so we know |
- // that the target is undefined. |
- helper.checkDynamic('x', null, 'x', isRead: true); |
- }); |
- |
- test('Get accessor undefined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.x; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
-'''); |
- // Undefined top level property accesses are treated as dynamic. |
- // TODO(paulberry): not sure if this is a good idea, for similar reasons to |
- // the case above. |
- helper.checkDynamic('l.x', null, 'x', isRead: true); |
- }); |
- |
- test('Get accessor undefined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-f() { |
- return A.x; |
-} |
-'''); |
- helper.checkStaticProperty('A.x', 'A', 'x', false, isRead: true); |
- }); |
- |
- test( |
- 'Get accessor undefined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- return l.A.x; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A {} |
-'''); |
- helper.checkStaticProperty('l.A.x', 'A', 'x', false, isRead: true); |
- }); |
- |
- test('Get accessor undefined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- f() { |
- return x; |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get accessor undefined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-f(A a) { |
- return a.x; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isRead: true); |
- }); |
- |
- test( |
- 'Get accessor undefined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-A h() => null; |
- |
-f() { |
- return h().x; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isRead: true); |
- }); |
- |
- test('Get class defined at top level', () { |
- Helper helper = new Helper(''' |
-class A {} |
-var t = A; |
-'''); |
- helper.checkTypeReference('A', 'A', AccessKind.TOPLEVEL_TYPE, isRead: true); |
- }); |
- |
- test('Get class defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-var t = l.A; |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A {} |
-'''); |
- helper.checkTypeReference( |
- 'l.A', |
- 'A', |
- AccessKind.TOPLEVEL_TYPE, |
- isRead: true); |
- }); |
- |
- test('Get dynamic type', () { |
- Helper helper = new Helper(''' |
-var t = dynamic; |
-'''); |
- helper.checkTypeReference( |
- 'dynamic', |
- 'dynamic', |
- AccessKind.TOPLEVEL_TYPE, |
- isRead: true); |
- }); |
- |
- test('Get function typedef defined at top level', () { |
- Helper helper = new Helper(''' |
-typedef F(); |
-var t = F; |
-'''); |
- helper.checkTypeReference('F', 'F', AccessKind.TOPLEVEL_TYPE, isRead: true); |
- }); |
- |
- test('Get function typedef defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-var t = l.F; |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-typedef F(); |
-'''); |
- helper.checkTypeReference( |
- 'l.F', |
- 'F', |
- AccessKind.TOPLEVEL_TYPE, |
- isRead: true); |
- }); |
- |
- test('Get mixin application defined at top level', () { |
- Helper helper = new Helper(''' |
-class A {} |
-class B {} |
-class C = A with B; |
-var t = C; |
-'''); |
- helper.checkTypeReference('C', 'C', AccessKind.TOPLEVEL_TYPE, isRead: true); |
- }); |
- |
- test('Get mixin application defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-var t = l.C; |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A {} |
-class B {} |
-class C = A with B; |
-'''); |
- helper.checkTypeReference( |
- 'l.C', |
- 'C', |
- AccessKind.TOPLEVEL_TYPE, |
- isRead: true); |
- }); |
- |
- test('Get type parameter of enclosing class', () { |
- Helper helper = new Helper(''' |
-class A<T, U> { |
- f() { |
- var t = U; |
- } |
-} |
-'''); |
- helper.checkTypeReference( |
- 'U', |
- 'U', |
- AccessKind.TYPE_PARAMETER, |
- isRead: true); |
- }); |
- |
- test('Set variable defined at top level', () { |
- Helper helper = new Helper(''' |
-var x; |
- |
-f() { |
- x = 1; |
-} |
-'''); |
- helper.checkStaticField('x', null, 'x', isWrite: true); |
- }); |
- |
- test('Set variable defined at top level in foreach loop', () { |
- Helper helper = new Helper(''' |
-var x; |
- |
-f() { |
- for (x in []) {} |
-} |
-'''); |
- helper.checkStaticField('x', null, 'x', isWrite: true); |
- }); |
- |
- test('Set variable defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.x = 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-var x; |
-'''); |
- helper.checkStaticField('l.x', null, 'x', isWrite: true); |
- }); |
- |
- test('Set field defined statically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static var x; |
- |
- f() { |
- x = 1; |
- } |
-} |
-'''); |
- helper.checkStaticField('x', 'A', 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set field defined statically in class from inside class in foreach' + ' loop', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- static var x; |
- |
- f() { |
- for (x in []) {} |
- } |
-} |
-'''); |
- helper.checkStaticField('x', 'A', 'x', isWrite: true); |
- }); |
- |
- test('Set field defined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static var x; |
-} |
- |
-f() { |
- A.x = 1; |
-} |
-'''); |
- helper.checkStaticField('A.x', 'A', 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set field defined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.A.x = 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A { |
- static var x; |
-} |
-'''); |
- helper.checkStaticField('l.A.x', 'A', 'x', isWrite: true); |
- }); |
- |
- test('Set field defined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
- |
- f() { |
- x = 1; |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set field defined dynamically in class from inside class in foreach' + ' loop', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
- |
- f() { |
- for (x in []) {} |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set field defined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
-} |
- |
-f(A a) { |
- a.x = 1; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set field defined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
-} |
- |
-A h() => null; |
- |
-f() { |
- h().x = 1; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isWrite: true); |
- }); |
- |
- test('Set variable defined locally', () { |
- Helper helper = new Helper(''' |
-f() { |
- var x; |
- x = 1; |
-} |
-'''); |
- helper.checkLocalVariable('x', 'x', isWrite: true); |
- }); |
- |
- test('Set variable defined locally in foreach loop', () { |
- Helper helper = new Helper(''' |
-f() { |
- var x; |
- for (x in []) {} |
-} |
-'''); |
- helper.checkLocalVariable('x', 'x', isWrite: true); |
- }); |
- |
- test('Set variable defined in parameter', () { |
- Helper helper = new Helper(''' |
-f(x) { |
- x = 1; |
-} |
-'''); |
- helper.checkParameter('x', 'x', isWrite: true); |
- }); |
- |
- test('Set variable defined in parameter in foreach loop', () { |
- Helper helper = new Helper(''' |
-f(x) { |
- for (x in []) {} |
-} |
-'''); |
- helper.checkParameter('x', 'x', isWrite: true); |
- }); |
- |
- test('Set accessor defined at top level', () { |
- Helper helper = new Helper(''' |
-set x(value) {}; |
- |
-f() { |
- x = 1; |
-} |
-'''); |
- helper.checkStaticProperty('x', null, 'x', true, isWrite: true); |
- }); |
- |
- test('Set accessor defined at top level in foreach loop', () { |
- Helper helper = new Helper(''' |
-set x(value) {}; |
- |
-f() { |
- for (x in []) {} |
-} |
-'''); |
- helper.checkStaticProperty('x', null, 'x', true, isWrite: true); |
- }); |
- |
- test('Set accessor defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.x = 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-set x(value) {}; |
-'''); |
- helper.checkStaticProperty('l.x', null, 'x', true, isWrite: true); |
- }); |
- |
- test('Set accessor defined statically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static set x(value) {} |
- |
- f() { |
- x = 1; |
- } |
-} |
-'''); |
- helper.checkStaticProperty('x', 'A', 'x', true, isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor defined statically in class from inside class in' + |
- ' foreach loop', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- static set x(value) {} |
- |
- f() { |
- for (x in []) {} |
- } |
-} |
-'''); |
- helper.checkStaticProperty('x', 'A', 'x', true, isWrite: true); |
- }); |
- |
- test('Set accessor defined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static set x(value) {} |
-} |
- |
-f() { |
- A.x = 1; |
-} |
-'''); |
- helper.checkStaticProperty('A.x', 'A', 'x', true, isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor defined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.A.x = 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A { |
- static set x(value) {} |
-} |
-'''); |
- helper.checkStaticProperty('l.A.x', 'A', 'x', true, isWrite: true); |
- }); |
- |
- test('Set accessor defined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- set x(value) {} |
- |
- f() { |
- x = 1; |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor defined dynamically in class from inside class in' + |
- ' foreach loop', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- set x(value) {} |
- |
- f() { |
- for (x in []) {} |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor defined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- set x(value) {} |
-} |
- |
-f(A a) { |
- a.x = 1; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor defined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- set x(value) {} |
-} |
- |
-A h() => null; |
- |
-f() { |
- h().x = 1; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor defined dynamically in class from outside class via dynamic var', |
- () { |
- Helper helper = new Helper(''' |
-f(a) { |
- a.x = 1; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor defined dynamically in class from outside class via dynamic expression', |
- () { |
- Helper helper = new Helper(''' |
-h() => null; |
- |
-f() { |
- h().x = 1; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isWrite: true); |
- }); |
- |
- test('Set accessor undefined at top level', () { |
- Helper helper = new Helper(''' |
-f() { |
- x = 1; |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isWrite: true); |
- }); |
- |
- test('Set accessor undefined at top level in foreach loop', () { |
- Helper helper = new Helper(''' |
-f() { |
- for (x in []) {} |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isWrite: true); |
- }); |
- |
- test('Set accessor undefined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.x = 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
-'''); |
- helper.checkDynamic('l.x', null, 'x', isWrite: true); |
- }); |
- |
- test('Set accessor undefined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-f() { |
- A.x = 1; |
-} |
-'''); |
- helper.checkStaticProperty('A.x', 'A', 'x', false, isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor undefined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.A.x = 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A {} |
-'''); |
- helper.checkStaticProperty('l.A.x', 'A', 'x', false, isWrite: true); |
- }); |
- |
- test('Set accessor undefined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- f() { |
- x = 1; |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor undefined dynamically in class from inside class in' + |
- ' foreach loop', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- f() { |
- for (x in []) {} |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor undefined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-f(A a) { |
- a.x = 1; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isWrite: true); |
- }); |
- |
- test( |
- 'Set accessor undefined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-A h() => null; |
- |
-f() { |
- h().x = 1; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isWrite: true); |
- }); |
- |
- test('RMW variable defined at top level', () { |
- Helper helper = new Helper(''' |
-var x; |
- |
-f() { |
- x += 1; |
-} |
-'''); |
- helper.checkStaticField('x', null, 'x', isRead: true, isWrite: true); |
- }); |
- |
- test('RMW variable defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.x += 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-var x; |
-'''); |
- helper.checkStaticField('l.x', null, 'x', isRead: true, isWrite: true); |
- }); |
- |
- test('RMW field defined statically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static var x; |
- |
- f() { |
- x += 1; |
- } |
-} |
-'''); |
- helper.checkStaticField('x', 'A', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test('RMW field defined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static var x; |
-} |
- |
-f() { |
- A.x += 1; |
-} |
-'''); |
- helper.checkStaticField('A.x', 'A', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test( |
- 'RMW field defined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.A.x += 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A { |
- static var x; |
-} |
-'''); |
- helper.checkStaticField('l.A.x', 'A', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test('RMW field defined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
- |
- f() { |
- x += 1; |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true); |
- }); |
- |
- test( |
- 'RMW field defined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
-} |
- |
-f(A a) { |
- a.x += 1; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test( |
- 'RMW field defined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- var x; |
-} |
- |
-A h() => null; |
- |
-f() { |
- h().x += 1; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test('RMW variable defined locally', () { |
- Helper helper = new Helper(''' |
-f() { |
- var x; |
- x += 1; |
-} |
-'''); |
- helper.checkLocalVariable('x', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test('RMW variable defined in parameter', () { |
- Helper helper = new Helper(''' |
-f(x) { |
- x += 1; |
-} |
-'''); |
- helper.checkParameter('x', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test('RMW accessor defined at top level', () { |
- Helper helper = new Helper(''' |
-set x(value) {}; |
- |
-f() { |
- x += 1; |
-} |
-'''); |
- helper.checkStaticProperty( |
- 'x', |
- null, |
- 'x', |
- true, |
- isRead: true, |
- isWrite: true); |
- }); |
- |
- test('RMW accessor defined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.x += 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-set x(value) {}; |
-'''); |
- helper.checkStaticProperty( |
- 'l.x', |
- null, |
- 'x', |
- true, |
- isRead: true, |
- isWrite: true); |
- }); |
- |
- test('RMW accessor defined statically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static set x(value) {} |
- |
- f() { |
- x += 1; |
- } |
-} |
-'''); |
- helper.checkStaticProperty( |
- 'x', |
- 'A', |
- 'x', |
- true, |
- isRead: true, |
- isWrite: true); |
- }); |
- |
- test('RMW accessor defined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- static set x(value) {} |
-} |
- |
-f() { |
- A.x += 1; |
-} |
-'''); |
- helper.checkStaticProperty( |
- 'A.x', |
- 'A', |
- 'x', |
- true, |
- isRead: true, |
- isWrite: true); |
- }); |
- |
- test( |
- 'RMW accessor defined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.A.x += 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A { |
- static set x(value) {} |
-} |
-'''); |
- helper.checkStaticProperty( |
- 'l.A.x', |
- 'A', |
- 'x', |
- true, |
- isRead: true, |
- isWrite: true); |
- }); |
- |
- test('RMW accessor defined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- set x(value) {} |
- |
- f() { |
- x += 1; |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true); |
- }); |
- |
- test( |
- 'RMW accessor defined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- set x(value) {} |
-} |
- |
-f(A a) { |
- a.x += 1; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test( |
- 'RMW accessor defined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A { |
- set x(value) {} |
-} |
- |
-A h() => null; |
- |
-f() { |
- h().x += 1; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test( |
- 'RMW accessor defined dynamically in class from outside class via dynamic var', |
- () { |
- Helper helper = new Helper(''' |
-f(a) { |
- a.x += 1; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test( |
- 'RMW accessor defined dynamically in class from outside class via dynamic expression', |
- () { |
- Helper helper = new Helper(''' |
-h() => null; |
- |
-f() { |
- h().x += 1; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test('RMW accessor undefined at top level', () { |
- Helper helper = new Helper(''' |
-f() { |
- x += 1; |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true); |
- }); |
- |
- test('RMW accessor undefined at top level via prefix', () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.x += 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
-'''); |
- helper.checkDynamic('l.x', null, 'x', isRead: true, isWrite: true); |
- }); |
- |
- test('RMW accessor undefined statically in class from outside class', () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-f() { |
- A.x += 1; |
-} |
-'''); |
- helper.checkStaticProperty( |
- 'A.x', |
- 'A', |
- 'x', |
- false, |
- isRead: true, |
- isWrite: true); |
- }); |
- |
- test( |
- 'RMW accessor undefined statically in class from outside class via prefix', |
- () { |
- Helper helper = new Helper(''' |
-import 'lib.dart' as l; |
- |
-f() { |
- l.A.x += 1; |
-} |
-'''); |
- helper.addFile('/lib.dart', ''' |
-library lib; |
- |
-class A {} |
-'''); |
- helper.checkStaticProperty( |
- 'l.A.x', |
- 'A', |
- 'x', |
- false, |
- isRead: true, |
- isWrite: true); |
- }); |
- |
- test('RMW accessor undefined dynamically in class from inside class', () { |
- Helper helper = new Helper(''' |
-class A { |
- f() { |
- x += 1; |
- } |
-} |
-'''); |
- helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true); |
- }); |
- |
- test( |
- 'RMW accessor undefined dynamically in class from outside class via typed var', |
- () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-f(A a) { |
- a.x += 1; |
-} |
-'''); |
- helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true); |
- }); |
- |
- test( |
- 'RMW accessor undefined dynamically in class from outside class via typed expression', |
- () { |
- Helper helper = new Helper(''' |
-class A {} |
- |
-A h() => null; |
- |
-f() { |
- h().x += 1; |
-} |
-'''); |
- helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true); |
- }); |
-} |
- |
-typedef void AccessHandler(Expression node, AccessSemantics semantics); |
- |
-class Helper { |
- final MemoryResourceProvider provider = new MemoryResourceProvider(); |
- Source rootSource; |
- AnalysisContext context; |
- |
- Helper(String rootContents) { |
- DartSdk sdk = new MockSdk(); |
- String rootFile = '/root.dart'; |
- File file = provider.newFile(rootFile, rootContents); |
- rootSource = file.createSource(); |
- context = AnalysisEngine.instance.createAnalysisContext(); |
- // Set up the source factory. |
- List<UriResolver> uriResolvers = [ |
- new ResourceUriResolver(provider), |
- new DartUriResolver(sdk)]; |
- context.sourceFactory = new SourceFactory(uriResolvers); |
- // add the Source |
- ChangeSet changeSet = new ChangeSet(); |
- changeSet.addedSource(rootSource); |
- context.applyChanges(changeSet); |
- } |
- |
- LibraryElement get libraryElement { |
- return context.computeLibraryElement(rootSource); |
- } |
- |
- void addFile(String path, String contents) { |
- provider.newFile(path, contents); |
- } |
- |
- /** |
- * Verify that the node represented by [expectedSource] is classified as |
- * a dynamic method invocation. |
- */ |
- void checkDynamic(String expectedSource, String expectedTarget, |
- String expectedName, {bool isRead: false, bool isWrite: false, bool isInvoke: |
- false}) { |
- TestVisitor visitor = new TestVisitor(); |
- int count = 0; |
- visitor.onAccess = (AstNode node, AccessSemantics semantics) { |
- count++; |
- expect(node.toSource(), equals(expectedSource)); |
- expect(semantics.kind, equals(AccessKind.DYNAMIC)); |
- if (expectedTarget == null) { |
- expect(semantics.target, isNull); |
- } else { |
- expect(semantics.target.toSource(), equals(expectedTarget)); |
- } |
- expect(semantics.identifier.name, equals(expectedName)); |
- expect(semantics.element, isNull); |
- expect(semantics.classElement, isNull); |
- expect(semantics.isRead, equals(isRead)); |
- expect(semantics.isWrite, equals(isWrite)); |
- expect(semantics.isInvoke, equals(isInvoke)); |
- }; |
- libraryElement.unit.accept(visitor); |
- expect(count, equals(1)); |
- } |
- |
- /** |
- * Verify that the node represented by [expectedSource] is classified as |
- * a local function invocation. |
- */ |
- void checkLocalFunction(String expectedSource, String expectedName, |
- {bool isRead: false, bool isWrite: false, bool isInvoke: false}) { |
- TestVisitor visitor = new TestVisitor(); |
- int count = 0; |
- visitor.onAccess = (AstNode node, AccessSemantics semantics) { |
- count++; |
- expect(node.toSource(), equals(expectedSource)); |
- expect(semantics.kind, equals(AccessKind.LOCAL_FUNCTION)); |
- expect(semantics.identifier.name, equals(expectedName)); |
- expect(semantics.element.displayName, equals(expectedName)); |
- expect(semantics.classElement, isNull); |
- expect(semantics.target, isNull); |
- expect(semantics.isRead, equals(isRead)); |
- expect(semantics.isWrite, equals(isWrite)); |
- expect(semantics.isInvoke, equals(isInvoke)); |
- }; |
- libraryElement.unit.accept(visitor); |
- expect(count, equals(1)); |
- } |
- |
- /** |
- * Verify that the node represented by [expectedSource] is classified as |
- * a local variable access. |
- */ |
- void checkLocalVariable(String expectedSource, String expectedName, |
- {bool isRead: false, bool isWrite: false, bool isInvoke: false}) { |
- TestVisitor visitor = new TestVisitor(); |
- int count = 0; |
- visitor.onAccess = (AstNode node, AccessSemantics semantics) { |
- count++; |
- expect(node.toSource(), equals(expectedSource)); |
- expect(semantics.kind, equals(AccessKind.LOCAL_VARIABLE)); |
- expect(semantics.element.name, equals(expectedName)); |
- expect(semantics.classElement, isNull); |
- expect(semantics.target, isNull); |
- expect(semantics.isRead, equals(isRead)); |
- expect(semantics.isWrite, equals(isWrite)); |
- expect(semantics.isInvoke, equals(isInvoke)); |
- }; |
- libraryElement.unit.accept(visitor); |
- expect(count, equals(1)); |
- } |
- |
- /** |
- * Verify that the node represented by [expectedSource] is classified as a |
- * parameter access. |
- */ |
- void checkParameter(String expectedSource, String expectedName, {bool isRead: |
- false, bool isWrite: false, bool isInvoke: false}) { |
- TestVisitor visitor = new TestVisitor(); |
- int count = 0; |
- visitor.onAccess = (AstNode node, AccessSemantics semantics) { |
- count++; |
- expect(node.toSource(), equals(expectedSource)); |
- expect(semantics.kind, equals(AccessKind.PARAMETER)); |
- expect(semantics.element.name, equals(expectedName)); |
- expect(semantics.classElement, isNull); |
- expect(semantics.target, isNull); |
- expect(semantics.isRead, equals(isRead)); |
- expect(semantics.isWrite, equals(isWrite)); |
- expect(semantics.isInvoke, equals(isInvoke)); |
- }; |
- libraryElement.unit.accept(visitor); |
- expect(count, equals(1)); |
- } |
- |
- /** |
- * Verify that the node represented by [expectedSource] is classified as |
- * a static field element reference. |
- */ |
- void checkStaticField(String expectedSource, String expectedClass, |
- String expectedName, {bool isRead: false, bool isWrite: false, bool isInvoke: |
- false}) { |
- TestVisitor visitor = new TestVisitor(); |
- int count = 0; |
- visitor.onAccess = (Expression node, AccessSemantics semantics) { |
- count++; |
- expect(node.toSource(), equals(expectedSource)); |
- expect(semantics.kind, equals(AccessKind.STATIC_FIELD)); |
- expect(semantics.identifier.name, equals(expectedName)); |
- expect(semantics.element.displayName, equals(expectedName)); |
- if (expectedClass == null) { |
- expect(semantics.classElement, isNull); |
- } else { |
- expect(semantics.classElement, isNotNull); |
- expect(semantics.classElement.displayName, equals(expectedClass)); |
- } |
- expect(semantics.target, isNull); |
- expect(semantics.isRead, equals(isRead)); |
- expect(semantics.isWrite, equals(isWrite)); |
- expect(semantics.isInvoke, equals(isInvoke)); |
- }; |
- libraryElement.unit.accept(visitor); |
- expect(count, equals(1)); |
- } |
- |
- /** |
- * Verify that the node represented by [expectedSource] is classified as |
- * a static method. |
- */ |
- void checkStaticMethod(String expectedSource, String expectedClass, |
- String expectedName, bool defined, {bool isRead: false, bool isWrite: false, |
- bool isInvoke: false}) { |
- TestVisitor visitor = new TestVisitor(); |
- int count = 0; |
- visitor.onAccess = (AstNode node, AccessSemantics semantics) { |
- count++; |
- expect(node.toSource(), equals(expectedSource)); |
- expect(semantics.kind, equals(AccessKind.STATIC_METHOD)); |
- expect(semantics.identifier.name, equals(expectedName)); |
- if (expectedClass == null) { |
- expect(semantics.classElement, isNull); |
- if (defined) { |
- expect(semantics.element, new isInstanceOf<FunctionElement>()); |
- } |
- } else { |
- expect(semantics.classElement, isNotNull); |
- expect(semantics.classElement.displayName, equals(expectedClass)); |
- if (defined) { |
- expect(semantics.element, new isInstanceOf<MethodElement>()); |
- } |
- } |
- if (defined) { |
- expect(semantics.element.displayName, equals(expectedName)); |
- } else { |
- expect(semantics.element, isNull); |
- } |
- expect(semantics.target, isNull); |
- expect(semantics.isRead, equals(isRead)); |
- expect(semantics.isWrite, equals(isWrite)); |
- expect(semantics.isInvoke, equals(isInvoke)); |
- }; |
- libraryElement.unit.accept(visitor); |
- expect(count, equals(1)); |
- } |
- |
- /** |
- * Verify that the node represented by [expectedSource] is classified as |
- * a static property access. |
- */ |
- void checkStaticProperty(String expectedSource, String expectedClass, |
- String expectedName, bool defined, {bool isRead: false, bool isWrite: false, |
- bool isInvoke: false}) { |
- TestVisitor visitor = new TestVisitor(); |
- int count = 0; |
- visitor.onAccess = (Expression node, AccessSemantics semantics) { |
- count++; |
- expect(node.toSource(), equals(expectedSource)); |
- expect(semantics.kind, equals(AccessKind.STATIC_PROPERTY)); |
- expect(semantics.identifier.name, equals(expectedName)); |
- if (expectedClass == null) { |
- expect(semantics.classElement, isNull); |
- } else { |
- expect(semantics.classElement, isNotNull); |
- expect(semantics.classElement.displayName, equals(expectedClass)); |
- } |
- if (defined) { |
- expect(semantics.element.displayName, equals(expectedName)); |
- } else { |
- expect(semantics.element, isNull); |
- } |
- expect(semantics.target, isNull); |
- expect(semantics.isRead, equals(isRead)); |
- expect(semantics.isWrite, equals(isWrite)); |
- expect(semantics.isInvoke, equals(isInvoke)); |
- }; |
- libraryElement.unit.accept(visitor); |
- expect(count, equals(1)); |
- } |
- |
- /** |
- * Verify that the node represented by [expectedSource] is classified as a |
- * reference to a toplevel class or a type parameter. |
- */ |
- void checkTypeReference(String expectedSource, String expectedName, |
- AccessKind expectedKind, {bool isRead: false, bool isInvoke: false}) { |
- TestVisitor visitor = new TestVisitor(); |
- int count = 0; |
- visitor.onAccess = (AstNode node, AccessSemantics semantics) { |
- count++; |
- expect(node.toSource(), equals(expectedSource)); |
- expect(semantics.kind, equals(expectedKind)); |
- expect(semantics.element.name, equals(expectedName)); |
- expect(semantics.classElement, isNull); |
- expect(semantics.target, isNull); |
- expect(semantics.isRead, equals(isRead)); |
- expect(semantics.isWrite, isFalse); |
- expect(semantics.isInvoke, equals(isInvoke)); |
- }; |
- libraryElement.unit.accept(visitor); |
- expect(count, equals(1)); |
- } |
-} |
- |
-/** |
- * Visitor class used to run the tests. |
- */ |
-class TestVisitor extends RecursiveAstVisitor { |
- AccessHandler onAccess; |
- |
- @override |
- visitMethodInvocation(MethodInvocation node) { |
- onAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR)); |
- } |
- |
- @override |
- visitPrefixedIdentifier(PrefixedIdentifier node) { |
- onAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR)); |
- } |
- |
- @override |
- visitPropertyAccess(PropertyAccess node) { |
- onAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR)); |
- } |
- |
- @override |
- visitSimpleIdentifier(SimpleIdentifier node) { |
- AccessSemantics semantics = node.accept(ACCESS_SEMANTICS_VISITOR); |
- if (semantics != null) { |
- onAccess(node, semantics); |
- } |
- } |
-} |