Skip to content

Commit 0ee1633

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Index references to extension methods.
R=brianwilkerson@google.com Change-Id: I8a902ca0125f6ce42acf49f1b3f632cc8b037f52 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/112620 Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
1 parent 38ca381 commit 0ee1633

File tree

2 files changed

+113
-2
lines changed

2 files changed

+113
-2
lines changed

pkg/analyzer/lib/src/dart/analysis/index.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,8 @@ class _IndexAssembler {
398398
nameIdParameter = _getStringInfo(element.name);
399399
element = element.enclosingElement;
400400
}
401-
if (element?.enclosingElement is ClassElement) {
401+
if (element?.enclosingElement is ClassElement ||
402+
element?.enclosingElement is ExtensionElement) {
402403
nameIdClassMember = _getStringInfo(element.name);
403404
element = element.enclosingElement;
404405
}

pkg/analyzer/test/src/dart/analysis/index_test.dart

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
import 'dart:async';
66
import 'dart:convert';
77

8+
import 'package:analyzer/dart/analysis/features.dart';
89
import 'package:analyzer/dart/analysis/results.dart';
910
import 'package:analyzer/dart/ast/ast.dart';
1011
import 'package:analyzer/dart/element/element.dart';
1112
import 'package:analyzer/src/dart/analysis/index.dart';
13+
import 'package:analyzer/src/generated/engine.dart';
1214
import 'package:analyzer/src/summary/format.dart';
1315
import 'package:analyzer/src/summary/idl.dart';
1416
import 'package:test/test.dart';
@@ -19,6 +21,7 @@ import 'base.dart';
1921
main() {
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+
13731483
class _ElementIndexAssert {
13741484
final IndexTest test;
13751485
final Element element;

0 commit comments

Comments
 (0)