Skip to content

Commit 09d02b9

Browse files
pqCommit Queue
authored and
Commit Queue
committed
[element model] migrate use_late_for_private_fields_and_variables
Bug: #59548 Change-Id: Id6e4dc7e93d4da931e4ad4c3dc373651258b746c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/398947 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]> Auto-Submit: Phil Quitslund <[email protected]> Commit-Queue: Phil Quitslund <[email protected]>
1 parent 333ba4d commit 09d02b9

File tree

5 files changed

+27
-26
lines changed

5 files changed

+27
-26
lines changed

pkg/analyzer/lib/dart/element/element2.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ abstract class Element2 {
375375
/// If the receiver is already a non-[Member] element (or a synthetic element,
376376
/// such as a synthetic property accessor), this getter will return the
377377
/// receiver.
378-
Element2? get baseElement;
378+
Element2 get baseElement;
379379

380380
/// The children of this element.
381381
///

pkg/analyzer/test/src/summary/element_text.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ class _Element2Writer extends _AbstractElementWriter {
436436
// element, only an enclosing fragment).
437437
} else {
438438
if (expectedEnclosingElement is Member) {
439-
expectedEnclosingElement = expectedEnclosingElement.baseElement!;
439+
expectedEnclosingElement = expectedEnclosingElement.baseElement;
440440
}
441441
expect(element.enclosingElement2, expectedEnclosingElement);
442442
}
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
lib/src/extensions.dart
2-
lib/src/rules/use_late_for_private_fields_and_variables.dart

pkg/linter/lib/src/extensions.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ extension ElementExtension on Element {
341341

342342
extension ElementExtension2 on Element2? {
343343
Element2? get canonicalElement2 => switch (this) {
344-
PropertyAccessorElement2(:var variable3) => variable3,
344+
PropertyAccessorElement2(:var variable3?) => variable3,
345345
_ => this,
346346
};
347347

pkg/linter/lib/src/rules/use_late_for_private_fields_and_variables.dart

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import 'package:analyzer/dart/ast/ast.dart';
66
import 'package:analyzer/dart/ast/token.dart';
77
import 'package:analyzer/dart/ast/visitor.dart';
8-
import 'package:analyzer/dart/element/element.dart';
8+
import 'package:analyzer/dart/element/element2.dart';
99
import 'package:collection/collection.dart';
1010

1111
import '../analyzer.dart';
@@ -43,28 +43,30 @@ class UseLateForPrivateFieldsAndVariables extends LintRule {
4343
}
4444

4545
class _Visitor extends RecursiveAstVisitor<void> {
46-
final lateables = <CompilationUnitElement, List<VariableDeclaration>>{};
46+
final Map<LibraryFragment, List<VariableDeclaration>> lateables =
47+
<LibraryFragment, List<VariableDeclaration>>{};
4748

48-
final nullableAccess = <Element>{};
49+
final Set<Element2> nullableAccess = <Element2>{};
4950

5051
final LintRule rule;
5152
final LinterContext context;
5253

53-
/// The "current" [CompilationUnitElement], which is set by
54+
/// The "current" [LibraryFragment], which is set by
5455
/// [visitCompilationUnit].
55-
late CompilationUnitElement currentUnit;
56+
late LibraryFragment currentLibraryFragment;
5657

5758
_Visitor(this.rule, this.context);
5859

5960
void afterLibrary() {
6061
for (var contextUnit in context.allUnits) {
61-
var unit = contextUnit.unit.declaredElement;
62-
var variables = lateables[unit];
62+
var libraryFragment = contextUnit.unit.declaredFragment;
63+
var variables = lateables[libraryFragment];
6364
if (variables == null) continue;
6465
for (var variable in variables) {
65-
if (!nullableAccess.contains(variable.declaredElement)) {
66-
var contextUnit = context.allUnits
67-
.firstWhereOrNull((u) => u.unit.declaredElement == unit);
66+
var variableElement = variable.declaredFragment?.element;
67+
if (!nullableAccess.contains(variableElement)) {
68+
var contextUnit = context.allUnits.firstWhereOrNull(
69+
(u) => u.unit.declaredFragment == libraryFragment);
6870
if (contextUnit == null) continue;
6971
contextUnit.errorReporter.atNode(variable, rule.lintCode);
7072
}
@@ -74,7 +76,7 @@ class _Visitor extends RecursiveAstVisitor<void> {
7476

7577
@override
7678
void visitAssignmentExpression(AssignmentExpression node) {
77-
var element = node.writeElement?.canonicalElement;
79+
var element = node.writeElement2?.canonicalElement2;
7880
if (element != null) {
7981
var assignee = node.leftHandSide;
8082
var rhsType = node.rightHandSide.staticType;
@@ -85,7 +87,7 @@ class _Visitor extends RecursiveAstVisitor<void> {
8587
context.typeSystem.isNonNullable(rhsType)) {
8688
// This is OK; non-null access.
8789
} else {
88-
nullableAccess.add(element);
90+
nullableAccess.add(element.baseElement);
8991
}
9092
}
9193
super.visitAssignmentExpression(node);
@@ -105,9 +107,9 @@ class _Visitor extends RecursiveAstVisitor<void> {
105107

106108
@override
107109
void visitCompilationUnit(CompilationUnit node) {
108-
var declaredElement = node.declaredElement;
109-
if (declaredElement == null) return;
110-
currentUnit = declaredElement;
110+
var declaredFragment = node.declaredFragment;
111+
if (declaredFragment == null) return;
112+
currentLibraryFragment = declaredFragment;
111113

112114
super.visitCompilationUnit(node);
113115
}
@@ -141,21 +143,21 @@ class _Visitor extends RecursiveAstVisitor<void> {
141143

142144
@override
143145
void visitPrefixedIdentifier(PrefixedIdentifier node) {
144-
var element = node.staticElement?.canonicalElement;
146+
var element = node.element?.canonicalElement2;
145147
_visitIdentifierOrPropertyAccess(node, element);
146148
super.visitPrefixedIdentifier(node);
147149
}
148150

149151
@override
150152
void visitPropertyAccess(PropertyAccess node) {
151-
var element = node.propertyName.staticElement?.canonicalElement;
153+
var element = node.propertyName.element?.canonicalElement2;
152154
_visitIdentifierOrPropertyAccess(node, element);
153155
super.visitPropertyAccess(node);
154156
}
155157

156158
@override
157159
void visitSimpleIdentifier(SimpleIdentifier node) {
158-
var element = node.staticElement?.canonicalElement;
160+
var element = node.element?.canonicalElement2;
159161
_visitIdentifierOrPropertyAccess(node, element);
160162
super.visitSimpleIdentifier(node);
161163
}
@@ -173,18 +175,18 @@ class _Visitor extends RecursiveAstVisitor<void> {
173175
void _visit(VariableDeclaration variable) {
174176
if (variable.isLate) return;
175177
if (variable.isSynthetic) return;
176-
var declaredElement = variable.declaredElement;
178+
var declaredElement = variable.declaredFragment?.element;
177179
if (declaredElement == null ||
178180
context.typeSystem.isNonNullable(declaredElement.type)) {
179181
return;
180182
}
181-
lateables.putIfAbsent(currentUnit, () => []).add(variable);
183+
lateables.putIfAbsent(currentLibraryFragment, () => []).add(variable);
182184
}
183185

184186
/// Checks whether [expression], which must be an [Identifier] or
185187
/// [PropertyAccess], and its [canonicalElement], represent a nullable access.
186188
void _visitIdentifierOrPropertyAccess(
187-
Expression expression, Element? canonicalElement) {
189+
Expression expression, Element2? canonicalElement) {
188190
assert(expression is Identifier || expression is PropertyAccess);
189191
if (canonicalElement == null) return;
190192

@@ -199,7 +201,7 @@ class _Visitor extends RecursiveAstVisitor<void> {
199201
parent.operator.type == TokenType.BANG) {
200202
// This is OK; non-null access.
201203
} else {
202-
nullableAccess.add(canonicalElement);
204+
nullableAccess.add(canonicalElement.baseElement);
203205
}
204206
}
205207
}

0 commit comments

Comments
 (0)