Skip to content

Commit a660116

Browse files
scheglovCommit Queue
authored andcommitted
CQ. Fix NPE in OverrideVerifier, when missing name.
Saw a crash in logs: _TypeError: Null check operator used on a null value at OverrideVerifier._isOverride (override_verifier.dart:91) at OverrideVerifier.visitFieldDeclaration (override_verifier.dart:43) at FieldDeclarationImpl.accept (ast.dart:8995) at NodeListImpl.accept (ast.dart:17222) at ClassDeclarationImpl.visitChildren (ast.dart:3207) at RecursiveAstVisitor.visitClassDeclaration (visitor.g.dart:833) at OverrideVerifier.visitClassDeclaration (override_verifier.dart:26) Change-Id: Ia61c0659b299795b1054840377ed066373cfe1ab Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/456110 Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com>
1 parent 49f524d commit a660116

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,18 @@ class OverrideVerifier extends RecursiveAstVisitor<void> {
8787
/// Return `true` if the [member] overrides a member from a superinterface.
8888
bool _isOverride(ExecutableElement member) {
8989
var currentClass = _currentClass?.firstFragment;
90-
if (currentClass != null) {
91-
var name = Name.forElement(member)!;
92-
return currentClass.element.getOverridden(name) != null;
93-
} else {
90+
if (currentClass == null) {
9491
return false;
9592
}
93+
94+
var name = Name.forElement(member);
95+
96+
// We get `null` if the element does not have name.
97+
// This was already a parse error, avoid the warning.
98+
if (name == null) {
99+
return true;
100+
}
101+
102+
return currentClass.element.getOverridden(name) != null;
96103
}
97104
}

pkg/analyzer/test/src/diagnostics/override_on_non_overriding_method_test.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
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/src/dart/error/syntactic_errors.dart';
56
import 'package:analyzer/src/error/codes.dart';
67
import 'package:test_reflective_loader/test_reflective_loader.dart';
78

@@ -80,6 +81,22 @@ class B extends A {
8081
}''');
8182
}
8283

84+
test_class_field_missingName() async {
85+
await assertErrorsInCode(
86+
r'''
87+
class A {
88+
@override
89+
Object? foo,;
90+
}
91+
''',
92+
[
93+
error(WarningCode.unusedField, 6, 0),
94+
error(WarningCode.overrideOnNonOverridingField, 32, 3),
95+
error(ParserErrorCode.missingIdentifier, 36, 1),
96+
],
97+
);
98+
}
99+
83100
test_class_implements() async {
84101
await assertNoErrorsInCode(r'''
85102
class A {

0 commit comments

Comments
 (0)