22// for details. All rights reserved. Use of this source code is governed by a
33// BSD-style license that can be found in the LICENSE file.
44
5- import 'package:analyzer/dart/element/scope.dart' ;
65import 'package:analyzer/src/dart/ast/ast.dart' ;
76import 'package:analyzer/src/dart/element/element.dart' ;
87import 'package:analyzer/src/dart/element/type_system.dart' ;
98import 'package:analyzer/src/summary2/ast_resolver.dart' ;
109import 'package:analyzer/src/summary2/library_builder.dart' ;
1110import 'package:analyzer/src/summary2/link.dart' ;
1211import 'package:analyzer/src/summary2/linking_node_scope.dart' ;
13- import 'package:analyzer/src/utilities/extensions/element .dart' ;
12+ import 'package:analyzer/src/utilities/extensions/object .dart' ;
1413
1514class DefaultValueResolver {
1615 final Linker _linker;
@@ -21,26 +20,42 @@ class DefaultValueResolver {
2120 : _typeSystem = _libraryBuilder.element.typeSystem;
2221
2322 void resolve () {
24- for (var libraryFragment in _libraryBuilder.element.fragments) {
25- _UnitContext (libraryFragment)
26- ..forEach (libraryFragment.classes, _interface)
27- ..forEach (libraryFragment.enums, _interface)
28- ..forEach (libraryFragment.extensions, _extension)
29- ..forEach (libraryFragment.extensionTypes, _interface)
30- ..forEach (libraryFragment.functions, _executable)
31- ..forEach (libraryFragment.mixins, _interface);
23+ var libraryElement = _libraryBuilder.element;
24+ var instanceElementListList = [
25+ libraryElement.classes,
26+ libraryElement.enums,
27+ libraryElement.extensions,
28+ libraryElement.extensionTypes,
29+ libraryElement.mixins,
30+ ];
31+ for (var instanceElementList in instanceElementListList) {
32+ for (var instanceElement in instanceElementList) {
33+ for (var method in instanceElement.methods) {
34+ _executableElement (
35+ method,
36+ enclosingInterfaceElement: instanceElement.ifTypeOrNull (),
37+ );
38+ }
39+ if (instanceElement case InterfaceElementImpl interfaceElement) {
40+ for (var constructor in interfaceElement.constructors) {
41+ _executableElement (
42+ constructor,
43+ enclosingInterfaceElement: interfaceElement,
44+ );
45+ }
46+ }
47+ }
3248 }
33- }
3449
35- void _constructor ( _ClassContext context, ConstructorFragmentImpl element ) {
36- if (element.isSynthetic) return ;
37- _executable (context, element);
50+ for ( var topLevelFunction in libraryElement.topLevelFunctions ) {
51+ _executableElement (topLevelFunction, enclosingInterfaceElement : null ) ;
52+ }
3853 }
3954
40- DefaultFormalParameterImpl ? _defaultParameter (
41- FormalParameterFragmentImpl element ,
55+ DefaultFormalParameterImpl ? _defaultParameterNode (
56+ FormalParameterFragmentImpl fragment ,
4257 ) {
43- var node = _linker.getLinkingNode (element );
58+ var node = _linker.getLinkingNode (fragment );
4459 if (node? .parent case DefaultFormalParameterImpl defaultParent) {
4560 if (defaultParent.defaultValue != null ) {
4661 return defaultParent;
@@ -49,110 +64,44 @@ class DefaultValueResolver {
4964 return null ;
5065 }
5166
52- void _executable (_Context context, ExecutableFragmentImpl element) {
53- _ExecutableContext (
54- enclosingContext: context,
55- executableElement: element,
56- scope: _scopeFromElement (element),
57- ).forEach (element.parameters, _parameter);
58- }
59-
60- void _extension (_UnitContext context, ExtensionFragmentImpl element) {
61- context.forEach (element.methods, _executable);
62- }
63-
64- void _interface (_UnitContext context, InterfaceFragmentImpl element) {
65- _ClassContext (context, element)
66- ..forEach (element.constructors, _constructor)
67- ..forEach (element.methods, _executable);
67+ void _executableElement (
68+ ExecutableElementImpl element, {
69+ required InterfaceElementImpl ? enclosingInterfaceElement,
70+ }) {
71+ for (var formalParameter in element.formalParameters) {
72+ _formalParameterElement (
73+ formalParameter as FormalParameterElementImpl ,
74+ enclosingInterfaceElement: enclosingInterfaceElement,
75+ enclosingExecutableElement: element,
76+ );
77+ }
6878 }
6979
70- void _parameter (
71- _ExecutableContext context,
72- FormalParameterFragmentImpl parameter,
73- ) {
74- // If a function typed parameter, process nested parameters.
75- context.forEach (parameter.parameters, _parameter);
76-
77- var node = _defaultParameter (parameter);
78- if (node == null ) return ;
80+ void _formalParameterElement (
81+ FormalParameterElementImpl formalParameter, {
82+ required InterfaceElementImpl ? enclosingInterfaceElement,
83+ required ExecutableElementImpl enclosingExecutableElement,
84+ }) {
85+ var firstFragment = formalParameter.firstFragment;
86+ var firstNode = _defaultParameterNode (firstFragment);
87+ if (firstNode == null ) {
88+ return ;
89+ }
7990
80- var contextType = _typeSystem.eliminateTypeVariables (parameter .type);
91+ var contextType = _typeSystem.eliminateTypeVariables (formalParameter .type);
8192
8293 var analysisOptions = _libraryBuilder.kind.file.analysisOptions;
8394 var astResolver = AstResolver (
8495 _linker,
85- context .libraryFragment,
86- context .scope,
96+ firstFragment .libraryFragment as LibraryFragmentImpl ,
97+ LinkingNodeContext . get (firstNode) .scope,
8798 analysisOptions,
88- enclosingClassElement: context.classElement ? .asElement2 ,
89- enclosingExecutableElement: context.executableElement.asElement2 ,
99+ enclosingClassElement: enclosingInterfaceElement ,
100+ enclosingExecutableElement: enclosingExecutableElement ,
90101 );
91102 astResolver.resolveExpression (
92- () => node .defaultValue! ,
103+ () => firstNode .defaultValue! ,
93104 contextType: contextType,
94105 );
95106 }
96-
97- Scope _scopeFromElement (FragmentImpl element) {
98- var node = _linker.getLinkingNode (element)! ;
99- return LinkingNodeContext .get (node).scope;
100- }
101- }
102-
103- class _ClassContext extends _Context {
104- final _UnitContext unitContext;
105-
106- @override
107- final InterfaceFragmentImpl classElement;
108-
109- _ClassContext (this .unitContext, this .classElement);
110-
111- @override
112- LibraryFragmentImpl get libraryFragment {
113- return unitContext.libraryFragment;
114- }
115- }
116-
117- abstract class _Context {
118- InterfaceFragmentImpl ? get classElement => null ;
119-
120- LibraryFragmentImpl get libraryFragment;
121- }
122-
123- class _ExecutableContext extends _Context {
124- final _Context enclosingContext;
125- final ExecutableFragmentImpl executableElement;
126- final Scope scope;
127-
128- _ExecutableContext ({
129- required this .enclosingContext,
130- required this .executableElement,
131- required this .scope,
132- });
133-
134- @override
135- InterfaceFragmentImpl ? get classElement {
136- return enclosingContext.classElement;
137- }
138-
139- @override
140- LibraryFragmentImpl get libraryFragment {
141- return enclosingContext.libraryFragment;
142- }
143- }
144-
145- class _UnitContext extends _Context {
146- @override
147- final LibraryFragmentImpl libraryFragment;
148-
149- _UnitContext (this .libraryFragment);
150- }
151-
152- extension _ContextExtension <C extends _Context > on C {
153- void forEach <T >(List <T > elements, void Function (C context, T element) f) {
154- for (var element in elements) {
155- f (this , element);
156- }
157- }
158107}
0 commit comments