Skip to content

Commit 44371eb

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Migrate ConstructorFieldsVerifier.
Change-Id: I107ca230fefeca373c64a7ca30a0df3ee99724f5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/395342 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Phil Quitslund <[email protected]>
1 parent a1516ef commit 44371eb

File tree

4 files changed

+74
-63
lines changed

4 files changed

+74
-63
lines changed

pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,8 @@ class _ElementReferenceCollector extends RecursiveAstVisitor<void> {
252252
@override
253253
void visitFieldFormalParameter(FieldFormalParameter node) {
254254
var declaredElement = node.declaredFragment!.element;
255-
if (declaredElement is FieldFormalParameterElement2) {
256-
if (declaredElement.field2 == element) {
257-
references.add(node);
258-
}
255+
if (declaredElement.field2 == element) {
256+
references.add(node);
259257
}
260258

261259
super.visitFieldFormalParameter(node);

pkg/analyzer/analyzer_use_new_elements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ lib/src/diagnostic/diagnostic_factory.dart
101101
lib/src/error/assignment_verifier.dart
102102
lib/src/error/base_or_final_type_verifier.dart
103103
lib/src/error/best_practices_verifier.dart
104-
lib/src/error/constructor_fields_verifier.dart
105104
lib/src/error/correct_override.dart
106105
lib/src/error/dead_code_verifier.dart
107106
lib/src/error/deprecated_member_use_verifier.dart

pkg/analyzer/lib/src/dart/ast/ast.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6981,6 +6981,10 @@ final class FieldDeclarationImpl extends ClassMemberImpl
69816981
/// [TypeAnnotation])?
69826982
/// 'this' '.' name ([TypeParameterList]? [FormalParameterList])?
69836983
abstract final class FieldFormalParameter implements NormalFormalParameter {
6984+
@experimental
6985+
@override
6986+
FieldFormalParameterFragment? get declaredFragment;
6987+
69846988
/// The token representing either the `final`, `const` or `var` keyword, or
69856989
/// `null` if no keyword was used.
69866990
Token? get keyword;
@@ -7075,6 +7079,11 @@ final class FieldFormalParameterImpl extends NormalFormalParameterImpl
70757079
_becomeParentOf(_parameters);
70767080
}
70777081

7082+
@override
7083+
FieldFormalParameterElementImpl? get declaredFragment {
7084+
return super.declaredFragment as FieldFormalParameterElementImpl?;
7085+
}
7086+
70787087
@override
70797088
Token get endToken {
70807089
return question ?? _parameters?.endToken ?? name;

pkg/analyzer/lib/src/error/constructor_fields_verifier.dart

Lines changed: 63 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,28 @@
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';
66
import 'package:analyzer/error/listener.dart';
77
import 'package:analyzer/src/dart/ast/ast.dart';
88
import 'package:analyzer/src/dart/ast/extensions.dart';
9-
import 'package:analyzer/src/dart/element/element.dart';
109
import 'package:analyzer/src/dart/element/type_system.dart';
1110
import 'package:analyzer/src/error/codes.dart';
1211

1312
/// Verifier for initializing fields in constructors.
1413
class 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

291300
class _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

Comments
 (0)