From ad73b67f0de9ca24d04010f2bc89613ec38c9477 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Mon, 20 Oct 2025 16:32:15 -0700 Subject: [PATCH] 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 Reviewed-by: Brian Wilkerson Commit-Queue: Konstantin Shcheglov --- .../lib/src/domains/analysis/occurrences_dart.dart | 4 +++- .../test/analysis/notification_occurrences_test.dart | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart index 99d83c7a7fd..0e47149ac96 100644 --- a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart +++ b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart @@ -250,7 +250,9 @@ class DartUnitOccurrencesComputerVisitor extends GeneralizingAstVisitor { @override void visitImportPrefixReference(ImportPrefixReference node) { - _addOccurrence(node.element!, node.name); + if (node.element case var element?) { + _addOccurrence(element, node.name); + } super.visitImportPrefixReference(node); } diff --git a/pkg/analysis_server/test/analysis/notification_occurrences_test.dart b/pkg/analysis_server/test/analysis/notification_occurrences_test.dart index 43d834741a0..4652d6b5a64 100644 --- a/pkg/analysis_server/test/analysis/notification_occurrences_test.dart +++ b/pkg/analysis_server/test/analysis/notification_occurrences_test.dart @@ -646,6 +646,15 @@ void foo() {} '''); } + Future 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 test_prefix_wildcard() async { // Ensure no crash. await assertOccurrences(kind: ElementKind.PREFIX, '''