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/element .dart' ;
5+ import 'package:analyzer/dart/element/element2 .dart' ;
66import 'package:analyzer/error/listener.dart' ;
77import 'package:analyzer/src/dart/ast/ast.dart' ;
88import 'package:analyzer/src/dart/ast/extensions.dart' ;
9- import 'package:analyzer/src/dart/element/element.dart' ;
109import 'package:analyzer/src/dart/element/type_system.dart' ;
1110import 'package:analyzer/src/error/codes.dart' ;
1211
1312/// Verifier for initializing fields in constructors.
1413class ConstructorFieldsVerifier {
1514 final TypeSystemImpl typeSystem;
16- final Map <AugmentedInstanceElement , _Interface > _interfaces = Map .identity ();
15+ final Map <InstanceElement2 , _Interface > _interfaces = Map .identity ();
1716
1817 ConstructorFieldsVerifier ({
1918 required this .typeSystem,
2019 });
2120
2221 void addConstructors (
2322 ErrorReporter errorReporter,
24- AugmentedInstanceElement augmented ,
23+ InterfaceElement2 element ,
2524 List <ClassMember > members,
2625 ) {
27- var interfaceFields = _forInterface (augmented );
26+ var interfaceFields = _forInterface (element );
2827 var constructors = members.whereType <ConstructorDeclarationImpl >();
2928 for (var constructor in constructors) {
3029 _addConstructor (
@@ -54,45 +53,43 @@ class ConstructorFieldsVerifier {
5453 return ;
5554 }
5655
57- var element = node.declaredElement ! ;
56+ var fragment = node.declaredFragment ! ;
5857 var constructorState = interfaceFields.forConstructor (
5958 errorReporter: errorReporter,
6059 node: node,
61- element : element ,
60+ fragment : fragment ,
6261 );
63- if (constructorState == null ) {
64- return ;
65- }
6662
67- if (! element .isAugmentation) {
63+ if (! fragment .isAugmentation) {
6864 constructorState.updateWithParameters (node);
6965 }
7066
7167 constructorState.updateWithInitializers (errorReporter, node);
7268 }
7369
74- _Interface _forInterface (AugmentedInstanceElement augmented ) {
75- if (_interfaces[augmented ] case var result? ) {
70+ _Interface _forInterface (InterfaceElement2 element ) {
71+ if (_interfaces[element ] case var result? ) {
7672 return result;
7773 }
7874
79- var fieldMap = < FieldElement , _InitState > {};
75+ var fieldMap = < FieldElement2 , _InitState > {};
8076
81- for (var field in augmented .fields ) {
77+ for (var field in element.fields2 ) {
8278 if (field.isSynthetic) {
8379 continue ;
8480 }
85- if (augmented is AugmentedEnumElement && field.name == 'index' ) {
81+ if (element is EnumElement2 && field.name3 == 'index' ) {
8682 continue ;
8783 }
88- fieldMap[field] = field.hasInitializer
84+ // TODO(scheglov): this is wrong
85+ fieldMap[field] = field.firstFragment.hasInitializer
8986 ? _InitState .initInDeclaration
9087 : _InitState .notInit;
9188 }
9289
93- return _interfaces[augmented ] = _Interface (
90+ return _interfaces[element ] = _Interface (
9491 typeSystem: typeSystem,
95- augmented : augmented ,
92+ element : element ,
9693 fields: fieldMap,
9794 );
9895 }
@@ -102,8 +99,8 @@ class _Constructor {
10299 final TypeSystemImpl typeSystem;
103100 final ErrorReporter errorReporter;
104101 final ConstructorDeclaration node;
105- final ConstructorElementImpl element;
106- final Map <FieldElement , _InitState > fields;
102+ final ConstructorElement2 element;
103+ final Map <FieldElement2 , _InitState > fields;
107104
108105 /// Set to `true` if the constructor redirects.
109106 bool hasRedirectingConstructorInvocation = false ;
@@ -122,34 +119,40 @@ class _Constructor {
122119 }
123120
124121 // Prepare lists of not initialized fields.
125- var notInitFinalFields = < FieldElement > [];
126- var notInitNonNullableFields = < FieldElement > [];
127- fields.forEach ((FieldElement field, _InitState state) {
122+ var notInitFinalFields = < _Field > [];
123+ var notInitNonNullableFields = < _Field > [];
124+ fields.forEach ((field, state) {
128125 if (state != _InitState .notInit) return ;
129126 if (field.isLate) return ;
130127 if (field.isAbstract || field.isExternal) return ;
131128 if (field.isStatic) return ;
132129
130+ var name = field.name3;
131+ if (name == null ) return ;
132+
133133 if (field.isFinal) {
134- notInitFinalFields.add (field);
134+ notInitFinalFields.add (
135+ _Field (field, name),
136+ );
135137 } else if (typeSystem.isPotentiallyNonNullable (field.type)) {
136- notInitNonNullableFields.add (field);
138+ notInitNonNullableFields.add (
139+ _Field (field, name),
140+ );
137141 }
138142 });
139143
140- reportNotInitializedFinal (node, notInitFinalFields);
141- reportNotInitializedNonNullable (node, notInitNonNullableFields);
144+ reportNotInitializedFinal (notInitFinalFields);
145+ reportNotInitializedNonNullable (notInitNonNullableFields);
142146 }
143147
144148 void reportNotInitializedFinal (
145- ConstructorDeclaration node,
146- List <FieldElement > notInitFinalFields,
149+ List <_Field > notInitFinalFields,
147150 ) {
148151 if (notInitFinalFields.isEmpty) {
149152 return ;
150153 }
151154
152- var names = notInitFinalFields.map ((item ) => item .name).toList ();
155+ var names = notInitFinalFields.map ((f ) => f .name).toList ();
153156 names.sort ();
154157
155158 if (names.length == 1 ) {
@@ -174,8 +177,7 @@ class _Constructor {
174177 }
175178
176179 void reportNotInitializedNonNullable (
177- ConstructorDeclaration node,
178- List <FieldElement > notInitNonNullableFields,
180+ List <_Field > notInitNonNullableFields,
179181 ) {
180182 if (notInitNonNullableFields.isEmpty) {
181183 return ;
@@ -203,14 +205,14 @@ class _Constructor {
203205 hasRedirectingConstructorInvocation = true ;
204206 }
205207 if (initializer is ConstructorFieldInitializer ) {
206- SimpleIdentifier fieldName = initializer.fieldName;
207- var element = fieldName.staticElement ;
208- if (element is FieldElement ) {
209- var state = fields[element ];
208+ var fieldName = initializer.fieldName;
209+ var fieldElement = fieldName.element ;
210+ if (fieldElement is FieldElement2 ) {
211+ var state = fields[fieldElement ];
210212 if (state == _InitState .notInit) {
211- fields[element ] = _InitState .initInInitializer;
213+ fields[fieldElement ] = _InitState .initInInitializer;
212214 } else if (state == _InitState .initInDeclaration) {
213- if (element .isFinal || element .isConst) {
215+ if (fieldElement .isFinal || fieldElement .isConst) {
214216 errorReporter.atNode (
215217 fieldName,
216218 CompileTimeErrorCode
@@ -227,7 +229,7 @@ class _Constructor {
227229 errorReporter.atNode (
228230 fieldName,
229231 CompileTimeErrorCode .FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS ,
230- arguments: [element .displayName],
232+ arguments: [fieldElement .displayName],
231233 );
232234 }
233235 }
@@ -241,10 +243,9 @@ class _Constructor {
241243 var formalParameters = node.parameters.parameters;
242244 for (var parameter in formalParameters) {
243245 parameter = parameter.notDefault;
244- if (parameter is FieldFormalParameter ) {
245- var fieldElement =
246- (parameter.declaredElement as FieldFormalParameterElementImpl )
247- .field;
246+ if (parameter is FieldFormalParameterImpl ) {
247+ var parameterFragment = parameter.declaredFragment! ;
248+ var fieldElement = parameterFragment.element.field2;
248249 if (fieldElement == null ) {
249250 continue ;
250251 }
@@ -268,6 +269,14 @@ class _Constructor {
268269 }
269270}
270271
272+ /// The field with a non `null` name.
273+ class _Field {
274+ final FieldElement2 element;
275+ final String name;
276+
277+ _Field (this .element, this .name);
278+ }
279+
271280/// The four states of a field initialization state through a constructor
272281/// signature, not initialized, initialized in the field declaration,
273282/// initialized in the field formal, and finally, initialized in the
@@ -290,36 +299,32 @@ enum _InitState {
290299
291300class _Interface {
292301 final TypeSystemImpl typeSystem;
293- final AugmentedInstanceElement augmented ;
302+ final InterfaceElement2 element ;
294303
295304 /// [_InitState.notInit] or [_InitState.initInDeclaration] for each field
296- /// in [augmented ] . This map works as the initial state for
305+ /// in [element ] . This map works as the initial state for
297306 /// [_Constructor] .
298- final Map <FieldElement , _InitState > fields;
307+ final Map <FieldElement2 , _InitState > fields;
299308
300- final Map <ConstructorElementImpl , _Constructor > constructors = Map .identity ();
309+ final Map <ConstructorElement2 , _Constructor > constructors = Map .identity ();
301310
302311 _Interface ({
303312 required this .typeSystem,
304- required this .augmented ,
313+ required this .element ,
305314 required this .fields,
306315 });
307316
308- _Constructor ? forConstructor ({
317+ _Constructor forConstructor ({
309318 required ErrorReporter errorReporter,
310319 required ConstructorDeclaration node,
311- required ConstructorElementImpl element ,
320+ required ConstructorFragment fragment ,
312321 }) {
313- var declaration = element.augmentedDeclaration;
314- if (declaration == null ) {
315- return null ;
316- }
317-
318- return constructors[declaration] ?? = _Constructor (
322+ var element = fragment.element;
323+ return constructors[element] ?? = _Constructor (
319324 typeSystem: typeSystem,
320325 errorReporter: errorReporter,
321326 node: node,
322- element: declaration ,
327+ element: element ,
323328 fields: {...fields},
324329 );
325330 }
0 commit comments