Issue 36212. Fix for updated part without library.

R=brianwilkerson@google.com

Bug: https://github.com/dart-lang/sdk/issues/36212
Change-Id: Ib0c43685c0b9f167591232d384a7fc5e426c07d5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97007
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 4ec0123..aaed6fe 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -624,6 +624,7 @@
 
     var isLibrary = file.isLibrary;
     var library = isLibrary ? file : file.library;
+    if (library == null) return;
 
     if (isLibrary) {
       file.refresh(containingContext);
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 2fe5b77..e82719f 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -348,6 +348,19 @@
     ]);
   }
 
+  test_added_part_withoutLibrary() async {
+    var b = convertPath('/home/test/lib/b.dart');
+
+    newFile(b, content: r'''
+part of 'a.dart';
+''');
+    tracker.changeFile(b);
+    await _doAllTrackerWork();
+
+    _assertHasNoLibrary('package:test/a.dart');
+    _assertHasNoLibrary('package:test/b.dart');
+  }
+
   test_chooseContext_inAnalysisRoot() async {
     var homePath = convertPath('/home');
     var testPath = convertPath('/home/test');
@@ -536,6 +549,30 @@
     _assertHasLibrary('package:test/b.dart');
   }
 
+  test_deleted_library_ofPart() async {
+    var a = convertPath('/home/test/lib/a.dart');
+    var b = convertPath('/home/test/lib/b.dart');
+
+    newFile(a, content: r'''
+part 'b.dart';
+''');
+    newFile(b, content: r'''
+part of 'a.dart';
+''');
+    tracker.addContext(testAnalysisContext);
+
+    await _doAllTrackerWork();
+    _assertHasLibrary('package:test/a.dart');
+    _assertHasNoLibrary('package:test/b.dart');
+
+    deleteFile(a);
+    tracker.changeFile(a);
+    await _doAllTrackerWork();
+
+    _assertHasNoLibrary('package:test/a.dart');
+    _assertHasNoLibrary('package:test/b.dart');
+  }
+
   test_deleted_part() async {
     var a = convertPath('/home/test/lib/a.dart');
     var b = convertPath('/home/test/lib/b.dart');
@@ -575,6 +612,19 @@
     ]);
   }
 
+  test_deleted_part_withoutLibrary() async {
+    var b = convertPath('/home/test/lib/b.dart');
+
+    newFile(b, content: r'''
+part of 'a.dart';
+''');
+    tracker.addContext(testAnalysisContext);
+
+    await _doAllTrackerWork();
+    _assertHasNoLibrary('package:test/a.dart');
+    _assertHasNoLibrary('package:test/b.dart');
+  }
+
   test_updated_exported() async {
     var a = convertPath('/home/test/lib/a.dart');
     var b = convertPath('/home/test/lib/b.dart');
@@ -713,6 +763,30 @@
       _ExpectedDeclaration.class_('C'),
     ]);
   }
+
+  test_updated_part_withoutLibrary() async {
+    var b = convertPath('/home/test/lib/b.dart');
+
+    newFile(b, content: r'''
+part of 'a.dart';
+class B {}
+''');
+    tracker.addContext(testAnalysisContext);
+
+    await _doAllTrackerWork();
+    _assertHasNoLibrary('package:test/a.dart');
+    _assertHasNoLibrary('package:test/b.dart');
+
+    newFile(b, content: r'''
+part of 'a.dart';
+class B2 {}
+''');
+    tracker.changeFile(b);
+
+    await _doAllTrackerWork();
+    _assertHasNoLibrary('package:test/a.dart');
+    _assertHasNoLibrary('package:test/b.dart');
+  }
 }
 
 @reflectiveTest