55import 'dart:async' ;
66import 'dart:convert' ;
77
8+ import 'package:analyzer/dart/analysis/features.dart' ;
89import 'package:analyzer/dart/analysis/results.dart' ;
910import 'package:analyzer/dart/ast/ast.dart' ;
1011import 'package:analyzer/dart/element/element.dart' ;
1112import 'package:analyzer/src/dart/analysis/index.dart' ;
13+ import 'package:analyzer/src/generated/engine.dart' ;
1214import 'package:analyzer/src/summary/format.dart' ;
1315import 'package:analyzer/src/summary/idl.dart' ;
1416import 'package:test/test.dart' ;
@@ -19,6 +21,7 @@ import 'base.dart';
1921main () {
2022 defineReflectiveSuite (() {
2123 defineReflectiveTests (IndexTest );
24+ defineReflectiveTests (IndexWithExtensionMethodsTest );
2225 });
2326}
2427
@@ -1286,7 +1289,8 @@ main() {
12861289 }
12871290 }
12881291 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 ) {
12901294 classMemberId = _getStringId (e.name);
12911295 break ;
12921296 }
@@ -1370,6 +1374,112 @@ main() {
13701374 }
13711375}
13721376
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+
13731483class _ElementIndexAssert {
13741484 final IndexTest test;
13751485 final Element element;
0 commit comments