Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Unified Diff: pkg/analyzer2dart/test/identifier_semantics_test.dart

Issue 816773002: Add AccessSemantics support for calling typenames. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer2dart/lib/src/identifier_semantics.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
index f15762522e03ec25840f9db5c2e7e04aff1a58fd..3297cf833f3faafb97191dd1e2b71692712ef6f5 100644
--- a/pkg/analyzer2dart/test/identifier_semantics_test.dart
+++ b/pkg/analyzer2dart/test/identifier_semantics_test.dart
@@ -2,17 +2,18 @@
// 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:unittest/unittest.dart';
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
-import 'mock_sdk.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/file_system/file_system.dart';
import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/analyzer.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', () {
@@ -565,6 +566,142 @@ f() {
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;
scheglov 2014/12/18 21:19:35 class A {}
Paul Berry 2014/12/18 21:56:58 Done.
+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() {}
@@ -1097,7 +1234,7 @@ f() {
class A {}
var t = A;
''');
- helper.checkTypeReference('A', 'A', AccessKind.TOPLEVEL_TYPE);
+ helper.checkTypeReference('A', 'A', AccessKind.TOPLEVEL_TYPE, isRead: true);
});
test('Get class defined at top level via prefix', () {
@@ -1111,14 +1248,22 @@ library lib;
class A;
scheglov 2014/12/18 21:19:35 class A {}
Paul Berry 2014/12/18 21:56:58 Done.
''');
- helper.checkTypeReference('l.A', 'A', AccessKind.TOPLEVEL_TYPE);
+ 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);
+ helper.checkTypeReference(
+ 'dynamic',
+ 'dynamic',
+ AccessKind.TOPLEVEL_TYPE,
+ isRead: true);
});
test('Get function typedef defined at top level', () {
@@ -1126,7 +1271,7 @@ var t = dynamic;
typedef F();
var t = F;
''');
- helper.checkTypeReference('F', 'F', AccessKind.TOPLEVEL_TYPE);
+ helper.checkTypeReference('F', 'F', AccessKind.TOPLEVEL_TYPE, isRead: true);
});
test('Get function typedef defined at top level via prefix', () {
@@ -1140,7 +1285,11 @@ library lib;
typedef F();
''');
- helper.checkTypeReference('l.F', 'F', AccessKind.TOPLEVEL_TYPE);
+ helper.checkTypeReference(
+ 'l.F',
+ 'F',
+ AccessKind.TOPLEVEL_TYPE,
+ isRead: true);
});
test('Get mixin application defined at top level', () {
@@ -1150,7 +1299,7 @@ class B {}
class C = A with B;
var t = C;
''');
- helper.checkTypeReference('C', 'C', AccessKind.TOPLEVEL_TYPE);
+ helper.checkTypeReference('C', 'C', AccessKind.TOPLEVEL_TYPE, isRead: true);
});
test('Get mixin application defined at top level via prefix', () {
@@ -1166,7 +1315,11 @@ class A;
class B;
class C = A with B;
''');
- helper.checkTypeReference('l.C', 'C', AccessKind.TOPLEVEL_TYPE);
+ helper.checkTypeReference(
+ 'l.C',
+ 'C',
+ AccessKind.TOPLEVEL_TYPE,
+ isRead: true);
});
test('Get type parameter of enclosing class', () {
@@ -1177,7 +1330,11 @@ class A<T, U> {
}
}
''');
- helper.checkTypeReference('U', 'U', AccessKind.TYPE_PARAMETER);
+ helper.checkTypeReference(
+ 'U',
+ 'U',
+ AccessKind.TYPE_PARAMETER,
+ isRead: true);
});
test('Set variable defined at top level', () {
@@ -1231,8 +1388,9 @@ class A {
helper.checkStaticField('x', 'A', 'x', isWrite: true);
});
- test('Set field defined statically in class from inside class in foreach' +
- ' loop', () {
+ test(
+ 'Set field defined statically in class from inside class in foreach' + ' loop',
+ () {
Helper helper = new Helper('''
class A {
static var x;
@@ -1291,8 +1449,9 @@ class A {
helper.checkDynamic('x', null, 'x', isWrite: true);
});
- test('Set field defined dynamically in class from inside class in foreach' +
- ' loop', () {
+ test(
+ 'Set field defined dynamically in class from inside class in foreach' + ' loop',
+ () {
Helper helper = new Helper('''
class A {
var x;
@@ -1426,8 +1585,10 @@ class A {
helper.checkStaticProperty('x', 'A', 'x', true, isWrite: true);
});
- test('Set accessor defined statically in class from inside class in' +
- ' foreach loop', () {
+ test(
+ 'Set accessor defined statically in class from inside class in' +
+ ' foreach loop',
+ () {
Helper helper = new Helper('''
class A {
static set x(value) {}
@@ -1486,8 +1647,10 @@ class A {
helper.checkDynamic('x', null, 'x', isWrite: true);
});
- test('Set accessor defined dynamically in class from inside class in' +
- ' foreach loop', () {
+ test(
+ 'Set accessor defined dynamically in class from inside class in' +
+ ' foreach loop',
+ () {
Helper helper = new Helper('''
class A {
set x(value) {}
@@ -1628,8 +1791,10 @@ class A {
helper.checkDynamic('x', null, 'x', isWrite: true);
});
- test('Set accessor undefined dynamically in class from inside class in' +
- ' foreach loop', () {
+ test(
+ 'Set accessor undefined dynamically in class from inside class in' +
+ ' foreach loop',
+ () {
Helper helper = new Helper('''
class A {
f() {
@@ -2081,6 +2246,8 @@ f() {
});
}
+typedef void AccessHandler(Expression node, AccessSemantics semantics);
+
class Helper {
final MemoryResourceProvider provider = new MemoryResourceProvider();
Source rootSource;
@@ -2103,36 +2270,35 @@ class Helper {
context.applyChanges(changeSet);
}
- void addFile(String path, String contents) {
- provider.newFile(path, contents);
- }
-
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 static field element reference.
+ * a dynamic method invocation.
*/
- void checkStaticField(String expectedSource, String expectedClass,
+ 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 = (Expression node, AccessSemantics semantics) {
+ visitor.onAccess = (AstNode 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);
+ expect(semantics.kind, equals(AccessKind.DYNAMIC));
+ if (expectedTarget == null) {
+ expect(semantics.target, isNull);
} else {
- expect(semantics.classElement, isNotNull);
- expect(semantics.classElement.displayName, equals(expectedClass));
+ expect(semantics.target.toSource(), equals(expectedTarget));
}
- expect(semantics.target, isNull);
+ 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));
@@ -2143,29 +2309,19 @@ class Helper {
/**
* Verify that the node represented by [expectedSource] is classified as
- * a static property access.
+ * a local function invocation.
*/
- void checkStaticProperty(String expectedSource, String expectedClass,
- String expectedName, bool defined, {bool isRead: false, bool isWrite: false,
- bool isInvoke: false}) {
+ void checkLocalFunction(String expectedSource, String expectedName,
+ {bool isRead: false, bool isWrite: false, bool isInvoke: false}) {
TestVisitor visitor = new TestVisitor();
int count = 0;
- visitor.onAccess = (Expression node, AccessSemantics semantics) {
+ visitor.onAccess = (AstNode node, AccessSemantics semantics) {
count++;
expect(node.toSource(), equals(expectedSource));
- expect(semantics.kind, equals(AccessKind.STATIC_PROPERTY));
+ expect(semantics.kind, equals(AccessKind.LOCAL_FUNCTION));
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.element.displayName, equals(expectedName));
+ expect(semantics.classElement, isNull);
expect(semantics.target, isNull);
expect(semantics.isRead, equals(isRead));
expect(semantics.isWrite, equals(isWrite));
@@ -2177,35 +2333,18 @@ class Helper {
/**
* Verify that the node represented by [expectedSource] is classified as
- * a static method.
+ * a local variable access.
*/
- void checkStaticMethod(String expectedSource, String expectedClass,
- String expectedName, bool defined, {bool isRead: false, bool isWrite: false,
- bool isInvoke: false}) {
+ 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.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.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));
@@ -2216,26 +2355,20 @@ class Helper {
}
/**
- * Verify that the node represented by [expectedSource] is classified as
- * a dynamic method invocation.
+ * Verify that the node represented by [expectedSource] is classified as a
+ * parameter access.
*/
- void checkDynamic(String expectedSource, String expectedTarget,
- String expectedName, {bool isRead: false, bool isWrite: false, bool isInvoke:
- false}) {
+ 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.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.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));
@@ -2246,19 +2379,25 @@ class Helper {
/**
* Verify that the node represented by [expectedSource] is classified as
- * a local function invocation.
+ * a static field element reference.
*/
- void checkLocalFunction(String expectedSource, String expectedName,
- {bool isRead: false, bool isWrite: false, bool isInvoke: false}) {
+ 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 = (AstNode node, AccessSemantics semantics) {
+ visitor.onAccess = (Expression node, AccessSemantics semantics) {
count++;
expect(node.toSource(), equals(expectedSource));
- expect(semantics.kind, equals(AccessKind.LOCAL_FUNCTION));
+ expect(semantics.kind, equals(AccessKind.STATIC_FIELD));
expect(semantics.identifier.name, equals(expectedName));
expect(semantics.element.displayName, equals(expectedName));
- expect(semantics.classElement, isNull);
+ 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));
@@ -2270,18 +2409,35 @@ class Helper {
/**
* Verify that the node represented by [expectedSource] is classified as
- * a local variable access.
+ * a static method.
*/
- void checkLocalVariable(String expectedSource, String expectedName,
- {bool isRead: false, bool isWrite: false, bool isInvoke: false}) {
+ 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.LOCAL_VARIABLE));
- expect(semantics.element.name, equals(expectedName));
- expect(semantics.classElement, isNull);
+ 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));
@@ -2292,19 +2448,30 @@ class Helper {
}
/**
- * Verify that the node represented by [expectedSource] is classified as a
- * parameter access.
+ * Verify that the node represented by [expectedSource] is classified as
+ * a static property access.
*/
- void checkParameter(String expectedSource, String expectedName, {bool isRead:
- false, bool isWrite: false, bool isInvoke: false}) {
+ 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 = (AstNode node, AccessSemantics semantics) {
+ visitor.onAccess = (Expression 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.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));
@@ -2318,8 +2485,8 @@ class Helper {
* 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) {
+ 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) {
@@ -2329,17 +2496,15 @@ class Helper {
expect(semantics.element.name, equals(expectedName));
expect(semantics.classElement, isNull);
expect(semantics.target, isNull);
- expect(semantics.isRead, isTrue);
+ expect(semantics.isRead, equals(isRead));
expect(semantics.isWrite, isFalse);
- expect(semantics.isInvoke, isFalse);
+ expect(semantics.isInvoke, equals(isInvoke));
};
libraryElement.unit.accept(visitor);
expect(count, equals(1));
}
}
-typedef void AccessHandler(Expression node, AccessSemantics semantics);
-
/**
* Visitor class used to run the tests.
*/
« no previous file with comments | « pkg/analyzer2dart/lib/src/identifier_semantics.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698