Add test parts, fix for indexing enums.

R=brianwilkerson@google.com

Change-Id: Ie952e8f7a2ad62c6f17425ed78d07b17cde96e77
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97687
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index 03d7ad0..13197b8 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -125,6 +125,11 @@
       return _constructor(class_, reference);
     }
 
+    if (parentName == '@enum') {
+      var unit = elementOfReference(parent2);
+      return _enum(unit, reference);
+    }
+
     if (parentName == '@function') {
       CompilationUnitElementImpl enclosing = elementOfReference(parent2);
       return _function(enclosing, reference);
@@ -255,6 +260,18 @@
     return reference.element = libraryElement;
   }
 
+  EnumElementImpl _enum(CompilationUnitElementImpl unit, Reference reference) {
+    if (reference.node == null) {
+      _indexUnitElementDeclarations(unit);
+      assert(reference.node != 0, '$reference');
+    }
+    return reference.element = EnumElementImpl.forLinkedNode(
+      unit,
+      reference,
+      reference.node,
+    );
+  }
+
   Element _function(CompilationUnitElementImpl enclosing, Reference reference) {
     enclosing.functions;
     assert(reference.element != null);
@@ -308,7 +325,7 @@
     LinkedNode unitNode,
   ) {
     var classRef = unitRef.getChild('@class');
-    var enumRef = unitRef.getChild('@class');
+    var enumRef = unitRef.getChild('@enum');
     var functionRef = unitRef.getChild('@function');
     var typeAliasRef = unitRef.getChild('@typeAlias');
     var variableRef = unitRef.getChild('@variable');
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 021aff7..4a0555d 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -295,6 +295,8 @@
       _methodDeclaration(node);
     } else if (node.kind == LinkedNodeKind.partDirective) {
       _partDirective(node);
+    } else if (node.kind == LinkedNodeKind.partOfDirective) {
+      _partOfDirective(node);
     } else if (node.kind == LinkedNodeKind.simpleFormalParameter) {
       _simpleFormalParameter(node);
     } else if (node.kind == LinkedNodeKind.topLevelVariableDeclaration) {
@@ -326,6 +328,8 @@
 
   void _partDirective(LinkedNodeBuilder node) {}
 
+  void _partOfDirective(LinkedNodeBuilder node) {}
+
   void _simpleFormalParameter(LinkedNodeBuilder node) {
     var typeNode = node.simpleFormalParameter_type;
     if (typeNode != null) {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index 3133caf..4f5c73c 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -146,15 +146,15 @@
     var source = addTestSource(text);
     var unit = parseText(text, experimentStatus: experimentStatus);
 
-    // TODO(scheglov) add other libraries
     var libraryUnitMap = {
-      source: {source: unit},
+      source: _unitsOfLibrary(source, unit),
     };
 
     for (var otherLibrarySource in otherLibrarySources) {
       var text = getFile(otherLibrarySource.fullName).readAsStringSync();
       var unit = parseText(text, experimentStatus: experimentStatus);
-      libraryUnitMap[otherLibrarySource] = {otherLibrarySource: unit};
+      var unitMap = _unitsOfLibrary(otherLibrarySource, unit);
+      libraryUnitMap[otherLibrarySource] = unitMap;
     }
 
     var linkResult = link(
@@ -223,12 +223,6 @@
 
   @override
   @failingTest
-  test_closure_in_variable_declaration_in_part() async {
-    await super.test_closure_in_variable_declaration_in_part();
-  }
-
-  @override
-  @failingTest
   test_codeRange_class() async {
     await super.test_codeRange_class();
   }
@@ -448,12 +442,6 @@
 
   @override
   @failingTest
-  test_const_reference_type_imported() async {
-    await super.test_const_reference_type_imported();
-  }
-
-  @override
-  @failingTest
   test_const_reference_type_imported_withPrefix() async {
     await super.test_const_reference_type_imported_withPrefix();
   }
@@ -827,12 +815,6 @@
 
   @override
   @failingTest
-  test_function_entry_point_in_part() async {
-    await super.test_function_entry_point_in_part();
-  }
-
-  @override
-  @failingTest
   test_function_parameter_parameters() async {
     await super.test_function_parameter_parameters();
   }
@@ -1226,12 +1208,6 @@
 
   @override
   @failingTest
-  test_nameConflict_exportedAndParted() async {
-    await super.test_nameConflict_exportedAndParted();
-  }
-
-  @override
-  @failingTest
   test_nameConflict_importWithRelativeUri_exportWithAbsolute() async {
     // TODO(scheglov) unexpectedly passes on Windows
     fail('unexpectedly passes on Windows');
@@ -1270,18 +1246,6 @@
 
   @override
   @failingTest
-  test_parts() async {
-    await super.test_parts();
-  }
-
-  @override
-  @failingTest
-  test_parts_invalidUri() async {
-    await super.test_parts_invalidUri();
-  }
-
-  @override
-  @failingTest
   test_parts_invalidUri_nullStringValue() async {
     await super.test_parts_invalidUri_nullStringValue();
   }
@@ -1354,84 +1318,6 @@
 
   @override
   @failingTest
-  test_type_reference_lib_to_part() async {
-    await super.test_type_reference_lib_to_part();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_part_to_lib() async {
-    await super.test_type_reference_part_to_lib();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_part_to_other_part() async {
-    await super.test_type_reference_part_to_other_part();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_part_to_part() async {
-    await super.test_type_reference_part_to_part();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_to_import() async {
-    await super.test_type_reference_to_import();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_to_import_export() async {
-    await super.test_type_reference_to_import_export();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_to_import_export_export() async {
-    await super.test_type_reference_to_import_export_export();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_to_import_export_export_in_subdirs() async {
-    await super.test_type_reference_to_import_export_export_in_subdirs();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_to_import_export_in_subdirs() async {
-    await super.test_type_reference_to_import_export_in_subdirs();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_to_import_part() async {
-    await super.test_type_reference_to_import_part();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_to_import_part2() async {
-    await super.test_type_reference_to_import_part2();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_to_import_part_in_subdir() async {
-    await super.test_type_reference_to_import_part_in_subdir();
-  }
-
-  @override
-  @failingTest
-  test_type_reference_to_import_relative() async {
-    await super.test_type_reference_to_import_relative();
-  }
-
-  @override
-  @failingTest
   test_type_unresolved_prefixed() async {
     await super.test_type_unresolved_prefixed();
   }
@@ -1537,30 +1423,6 @@
 
   @override
   @failingTest
-  test_unresolved_part() async {
-    await super.test_unresolved_part();
-  }
-
-  @override
-  @failingTest
-  test_variable_getterInLib_setterInPart() async {
-    await super.test_variable_getterInLib_setterInPart();
-  }
-
-  @override
-  @failingTest
-  test_variable_getterInPart_setterInLib() async {
-    await super.test_variable_getterInPart_setterInLib();
-  }
-
-  @override
-  @failingTest
-  test_variable_getterInPart_setterInPart() async {
-    await super.test_variable_getterInPart_setterInPart();
-  }
-
-  @override
-  @failingTest
   test_variable_propagatedType_final_dep_inLib() async {
     await super.test_variable_propagatedType_final_dep_inLib();
   }
@@ -1571,12 +1433,6 @@
     await super.test_variable_propagatedType_final_dep_inPart();
   }
 
-  @override
-  @failingTest
-  test_variable_setterInPart_getterInPart() async {
-    await super.test_variable_setterInPart_getterInPart();
-  }
-
   LinkResult _link(Map<Source, String> codeMap) {
     // TODO(scheglov) support for parts
     var libraryUnitMap = <Source, Map<Source, CompilationUnit>>{};
@@ -1593,6 +1449,35 @@
       libraryUnitMap,
     );
   }
+
+  Map<Source, CompilationUnit> _unitsOfLibrary(
+      Source definingSource, CompilationUnit definingUnit) {
+    var result = <Source, CompilationUnit>{
+      definingSource: definingUnit,
+    };
+    for (var directive in definingUnit.directives) {
+      if (directive is PartDirective) {
+        var relativeUriStr = directive.uri.stringValue;
+
+        var partSource = sourceFactory.resolveUri(
+          definingSource,
+          relativeUriStr,
+        );
+
+        String text;
+        try {
+          var partFile = resourceProvider.getFile(partSource.fullName);
+          text = partFile.readAsStringSync();
+        } catch (_) {
+          text = '';
+        }
+
+        var partUnit = parseText(text, experimentStatus: experimentStatus);
+        result[partSource] = partUnit;
+      }
+    }
+    return result;
+  }
 }
 
 class _FakeAnalysisContext implements AnalysisContext {