44
55import 'package:analyzer/dart/analysis/features.dart' ;
66import 'package:analyzer/dart/element/element.dart' ;
7+ import 'package:analyzer/dart/element/element2.dart' ;
78import 'package:analyzer/dart/element/type.dart' ;
89import 'package:analyzer/src/dart/element/element.dart' ;
910import 'package:analyzer/src/dart/element/generic_inferrer.dart' ;
@@ -14,6 +15,7 @@ import 'package:analyzer/src/dart/element/type_algebra.dart';
1415import 'package:analyzer/src/dart/resolver/extension_member_resolver.dart' ;
1516import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart' ;
1617import 'package:analyzer/src/generated/inference_log.dart' ;
18+ import 'package:analyzer/src/utilities/extensions/element.dart' ;
1719
1820class InstantiatedExtensionWithMember {
1921 final _NotInstantiatedExtensionWithMember candidate;
@@ -49,6 +51,40 @@ class InstantiatedExtensionWithMember {
4951 }
5052}
5153
54+ class InstantiatedExtensionWithMember2 {
55+ final _NotInstantiatedExtensionWithMember2 candidate;
56+ final MapSubstitution substitution;
57+ final DartType extendedType;
58+
59+ InstantiatedExtensionWithMember2 (
60+ this .candidate,
61+ this .substitution,
62+ this .extendedType,
63+ );
64+
65+ ExtensionResolutionResult get asResolutionResult {
66+ return SingleExtensionResolutionResult (getter: getter, setter: setter);
67+ }
68+
69+ ExtensionElement2 get extension => candidate.extension ;
70+
71+ ExecutableElement ? get getter {
72+ var getter = candidate.getter.asElement;
73+ if (getter == null ) {
74+ return null ;
75+ }
76+ return ExecutableMember .from2 (getter, substitution);
77+ }
78+
79+ ExecutableElement ? get setter {
80+ var setter = candidate.setter.asElement;
81+ if (setter == null ) {
82+ return null ;
83+ }
84+ return ExecutableMember .from2 (setter, substitution);
85+ }
86+ }
87+
5288class InstantiatedExtensionWithoutMember {
5389 final ExtensionElement extension ;
5490 final MapSubstitution substitution;
@@ -72,6 +108,17 @@ abstract class _NotInstantiatedExtension<R> {
72108 });
73109}
74110
111+ abstract class _NotInstantiatedExtension2 <R > {
112+ final ExtensionElement2 extension ;
113+
114+ _NotInstantiatedExtension2 (this .extension );
115+
116+ R instantiate ({
117+ required MapSubstitution substitution,
118+ required DartType extendedType,
119+ });
120+ }
121+
75122class _NotInstantiatedExtensionWithMember
76123 extends _NotInstantiatedExtension <InstantiatedExtensionWithMember > {
77124 final ExecutableElement ? getter;
@@ -90,6 +137,24 @@ class _NotInstantiatedExtensionWithMember
90137 }
91138}
92139
140+ class _NotInstantiatedExtensionWithMember2
141+ extends _NotInstantiatedExtension2 <InstantiatedExtensionWithMember2 > {
142+ final ExecutableElement2 ? getter;
143+ final ExecutableElement2 ? setter;
144+
145+ _NotInstantiatedExtensionWithMember2 (super .extension ,
146+ {this .getter, this .setter})
147+ : assert (getter != null || setter != null );
148+
149+ @override
150+ InstantiatedExtensionWithMember2 instantiate ({
151+ required MapSubstitution substitution,
152+ required DartType extendedType,
153+ }) {
154+ return InstantiatedExtensionWithMember2 (this , substitution, extendedType);
155+ }
156+ }
157+
93158/// [_NotInstantiatedExtension] for any [ExtensionElement] .
94159class _NotInstantiatedExtensionWithoutMember
95160 extends _NotInstantiatedExtension <InstantiatedExtensionWithoutMember > {
@@ -180,6 +245,74 @@ extension ExtensionsExtensions on Iterable<ExtensionElement> {
180245 }
181246}
182247
248+ extension ExtensionsExtensions2 on Iterable <ExtensionElement2 > {
249+ /// Returns the sublist of [ExtensionElement2] s that have an instance member
250+ /// named [baseName] .
251+ List <_NotInstantiatedExtensionWithMember2 > havingMemberWithBaseName (
252+ Name baseName,
253+ ) {
254+ var result = < _NotInstantiatedExtensionWithMember2 > [];
255+ for (var extension in this ) {
256+ if (baseName.name == '[]' ) {
257+ ExecutableElement2 ? getter;
258+ ExecutableElement2 ? setter;
259+ for (var method in extension .getters2) {
260+ if (method.name3 == '[]' ) {
261+ getter = method;
262+ }
263+ }
264+ for (var method in extension .setters2) {
265+ if (method.name3 == '[]=' ) {
266+ setter = method;
267+ }
268+ }
269+ if (getter != null || setter != null ) {
270+ result.add (
271+ _NotInstantiatedExtensionWithMember2 (
272+ extension ,
273+ getter: getter,
274+ setter: setter,
275+ ),
276+ );
277+ }
278+ } else {
279+ for (var field in extension .fields2) {
280+ if (field.isStatic) {
281+ continue ;
282+ }
283+ var fieldName = Name (extension .library2.uri, field.displayName);
284+ if (fieldName == baseName) {
285+ result.add (
286+ _NotInstantiatedExtensionWithMember2 (
287+ extension ,
288+ getter: field.getter2,
289+ setter: field.setter2,
290+ ),
291+ );
292+ break ;
293+ }
294+ }
295+ for (var method in extension .methods2) {
296+ if (method.isStatic) {
297+ continue ;
298+ }
299+ var methodName = Name (extension .library2.uri, method.displayName);
300+ if (methodName == baseName) {
301+ result.add (
302+ _NotInstantiatedExtensionWithMember2 (
303+ extension ,
304+ getter: method,
305+ ),
306+ );
307+ break ;
308+ }
309+ }
310+ }
311+ }
312+ return result;
313+ }
314+ }
315+
183316extension NotInstantiatedExtensionsExtensions <R >
184317 on Iterable <_NotInstantiatedExtension <R >> {
185318 /// Extensions that can be applied, within [targetLibrary] , to [targetType] .
0 commit comments