Skip to content

Commit 13e5ec9

Browse files
scheglovCommit Queue
authored andcommitted
Don't wrap ExecutableElementImpl into ExecutableMember if it does not use the container type parameters.
Change-Id: I3050ff0f9df62693dfe829f8cf8aae2afb51bb95 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/420980 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent 37b0f28 commit 13e5ec9

File tree

5 files changed

+152
-39
lines changed

5 files changed

+152
-39
lines changed

pkg/analyzer/lib/src/dart/element/member.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,9 @@ abstract class ExecutableMember extends Member
417417
combined = Substitution.fromMap2(map);
418418
} else {
419419
declaration = element as ExecutableElementImpl;
420+
if (!declaration.hasEnclosingTypeParameterReference) {
421+
return declaration;
422+
}
420423
}
421424

422425
switch (declaration) {

pkg/analyzer/test/src/dart/resolution/extension_method_test.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1548,9 +1548,7 @@ MethodInvocation
15481548
operator: .
15491549
methodName: SimpleIdentifier
15501550
token: foo
1551-
element: MethodMember
1552-
baseElement: <testLibraryFragment>::@extension::E::@method::foo#element
1553-
substitution: {T: Null}
1551+
element: <testLibraryFragment>::@extension::E::@method::foo#element
15541552
staticType: void Function()
15551553
argumentList: ArgumentList
15561554
leftParenthesis: (

pkg/analyzer/test/src/dart/resolution/extension_override_test.dart

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,7 @@ PropertyAccess
346346
operator: .
347347
propertyName: SimpleIdentifier
348348
token: g
349-
element: GetterMember
350-
baseElement: <testLibraryFragment>::@extension::E::@getter::g#element
351-
substitution: {T: int}
349+
element: <testLibraryFragment>::@extension::E::@getter::g#element
352350
staticType: int
353351
staticType: int
354352
''');
@@ -446,9 +444,7 @@ PropertyAccess
446444
operator: .
447445
propertyName: SimpleIdentifier
448446
token: g
449-
element: GetterMember
450-
baseElement: package:test/lib.dart::<fragment>::@extension::E::@getter::g#element
451-
substitution: {T: int}
447+
element: package:test/lib.dart::<fragment>::@extension::E::@getter::g#element
452448
staticType: int
453449
staticType: int
454450
''');
@@ -624,9 +620,7 @@ MethodInvocation
624620
operator: .
625621
methodName: SimpleIdentifier
626622
token: m
627-
element: MethodMember
628-
baseElement: <testLibraryFragment>::@extension::E::@method::m#element
629-
substitution: {T: int}
623+
element: <testLibraryFragment>::@extension::E::@method::m#element
630624
staticType: void Function()
631625
argumentList: ArgumentList
632626
leftParenthesis: (
@@ -732,9 +726,7 @@ MethodInvocation
732726
operator: .
733727
methodName: SimpleIdentifier
734728
token: m
735-
element: MethodMember
736-
baseElement: package:test/lib.dart::<fragment>::@extension::E::@method::m#element
737-
substitution: {T: int}
729+
element: package:test/lib.dart::<fragment>::@extension::E::@method::m#element
738730
staticType: void Function()
739731
argumentList: ArgumentList
740732
leftParenthesis: (
@@ -1192,15 +1184,11 @@ AssignmentExpression
11921184
operator: =
11931185
rightHandSide: IntegerLiteral
11941186
literal: 0
1195-
correspondingParameter: ParameterMember
1196-
baseElement: <testLibraryFragment>::@extension::E::@setter::s::@parameter::x#element
1197-
substitution: {T: int}
1187+
correspondingParameter: <testLibraryFragment>::@extension::E::@setter::s::@parameter::x#element
11981188
staticType: int
11991189
readElement2: <null>
12001190
readType: null
1201-
writeElement2: SetterMember
1202-
baseElement: <testLibraryFragment>::@extension::E::@setter::s#element
1203-
substitution: {T: int}
1191+
writeElement2: <testLibraryFragment>::@extension::E::@setter::s#element
12041192
writeType: int
12051193
element: <null>
12061194
staticType: int
@@ -1318,15 +1306,11 @@ AssignmentExpression
13181306
operator: =
13191307
rightHandSide: IntegerLiteral
13201308
literal: 0
1321-
correspondingParameter: ParameterMember
1322-
baseElement: package:test/lib.dart::<fragment>::@extension::E::@setter::s::@parameter::x#element
1323-
substitution: {T: int}
1309+
correspondingParameter: package:test/lib.dart::<fragment>::@extension::E::@setter::s::@parameter::x#element
13241310
staticType: int
13251311
readElement2: <null>
13261312
readType: null
1327-
writeElement2: SetterMember
1328-
baseElement: package:test/lib.dart::<fragment>::@extension::E::@setter::s#element
1329-
substitution: {T: int}
1313+
writeElement2: package:test/lib.dart::<fragment>::@extension::E::@setter::s#element
13301314
writeType: int
13311315
element: <null>
13321316
staticType: int
@@ -1434,13 +1418,9 @@ AssignmentExpression
14341418
literal: 0
14351419
correspondingParameter: dart:core::<fragment>::@class::num::@method::+::@parameter::other#element
14361420
staticType: int
1437-
readElement2: GetterMember
1438-
baseElement: <testLibraryFragment>::@extension::E::@getter::s#element
1439-
substitution: {T: int}
1421+
readElement2: <testLibraryFragment>::@extension::E::@getter::s#element
14401422
readType: int
1441-
writeElement2: SetterMember
1442-
baseElement: <testLibraryFragment>::@extension::E::@setter::s#element
1443-
substitution: {T: int}
1423+
writeElement2: <testLibraryFragment>::@extension::E::@setter::s#element
14441424
writeType: int
14451425
element: dart:core::<fragment>::@class::num::@method::+#element
14461426
staticType: int
@@ -1562,13 +1542,9 @@ AssignmentExpression
15621542
literal: 0
15631543
correspondingParameter: dart:core::<fragment>::@class::num::@method::+::@parameter::other#element
15641544
staticType: int
1565-
readElement2: GetterMember
1566-
baseElement: package:test/lib.dart::<fragment>::@extension::E::@getter::s#element
1567-
substitution: {T: int}
1545+
readElement2: package:test/lib.dart::<fragment>::@extension::E::@getter::s#element
15681546
readType: int
1569-
writeElement2: SetterMember
1570-
baseElement: package:test/lib.dart::<fragment>::@extension::E::@setter::s#element
1571-
substitution: {T: int}
1547+
writeElement2: package:test/lib.dart::<fragment>::@extension::E::@setter::s#element
15721548
writeType: int
15731549
element: dart:core::<fragment>::@class::num::@method::+#element
15741550
staticType: int

pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4679,6 +4679,74 @@ MethodInvocation
46794679
''');
46804680
}
46814681

4682+
test_hasReceiver_interfaceType_inheritedMethod_ofGenericClass_usesTypeParameter() async {
4683+
await assertNoErrorsInCode(r'''
4684+
class A<T> {
4685+
T foo() => throw 0;
4686+
}
4687+
4688+
class B extends A<int> {}
4689+
4690+
void f(B b) {
4691+
b.foo();
4692+
}
4693+
''');
4694+
4695+
var node = findNode.singleMethodInvocation;
4696+
assertResolvedNodeText(node, r'''
4697+
MethodInvocation
4698+
target: SimpleIdentifier
4699+
token: b
4700+
element: <testLibraryFragment>::@function::f::@parameter::b#element
4701+
staticType: B
4702+
operator: .
4703+
methodName: SimpleIdentifier
4704+
token: foo
4705+
element: MethodMember
4706+
baseElement: <testLibraryFragment>::@class::A::@method::foo#element
4707+
substitution: {T: int}
4708+
staticType: int Function()
4709+
argumentList: ArgumentList
4710+
leftParenthesis: (
4711+
rightParenthesis: )
4712+
staticInvokeType: int Function()
4713+
staticType: int
4714+
''');
4715+
}
4716+
4717+
test_hasReceiver_interfaceType_inheritedMethod_ofGenericClass_usesTypeParameterNot() async {
4718+
await assertNoErrorsInCode(r'''
4719+
class A<T> {
4720+
double foo() => throw 0;
4721+
}
4722+
4723+
class B extends A<int> {}
4724+
4725+
void f(B b) {
4726+
b.foo();
4727+
}
4728+
''');
4729+
4730+
var node = findNode.singleMethodInvocation;
4731+
assertResolvedNodeText(node, r'''
4732+
MethodInvocation
4733+
target: SimpleIdentifier
4734+
token: b
4735+
element: <testLibraryFragment>::@function::f::@parameter::b#element
4736+
staticType: B
4737+
operator: .
4738+
methodName: SimpleIdentifier
4739+
token: foo
4740+
element: <testLibraryFragment>::@class::A::@method::foo#element
4741+
staticType: double Function()
4742+
argumentList: ArgumentList
4743+
leftParenthesis: (
4744+
rightParenthesis: )
4745+
staticInvokeType: double Function()
4746+
staticType: double
4747+
''');
4748+
}
4749+
46824750
@SkippedTest() // TODO(scheglov): implement augmentation
46834751
test_hasReceiver_interfaceType_mixin_augmentationAugments() async {
46844752
newFile('$testPackageLibPath/a.dart', r'''

pkg/analyzer/test/src/dart/resolution/property_access_test.dart

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,74 @@ PropertyAccess
10201020
''');
10211021
}
10221022

1023+
test_ofClass_inheritedGetter_ofGenericClass_usesTypeParameter() async {
1024+
await assertNoErrorsInCode(r'''
1025+
class A<T> {
1026+
T get foo => throw 0;
1027+
}
1028+
1029+
class B extends A<int> {}
1030+
1031+
void f(B b) {
1032+
(b).foo;
1033+
}
1034+
''');
1035+
1036+
var node = findNode.singlePropertyAccess;
1037+
assertResolvedNodeText(node, r'''
1038+
PropertyAccess
1039+
target: ParenthesizedExpression
1040+
leftParenthesis: (
1041+
expression: SimpleIdentifier
1042+
token: b
1043+
element: <testLibraryFragment>::@function::f::@parameter::b#element
1044+
staticType: B
1045+
rightParenthesis: )
1046+
staticType: B
1047+
operator: .
1048+
propertyName: SimpleIdentifier
1049+
token: foo
1050+
element: GetterMember
1051+
baseElement: <testLibraryFragment>::@class::A::@getter::foo#element
1052+
substitution: {T: int}
1053+
staticType: int
1054+
staticType: int
1055+
''');
1056+
}
1057+
1058+
test_ofClass_inheritedGetter_ofGenericClass_usesTypeParameterNot() async {
1059+
await assertNoErrorsInCode(r'''
1060+
class A<T> {
1061+
double get foo => throw 0;
1062+
}
1063+
1064+
class B extends A<int> {}
1065+
1066+
void f(B b) {
1067+
(b).foo;
1068+
}
1069+
''');
1070+
1071+
var node = findNode.singlePropertyAccess;
1072+
assertResolvedNodeText(node, r'''
1073+
PropertyAccess
1074+
target: ParenthesizedExpression
1075+
leftParenthesis: (
1076+
expression: SimpleIdentifier
1077+
token: b
1078+
element: <testLibraryFragment>::@function::f::@parameter::b#element
1079+
staticType: B
1080+
rightParenthesis: )
1081+
staticType: B
1082+
operator: .
1083+
propertyName: SimpleIdentifier
1084+
token: foo
1085+
element: <testLibraryFragment>::@class::A::@getter::foo#element
1086+
staticType: double
1087+
staticType: double
1088+
''');
1089+
}
1090+
10231091
test_ofDynamic_read_hash() async {
10241092
await assertNoErrorsInCode('''
10251093
void f(dynamic a) {

0 commit comments

Comments
 (0)