| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'package:analyzer/analyzer.dart'; | 5 import 'package:analyzer/analyzer.dart'; |
| 6 import 'package:analyzer/file_system/file_system.dart'; | 6 import 'package:analyzer/file_system/file_system.dart'; |
| 7 import 'package:analyzer/file_system/memory_file_system.dart'; | 7 import 'package:analyzer/file_system/memory_file_system.dart'; |
| 8 import 'package:analyzer/src/generated/element.dart'; | 8 import 'package:analyzer/src/generated/element.dart'; |
| 9 import 'package:analyzer/src/generated/engine.dart'; | 9 import 'package:analyzer/src/generated/engine.dart'; |
| 10 import 'package:analyzer/src/generated/sdk.dart'; | 10 import 'package:analyzer/src/generated/sdk.dart'; |
| 11 import 'package:analyzer/src/generated/source.dart'; | 11 import 'package:analyzer/src/generated/source.dart'; |
| 12 import 'package:analyzer/src/generated/source_io.dart'; | 12 import 'package:analyzer/src/generated/source_io.dart'; |
| 13 import 'package:analyzer2dart/src/identifier_semantics.dart'; | 13 import 'package:analyzer2dart/src/identifier_semantics.dart'; |
| 14 import 'package:unittest/unittest.dart'; | 14 import 'package:unittest/unittest.dart'; |
| 15 import 'package:sharedfrontend/src/access_semantics.dart'; | |
| 16 | 15 |
| 17 import 'mock_sdk.dart'; | 16 import 'mock_sdk.dart'; |
| 18 | 17 |
| 19 main() { | 18 main() { |
| 20 test('Call function defined at top level', () { | 19 test('Call function defined at top level', () { |
| 21 Helper helper = new Helper(''' | 20 Helper helper = new Helper(''' |
| 22 g() {} | 21 g() {} |
| 23 | 22 |
| 24 f() { | 23 f() { |
| 25 g(); | 24 g(); |
| (...skipping 2264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2290 int count = 0; | 2289 int count = 0; |
| 2291 visitor.onAccess = (AstNode node, AccessSemantics semantics) { | 2290 visitor.onAccess = (AstNode node, AccessSemantics semantics) { |
| 2292 count++; | 2291 count++; |
| 2293 expect(node.toSource(), equals(expectedSource)); | 2292 expect(node.toSource(), equals(expectedSource)); |
| 2294 expect(semantics.kind, equals(AccessKind.DYNAMIC)); | 2293 expect(semantics.kind, equals(AccessKind.DYNAMIC)); |
| 2295 if (expectedTarget == null) { | 2294 if (expectedTarget == null) { |
| 2296 expect(semantics.target, isNull); | 2295 expect(semantics.target, isNull); |
| 2297 } else { | 2296 } else { |
| 2298 expect(semantics.target.toSource(), equals(expectedTarget)); | 2297 expect(semantics.target.toSource(), equals(expectedTarget)); |
| 2299 } | 2298 } |
| 2300 expect(semantics.name, equals(expectedName)); | 2299 expect(semantics.identifier.name, equals(expectedName)); |
| 2301 expect(semantics.element, isNull); | 2300 expect(semantics.element, isNull); |
| 2302 expect(semantics.classElement, isNull); | 2301 expect(semantics.classElement, isNull); |
| 2303 expect(semantics.isRead, equals(isRead)); | 2302 expect(semantics.isRead, equals(isRead)); |
| 2304 expect(semantics.isWrite, equals(isWrite)); | 2303 expect(semantics.isWrite, equals(isWrite)); |
| 2305 expect(semantics.isInvoke, equals(isInvoke)); | 2304 expect(semantics.isInvoke, equals(isInvoke)); |
| 2306 }; | 2305 }; |
| 2307 libraryElement.unit.accept(visitor); | 2306 libraryElement.unit.accept(visitor); |
| 2308 expect(count, equals(1)); | 2307 expect(count, equals(1)); |
| 2309 } | 2308 } |
| 2310 | 2309 |
| 2311 /** | 2310 /** |
| 2312 * Verify that the node represented by [expectedSource] is classified as | 2311 * Verify that the node represented by [expectedSource] is classified as |
| 2313 * a local function invocation. | 2312 * a local function invocation. |
| 2314 */ | 2313 */ |
| 2315 void checkLocalFunction(String expectedSource, String expectedName, | 2314 void checkLocalFunction(String expectedSource, String expectedName, |
| 2316 {bool isRead: false, bool isWrite: false, bool isInvoke: false}) { | 2315 {bool isRead: false, bool isWrite: false, bool isInvoke: false}) { |
| 2317 TestVisitor visitor = new TestVisitor(); | 2316 TestVisitor visitor = new TestVisitor(); |
| 2318 int count = 0; | 2317 int count = 0; |
| 2319 visitor.onAccess = (AstNode node, AccessSemantics semantics) { | 2318 visitor.onAccess = (AstNode node, AccessSemantics semantics) { |
| 2320 count++; | 2319 count++; |
| 2321 expect(node.toSource(), equals(expectedSource)); | 2320 expect(node.toSource(), equals(expectedSource)); |
| 2322 expect(semantics.kind, equals(AccessKind.LOCAL_FUNCTION)); | 2321 expect(semantics.kind, equals(AccessKind.LOCAL_FUNCTION)); |
| 2323 expect(semantics.name, equals(expectedName)); | 2322 expect(semantics.identifier.name, equals(expectedName)); |
| 2324 expect(displayName(semantics.element), equals(expectedName)); | 2323 expect(semantics.element.displayName, equals(expectedName)); |
| 2325 expect(semantics.classElement, isNull); | 2324 expect(semantics.classElement, isNull); |
| 2326 expect(semantics.target, isNull); | 2325 expect(semantics.target, isNull); |
| 2327 expect(semantics.isRead, equals(isRead)); | 2326 expect(semantics.isRead, equals(isRead)); |
| 2328 expect(semantics.isWrite, equals(isWrite)); | 2327 expect(semantics.isWrite, equals(isWrite)); |
| 2329 expect(semantics.isInvoke, equals(isInvoke)); | 2328 expect(semantics.isInvoke, equals(isInvoke)); |
| 2330 }; | 2329 }; |
| 2331 libraryElement.unit.accept(visitor); | 2330 libraryElement.unit.accept(visitor); |
| 2332 expect(count, equals(1)); | 2331 expect(count, equals(1)); |
| 2333 } | 2332 } |
| 2334 | 2333 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2384 */ | 2383 */ |
| 2385 void checkStaticField(String expectedSource, String expectedClass, | 2384 void checkStaticField(String expectedSource, String expectedClass, |
| 2386 String expectedName, {bool isRead: false, bool isWrite: false, bool isInvo
ke: | 2385 String expectedName, {bool isRead: false, bool isWrite: false, bool isInvo
ke: |
| 2387 false}) { | 2386 false}) { |
| 2388 TestVisitor visitor = new TestVisitor(); | 2387 TestVisitor visitor = new TestVisitor(); |
| 2389 int count = 0; | 2388 int count = 0; |
| 2390 visitor.onAccess = (Expression node, AccessSemantics semantics) { | 2389 visitor.onAccess = (Expression node, AccessSemantics semantics) { |
| 2391 count++; | 2390 count++; |
| 2392 expect(node.toSource(), equals(expectedSource)); | 2391 expect(node.toSource(), equals(expectedSource)); |
| 2393 expect(semantics.kind, equals(AccessKind.STATIC_FIELD)); | 2392 expect(semantics.kind, equals(AccessKind.STATIC_FIELD)); |
| 2394 expect(semantics.name, equals(expectedName)); | 2393 expect(semantics.identifier.name, equals(expectedName)); |
| 2395 expect(displayName(semantics.element), equals(expectedName)); | 2394 expect(semantics.element.displayName, equals(expectedName)); |
| 2396 if (expectedClass == null) { | 2395 if (expectedClass == null) { |
| 2397 expect(semantics.classElement, isNull); | 2396 expect(semantics.classElement, isNull); |
| 2398 } else { | 2397 } else { |
| 2399 expect(semantics.classElement, isNotNull); | 2398 expect(semantics.classElement, isNotNull); |
| 2400 expect(displayName(semantics.classElement), equals(expectedClass)); | 2399 expect(semantics.classElement.displayName, equals(expectedClass)); |
| 2401 } | 2400 } |
| 2402 expect(semantics.target, isNull); | 2401 expect(semantics.target, isNull); |
| 2403 expect(semantics.isRead, equals(isRead)); | 2402 expect(semantics.isRead, equals(isRead)); |
| 2404 expect(semantics.isWrite, equals(isWrite)); | 2403 expect(semantics.isWrite, equals(isWrite)); |
| 2405 expect(semantics.isInvoke, equals(isInvoke)); | 2404 expect(semantics.isInvoke, equals(isInvoke)); |
| 2406 }; | 2405 }; |
| 2407 libraryElement.unit.accept(visitor); | 2406 libraryElement.unit.accept(visitor); |
| 2408 expect(count, equals(1)); | 2407 expect(count, equals(1)); |
| 2409 } | 2408 } |
| 2410 | 2409 |
| 2411 /** | 2410 /** |
| 2412 * Verify that the node represented by [expectedSource] is classified as | 2411 * Verify that the node represented by [expectedSource] is classified as |
| 2413 * a static method. | 2412 * a static method. |
| 2414 */ | 2413 */ |
| 2415 void checkStaticMethod(String expectedSource, String expectedClass, | 2414 void checkStaticMethod(String expectedSource, String expectedClass, |
| 2416 String expectedName, bool defined, {bool isRead: false, bool isWrite: fals
e, | 2415 String expectedName, bool defined, {bool isRead: false, bool isWrite: fals
e, |
| 2417 bool isInvoke: false}) { | 2416 bool isInvoke: false}) { |
| 2418 TestVisitor visitor = new TestVisitor(); | 2417 TestVisitor visitor = new TestVisitor(); |
| 2419 int count = 0; | 2418 int count = 0; |
| 2420 visitor.onAccess = (AstNode node, AccessSemantics semantics) { | 2419 visitor.onAccess = (AstNode node, AccessSemantics semantics) { |
| 2421 count++; | 2420 count++; |
| 2422 expect(node.toSource(), equals(expectedSource)); | 2421 expect(node.toSource(), equals(expectedSource)); |
| 2423 expect(semantics.kind, equals(AccessKind.STATIC_METHOD)); | 2422 expect(semantics.kind, equals(AccessKind.STATIC_METHOD)); |
| 2424 expect(semantics.name, equals(expectedName)); | 2423 expect(semantics.identifier.name, equals(expectedName)); |
| 2425 if (expectedClass == null) { | 2424 if (expectedClass == null) { |
| 2426 expect(semantics.classElement, isNull); | 2425 expect(semantics.classElement, isNull); |
| 2427 if (defined) { | 2426 if (defined) { |
| 2428 expect(semantics.element, new isInstanceOf<FunctionElement>()); | 2427 expect(semantics.element, new isInstanceOf<FunctionElement>()); |
| 2429 } | 2428 } |
| 2430 } else { | 2429 } else { |
| 2431 expect(semantics.classElement, isNotNull); | 2430 expect(semantics.classElement, isNotNull); |
| 2432 expect(displayName(semantics.classElement), equals(expectedClass)); | 2431 expect(semantics.classElement.displayName, equals(expectedClass)); |
| 2433 if (defined) { | 2432 if (defined) { |
| 2434 expect(semantics.element, new isInstanceOf<MethodElement>()); | 2433 expect(semantics.element, new isInstanceOf<MethodElement>()); |
| 2435 } | 2434 } |
| 2436 } | 2435 } |
| 2437 if (defined) { | 2436 if (defined) { |
| 2438 expect(displayName(semantics.element), equals(expectedName)); | 2437 expect(semantics.element.displayName, equals(expectedName)); |
| 2439 } else { | 2438 } else { |
| 2440 expect(semantics.element, isNull); | 2439 expect(semantics.element, isNull); |
| 2441 } | 2440 } |
| 2442 expect(semantics.target, isNull); | 2441 expect(semantics.target, isNull); |
| 2443 expect(semantics.isRead, equals(isRead)); | 2442 expect(semantics.isRead, equals(isRead)); |
| 2444 expect(semantics.isWrite, equals(isWrite)); | 2443 expect(semantics.isWrite, equals(isWrite)); |
| 2445 expect(semantics.isInvoke, equals(isInvoke)); | 2444 expect(semantics.isInvoke, equals(isInvoke)); |
| 2446 }; | 2445 }; |
| 2447 libraryElement.unit.accept(visitor); | 2446 libraryElement.unit.accept(visitor); |
| 2448 expect(count, equals(1)); | 2447 expect(count, equals(1)); |
| 2449 } | 2448 } |
| 2450 | 2449 |
| 2451 /** | 2450 /** |
| 2452 * Verify that the node represented by [expectedSource] is classified as | 2451 * Verify that the node represented by [expectedSource] is classified as |
| 2453 * a static property access. | 2452 * a static property access. |
| 2454 */ | 2453 */ |
| 2455 void checkStaticProperty(String expectedSource, String expectedClass, | 2454 void checkStaticProperty(String expectedSource, String expectedClass, |
| 2456 String expectedName, bool defined, {bool isRead: false, bool isWrite: fals
e, | 2455 String expectedName, bool defined, {bool isRead: false, bool isWrite: fals
e, |
| 2457 bool isInvoke: false}) { | 2456 bool isInvoke: false}) { |
| 2458 TestVisitor visitor = new TestVisitor(); | 2457 TestVisitor visitor = new TestVisitor(); |
| 2459 int count = 0; | 2458 int count = 0; |
| 2460 visitor.onAccess = (Expression node, AccessSemantics semantics) { | 2459 visitor.onAccess = (Expression node, AccessSemantics semantics) { |
| 2461 count++; | 2460 count++; |
| 2462 expect(node.toSource(), equals(expectedSource)); | 2461 expect(node.toSource(), equals(expectedSource)); |
| 2463 expect(semantics.kind, equals(AccessKind.STATIC_PROPERTY)); | 2462 expect(semantics.kind, equals(AccessKind.STATIC_PROPERTY)); |
| 2464 expect(semantics.name, equals(expectedName)); | 2463 expect(semantics.identifier.name, equals(expectedName)); |
| 2465 if (expectedClass == null) { | 2464 if (expectedClass == null) { |
| 2466 expect(semantics.classElement, isNull); | 2465 expect(semantics.classElement, isNull); |
| 2467 } else { | 2466 } else { |
| 2468 expect(semantics.classElement, isNotNull); | 2467 expect(semantics.classElement, isNotNull); |
| 2469 expect(displayName(semantics.classElement), equals(expectedClass)); | 2468 expect(semantics.classElement.displayName, equals(expectedClass)); |
| 2470 } | 2469 } |
| 2471 if (defined) { | 2470 if (defined) { |
| 2472 expect(displayName(semantics.element), equals(expectedName)); | 2471 expect(semantics.element.displayName, equals(expectedName)); |
| 2473 } else { | 2472 } else { |
| 2474 expect(semantics.element, isNull); | 2473 expect(semantics.element, isNull); |
| 2475 } | 2474 } |
| 2476 expect(semantics.target, isNull); | 2475 expect(semantics.target, isNull); |
| 2477 expect(semantics.isRead, equals(isRead)); | 2476 expect(semantics.isRead, equals(isRead)); |
| 2478 expect(semantics.isWrite, equals(isWrite)); | 2477 expect(semantics.isWrite, equals(isWrite)); |
| 2479 expect(semantics.isInvoke, equals(isInvoke)); | 2478 expect(semantics.isInvoke, equals(isInvoke)); |
| 2480 }; | 2479 }; |
| 2481 libraryElement.unit.accept(visitor); | 2480 libraryElement.unit.accept(visitor); |
| 2482 expect(count, equals(1)); | 2481 expect(count, equals(1)); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2528 } | 2527 } |
| 2529 | 2528 |
| 2530 @override | 2529 @override |
| 2531 visitSimpleIdentifier(SimpleIdentifier node) { | 2530 visitSimpleIdentifier(SimpleIdentifier node) { |
| 2532 AccessSemantics semantics = node.accept(ACCESS_SEMANTICS_VISITOR); | 2531 AccessSemantics semantics = node.accept(ACCESS_SEMANTICS_VISITOR); |
| 2533 if (semantics != null) { | 2532 if (semantics != null) { |
| 2534 onAccess(node, semantics); | 2533 onAccess(node, semantics); |
| 2535 } | 2534 } |
| 2536 } | 2535 } |
| 2537 } | 2536 } |
| 2538 | |
| 2539 // TODO(johnniwinther): Remove this when the semantics of element names have | |
| 2540 // been resolved. | |
| 2541 /// Helper methods for accessing the [displayName] method without warning. | |
| 2542 String displayName(element) => element.displayName; | |
| OLD | NEW |