5
5
import 'dart:async' ;
6
6
import 'dart:convert' ;
7
7
8
+ import 'package:analyzer/dart/analysis/features.dart' ;
8
9
import 'package:analyzer/dart/analysis/results.dart' ;
9
10
import 'package:analyzer/dart/ast/ast.dart' ;
10
11
import 'package:analyzer/dart/element/element.dart' ;
11
12
import 'package:analyzer/src/dart/analysis/index.dart' ;
13
+ import 'package:analyzer/src/generated/engine.dart' ;
12
14
import 'package:analyzer/src/summary/format.dart' ;
13
15
import 'package:analyzer/src/summary/idl.dart' ;
14
16
import 'package:test/test.dart' ;
@@ -19,6 +21,7 @@ import 'base.dart';
19
21
main () {
20
22
defineReflectiveSuite (() {
21
23
defineReflectiveTests (IndexTest );
24
+ defineReflectiveTests (IndexWithExtensionMethodsTest );
22
25
});
23
26
}
24
27
@@ -1286,7 +1289,8 @@ main() {
1286
1289
}
1287
1290
}
1288
1291
for (Element e = element; e != null ; e = e.enclosingElement) {
1289
- if (e.enclosingElement is ClassElement ) {
1292
+ if (e.enclosingElement is ClassElement ||
1293
+ e.enclosingElement is ExtensionElement ) {
1290
1294
classMemberId = _getStringId (e.name);
1291
1295
break ;
1292
1296
}
@@ -1370,6 +1374,112 @@ main() {
1370
1374
}
1371
1375
}
1372
1376
1377
+ @reflectiveTest
1378
+ class IndexWithExtensionMethodsTest extends IndexTest {
1379
+ @override
1380
+ AnalysisOptionsImpl createAnalysisOptions () => AnalysisOptionsImpl ()
1381
+ ..contextFeatures = new FeatureSet .forTesting (
1382
+ sdkVersion: '2.3.0' , additionalFeatures: [Feature .extension_methods]);
1383
+
1384
+ test_isInvokedBy_MethodElement_ofExtension_instance () async {
1385
+ await _indexTestUnit ('''
1386
+ class A {}
1387
+
1388
+ extension E on A {
1389
+ void foo() {}
1390
+ }
1391
+
1392
+ main(A a) {
1393
+ a.foo();
1394
+ }
1395
+ ''' );
1396
+ MethodElement element = findElement ('foo' );
1397
+ assertThat (element)..isInvokedAt ('foo();' , true );
1398
+ }
1399
+
1400
+ test_isInvokedBy_MethodElement_ofExtension_static () async {
1401
+ await _indexTestUnit ('''
1402
+ class A {}
1403
+
1404
+ extension E on A {
1405
+ static void foo() {}
1406
+ }
1407
+
1408
+ main(A a) {
1409
+ E.foo();
1410
+ }
1411
+ ''' );
1412
+ MethodElement element = findElement ('foo' );
1413
+ assertThat (element)..isInvokedAt ('foo();' , true );
1414
+ }
1415
+
1416
+ test_isReferencedBy_ClassElement_fromExtension () async {
1417
+ await _indexTestUnit ('''
1418
+ class A<T> {}
1419
+
1420
+ extension E on A<int> {}
1421
+ ''' );
1422
+ ClassElement element = findElement ('A' );
1423
+ assertThat (element)..isReferencedAt ('A<int>' , false );
1424
+ }
1425
+
1426
+ test_isReferencedBy_ExtensionElement () async {
1427
+ await _indexTestUnit ('''
1428
+ class A {}
1429
+
1430
+ extension E on A {
1431
+ void foo() {}
1432
+ }
1433
+
1434
+ main(A a) {
1435
+ E(a).foo();
1436
+ }
1437
+ ''' );
1438
+ ExtensionElement element = findElement ('E' );
1439
+ assertThat (element)..isReferencedAt ('E(a).foo()' , false );
1440
+ }
1441
+
1442
+ test_isReferencedBy_PropertyAccessor_ofExtension_instance () async {
1443
+ await _indexTestUnit ('''
1444
+ class A {}
1445
+
1446
+ extension E on A {
1447
+ int get foo => 0;
1448
+ void set foo(int _) {}
1449
+ }
1450
+
1451
+ main(A a) {
1452
+ a.foo;
1453
+ a.foo = 0;
1454
+ }
1455
+ ''' );
1456
+ PropertyAccessorElement getter = findElement ('foo' , ElementKind .GETTER );
1457
+ PropertyAccessorElement setter = findElement ('foo=' );
1458
+ assertThat (getter)..isReferencedAt ('foo;' , true );
1459
+ assertThat (setter)..isReferencedAt ('foo = 0;' , true );
1460
+ }
1461
+
1462
+ test_isReferencedBy_PropertyAccessor_ofExtension_static () async {
1463
+ await _indexTestUnit ('''
1464
+ class A {}
1465
+
1466
+ extension E on A {
1467
+ static int get foo => 0;
1468
+ static void set foo(int _) {}
1469
+ }
1470
+
1471
+ main(A a) {
1472
+ a.foo;
1473
+ a.foo = 0;
1474
+ }
1475
+ ''' );
1476
+ PropertyAccessorElement getter = findElement ('foo' , ElementKind .GETTER );
1477
+ PropertyAccessorElement setter = findElement ('foo=' );
1478
+ assertThat (getter)..isReferencedAt ('foo;' , true );
1479
+ assertThat (setter)..isReferencedAt ('foo = 0;' , true );
1480
+ }
1481
+ }
1482
+
1373
1483
class _ElementIndexAssert {
1374
1484
final IndexTest test;
1375
1485
final Element element;
0 commit comments