CQ. Fix NPE in DartUnitOccurrencesComputerVisitor when unresolved import prefix.

Saw a crash in logs:

  Null check operator used on a null value

  package:analysis_server/src/domains/analysis/occurrences_dart.dart 253:32  DartUnitOccurrencesComputerVisitor.visitImportPrefixReference
  package:analyzer/src/dart/ast/ast.dart 13353:15                            ImportPrefixReferenceImpl.accept
  package:analyzer/src/dart/ast/ast.dart 16897:19                            NamedTypeImpl.visitChildren
  package:analyzer/dart/ast/visitor.g.dart 474:10                            GeneralizingAstVisitor.visitNode
  package:analyzer/dart/ast/visitor.g.dart 687:50                            GeneralizingAstVisitor.visitTypeAnnotation
  package:analyzer/dart/ast/visitor.g.dart 456:40                            GeneralizingAstVisitor.visitNamedType
  package:analysis_server/src/domains/analysis/occurrences_dart.dart 282:11  DartUnitOccurrencesComputerVisitor.visitNamedType
Change-Id: I2b06026dad093187c74b4e1b6c7371aaf648a480
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/456121
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov
2025-10-20 16:32:15 -07:00
committed by Commit Queue
parent f8e61ad148
commit ad73b67f0d
2 changed files with 12 additions and 1 deletions
@@ -250,7 +250,9 @@ class DartUnitOccurrencesComputerVisitor extends GeneralizingAstVisitor<void> {
@override
void visitImportPrefixReference(ImportPrefixReference node) {
_addOccurrence(node.element!, node.name);
if (node.element case var element?) {
_addOccurrence(element, node.name);
}
super.visitImportPrefixReference(node);
}
@@ -646,6 +646,15 @@ void foo() {}
''');
}
Future<void> test_prefix_null() async {
// Note, we use `core` just to have some prefix.
// The actual check is no crash on unresolved `prefix`.
await assertOccurrences(kind: ElementKind.PREFIX, '''
import 'dart:core' as /*[0*/core/*0]*/;
void f(prefix.A? _, /*[1*/core.int/*1]*/ _) {}
''');
}
Future<void> test_prefix_wildcard() async {
// Ensure no crash.
await assertOccurrences(kind: ElementKind.PREFIX, '''