Deprecate LibraryElement.parts

Change-Id: Iade5a3c2e60901de6b10b690d95a605d96eab2c0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/250788
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 17a94f3..c84f8ed 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## 4.3.0-dev
 * Deprecated `Directive.keyword`, use corresponding `xyzToken` in specific directives.
+* Deprecated `LibraryElement.parts`, use `parts2` instead.
 
 ## 4.2.0
 * Update SDK constraints to `>=2.17.0 <3.0.0`.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 74d7622..6f64355 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1393,6 +1393,7 @@
   /// Return a list containing all of the compilation units that are included in
   /// this library using a `part` directive. This does not include the defining
   /// compilation unit that contains the `part` directives.
+  @Deprecated('Use parts2 instead')
   List<CompilationUnitElement> get parts;
 
   /// Returns the list of `part` directives of this library.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index f1f04d8..41d1897 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3929,6 +3929,7 @@
   @override
   String get name => super.name!;
 
+  @Deprecated('Use parts2 instead')
   @override
   List<CompilationUnitElement> get parts {
     return _parts2
@@ -3991,10 +3992,10 @@
 
   @override
   List<CompilationUnitElement> get units {
-    List<CompilationUnitElement> units = <CompilationUnitElement>[];
-    units.add(_definingCompilationUnit);
-    units.addAll(parts);
-    return units;
+    return [
+      _definingCompilationUnit,
+      ...parts2.whereType<PartElementWithPart>().map((e) => e.includedUnit),
+    ];
   }
 
   @override
@@ -4011,12 +4012,8 @@
   }
 
   ClassElement? getEnum(String name) {
-    var element = _definingCompilationUnit.getEnum(name);
-    if (element != null) {
-      return element;
-    }
-    for (CompilationUnitElement part in parts) {
-      element = part.getEnum(name);
+    for (final unitElement in units) {
+      final element = unitElement.getEnum(name);
       if (element != null) {
         return element;
       }
@@ -4031,8 +4028,14 @@
   }
 
   @override
-  ClassElement? getType(String className) {
-    return getTypeFromParts(className, _definingCompilationUnit, parts);
+  ClassElement? getType(String name) {
+    for (final unitElement in units) {
+      final element = unitElement.getType(name);
+      if (element != null) {
+        return element;
+      }
+    }
+    return null;
   }
 
   /// Indicates whether it is unnecessary to report an undefined identifier
@@ -4110,7 +4113,7 @@
   @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
-    safelyVisitChildren(parts, visitor);
+    safelyVisitChildren(parts2, visitor);
   }
 
   static List<PrefixElement> buildPrefixesFromImports(
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index 9a76055..84552fb 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -180,9 +180,8 @@
   /// [library].
   Namespace createPublicNamespaceForLibrary(LibraryElement library) {
     Map<String, Element> definedNames = HashMap<String, Element>();
-    _addPublicNames(definedNames, library.definingCompilationUnit);
-    for (CompilationUnitElement compilationUnit in library.parts) {
-      _addPublicNames(definedNames, compilationUnit);
+    for (final unitElement in library.units) {
+      _addPublicNames(definedNames, unitElement);
     }
 
     // For libraries that import `dart:core` with a prefix, we have to add
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index 14775ba..55cd57b4 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -327,11 +327,11 @@
     CompilationUnitElement element = node.declaredElement!;
     if (element != _currentLibrary.definingCompilationUnit) {
       addWithoutChecking(_currentLibrary.definingCompilationUnit);
-      for (CompilationUnitElement part in _currentLibrary.parts) {
-        if (element == part) {
+      for (final unitElement in _currentLibrary.units) {
+        if (element == unitElement) {
           break;
         }
-        addWithoutChecking(part);
+        addWithoutChecking(unitElement);
       }
     }
     for (CompilationUnitMember member in node.declarations) {
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 0c572a2..29ff647 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -216,19 +216,22 @@
   }
 
   CompilationUnitElement part(String targetUri) {
-    CompilationUnitElement? partElement;
+    CompilationUnitElement? result;
 
-    for (var part in libraryElement.parts) {
-      if (part.uri == targetUri) {
-        if (partElement != null) {
-          throw StateError('Not unique: $targetUri');
+    for (final part in libraryElement.parts2) {
+      if (part is PartElementWithPart) {
+        final unitElement = part.includedUnit;
+        if ('${unitElement.source.uri}' == targetUri) {
+          if (result != null) {
+            throw StateError('Not unique: $targetUri');
+          }
+          result = unitElement;
         }
-        partElement = part;
       }
     }
 
-    if (partElement != null) {
-      return partElement;
+    if (result != null) {
+      return result;
     }
     throw StateError('Not found: $targetUri');
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 405cd7b..9714635 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -1292,8 +1292,10 @@
 part 'unitB.dart';
 ''');
     LibraryElement element = result.libraryElement;
-    CompilationUnitElement unitElementA = element.parts[0];
-    CompilationUnitElement unitElementB = element.parts[1];
+    CompilationUnitElement unitElementA =
+        (element.parts2[0] as PartElementWithPart).includedUnit;
+    CompilationUnitElement unitElementB =
+        (element.parts2[1] as PartElementWithPart).includedUnit;
     var expected = [
       ExpectedResult(unitElementA, SearchResultKind.REFERENCE,
           codeA.indexOf('lib; // A'), 'lib'.length),
@@ -1328,8 +1330,10 @@
 part 'unitB.dart';
 ''');
     LibraryElement element = result.libraryElement;
-    CompilationUnitElement unitElementA = element.parts[0];
-    CompilationUnitElement unitElementB = element.parts[1];
+    CompilationUnitElement unitElementA =
+        (element.parts2[0] as PartElementWithPart).includedUnit;
+    CompilationUnitElement unitElementB =
+        (element.parts2[1] as PartElementWithPart).includedUnit;
     var expected = [
       ExpectedResult(unitElementA, SearchResultKind.REFERENCE,
           codeA.indexOf('lib; // A'), 'lib'.length),
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index aeabc2c..b49c61b 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -29856,7 +29856,7 @@
 
     // The difference with the test above is that we ask the part first.
     // There was a bug that we were not loading library directives.
-    expect(library.parts[0].metadata, isEmpty);
+    expect(library.parts2[0].metadata, isEmpty);
   }
 
   test_metadata_prefixed_variable() async {
diff --git a/pkg/analyzer/test/src/summary/macro_test.dart b/pkg/analyzer/test/src/summary/macro_test.dart
index 0f417e7..2a23acf 100644
--- a/pkg/analyzer/test/src/summary/macro_test.dart
+++ b/pkg/analyzer/test/src/summary/macro_test.dart
@@ -1806,7 +1806,8 @@
     }
 
     if (expected != null) {
-      final x = library.parts.single.topLevelVariables.single;
+      final partElement = library.parts2.single as PartElementWithPart;
+      final x = partElement.includedUnit.topLevelVariables.single;
       expect(x.name, 'x');
       x as ConstTopLevelVariableElementImpl;
       final actual = (x.constantInitializer as SimpleStringLiteral).value;
@@ -1868,7 +1869,8 @@
       library.definingCompilationUnit.getType('A'),
     );
 
-    var x = library.parts.single.topLevelVariables.single;
+    final partElement = library.parts2.single as PartElementWithPart;
+    final x = partElement.includedUnit.topLevelVariables.single;
     expect(x.name, 'x');
     x as ConstTopLevelVariableElementImpl;
     var x_literal = x.constantInitializer as SimpleStringLiteral;
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index fbcc7a7..06fe1f4 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -67,9 +67,8 @@
       return;
     }
     // Add compilation units.
-    addCompilationUnitSource(library.definingCompilationUnit, units);
-    for (var child in library.parts) {
-      addCompilationUnitSource(child, units);
+    for (final unitElement in library.units) {
+      addCompilationUnitSource(unitElement, units);
     }
     // Add referenced libraries.
     for (var child in library.importedLibraries) {