De-duplicate Posix path access implementation.

Change-Id: Ie97dd395c3f760881b38a9045be167b9d21eff0d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/335905
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 41f0e19..ff51a37 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -17,10 +17,10 @@
 import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/utilities/extensions/file_system.dart';
 import 'package:analyzer/src/utilities/legacy.dart';
 import 'package:linter/src/rules.dart';
 import 'package:meta/meta.dart';
-import 'package:path/path.dart';
 import 'package:test/test.dart';
 
 import 'src/utilities/mock_packages.dart';
@@ -333,26 +333,13 @@
     verifyCreatedCollection();
   }
 
-  /// If the path style is `Windows`, returns the corresponding Posix path.
-  /// Otherwise the path is already a Posix path, and it is returned as is.
-  /// TODO(scheglov) This is duplicate.
-  String _posixPath(File file) {
-    final pathContext = resourceProvider.pathContext;
-    if (pathContext.style == Style.windows) {
-      final components = pathContext.split(file.path);
-      return '/${components.skip(1).join('/')}';
-    } else {
-      return file.path;
-    }
-  }
-
   void _writeSourceChangeToBuffer({
     required StringBuffer buffer,
     required SourceChange sourceChange,
   }) {
     for (final fileEdit in sourceChange.edits) {
       final file = getFile(fileEdit.file);
-      buffer.writeln('>>>>>>>>>> ${_posixPath(file)}');
+      buffer.writeln('>>>>>>>>>> ${file.posixPath}');
       final current = file.readAsStringSync();
       final updated = SourceEdit.applySequence(current, fileEdit.edits);
       buffer.write(updated);
diff --git a/pkg/analysis_server/test/services/refactoring/agnostic/change_method_signature_test.dart b/pkg/analysis_server/test/services/refactoring/agnostic/change_method_signature_test.dart
index 75fecb9..5c0114f 100644
--- a/pkg/analysis_server/test/services/refactoring/agnostic/change_method_signature_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/agnostic/change_method_signature_test.dart
@@ -18,9 +18,9 @@
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/test_utilities/test_code_format.dart';
+import 'package:analyzer/src/utilities/extensions/file_system.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:collection/collection.dart';
-import 'package:path/path.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -3285,19 +3285,6 @@
     _assertTextExpectation(buffer.toString(), expected);
   }
 
-  /// If the path style is `Windows`, returns the corresponding Posix path.
-  /// Otherwise the path is already a Posix path, and it is returned as is.
-  /// TODO(scheglov) This is duplicate.
-  String _posixPath(File file) {
-    final pathContext = resourceProvider.pathContext;
-    if (pathContext.style == Style.windows) {
-      final components = pathContext.split(file.path);
-      return '/${components.skip(1).join('/')}';
-    } else {
-      return file.path;
-    }
-  }
-
   void _writeSourceChangeToBuffer({
     required StringBuffer buffer,
     required SourceChange sourceChange,
@@ -3305,7 +3292,7 @@
     final fileEdits = sourceChange.edits.sortedBy((e) => e.file);
     for (final fileEdit in fileEdits) {
       final file = getFile(fileEdit.file);
-      buffer.writeln('>>>>>>> ${_posixPath(file)}');
+      buffer.writeln('>>>>>>> ${file.posixPath}');
       final current = file.readAsStringSync();
       final updated = SourceEdit.applySequence(current, fileEdit.edits);
       buffer.write(updated);
diff --git a/pkg/analyzer/lib/src/utilities/extensions/file_system.dart b/pkg/analyzer/lib/src/utilities/extensions/file_system.dart
index 154ac72..f63b41c 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/file_system.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/file_system.dart
@@ -31,16 +31,16 @@
   }
 }
 
-extension ResourceProviderExtension on ResourceProvider {
+extension ResourceExtension on Resource {
   /// If the path style is `Windows`, returns the corresponding Posix path.
   /// Otherwise the path is already a Posix path, and it is returned as is.
-  /// TODO(scheglov) This is duplicate.
-  String posixPath(File file) {
+  String get posixPath {
+    final pathContext = provider.pathContext;
     if (pathContext.style == Style.windows) {
-      final components = pathContext.split(file.path);
+      final components = pathContext.split(path);
       return '/${components.skip(1).join('/')}';
     } else {
-      return file.path;
+      return path;
     }
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/analyzer_state_printer.dart b/pkg/analyzer/test/src/dart/analysis/analyzer_state_printer.dart
index a66b08c..9636426 100644
--- a/pkg/analyzer/test/src/dart/analysis/analyzer_state_printer.dart
+++ b/pkg/analyzer/test/src/dart/analysis/analyzer_state_printer.dart
@@ -10,8 +10,8 @@
 import 'package:analyzer/src/dart/analysis/library_graph.dart';
 import 'package:analyzer/src/dart/analysis/unlinked_unit_store.dart';
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
+import 'package:analyzer/src/utilities/extensions/file_system.dart';
 import 'package:collection/collection.dart';
-import 'package:path/path.dart';
 import 'package:test/test.dart';
 
 class AnalyzerStatePrinter {
@@ -59,18 +59,6 @@
     _writeByteStore();
   }
 
-  /// If the path style is `Windows`, returns the corresponding Posix path.
-  /// Otherwise the path is already a Posix path, and it is returned as is.
-  String _posixPath(File file) {
-    final pathContext = resourceProvider.pathContext;
-    if (pathContext.style == Style.windows) {
-      final components = pathContext.split(file.path);
-      return '/${components.skip(1).join('/')}';
-    } else {
-      return file.path;
-    }
-  }
-
   String _stringOfLibraryCycle(LibraryCycle cycle) {
     if (configuration.omitSdkFiles) {
       final isSdkLibrary = cycle.libraries.any((library) {
@@ -390,7 +378,7 @@
           continue;
         }
         final file = fileData.file;
-        _writelnWithIndent(_posixPath(file));
+        _writelnWithIndent(file.posixPath);
         _withIndent(() {
           _writelnWithIndent('uri: ${fileData.uri}');
 
@@ -430,7 +418,7 @@
         }
         cyclesToPrint.add(
           _LibraryCycleToPrint(
-            entry.key.map((e) => _posixPath(e.file)).join(' '),
+            entry.key.map((e) => e.file.posixPath).join(' '),
             entry.value,
           ),
         );
@@ -440,7 +428,7 @@
       final loadedBundlesMap = Map.fromEntries(
         libraryContext.loadedBundles.map((cycle) {
           final pathListStr = cycle.libraries
-              .map((library) => _posixPath(library.file.resource))
+              .map((library) => library.file.resource.posixPath)
               .sorted()
               .join(' ');
           return MapEntry(pathListStr, cycle);
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 3f46b76..ec4f9c5 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -961,8 +961,7 @@
       expect(result.session, contextFor(testFile).currentSession);
 
       final file = result.file;
-      final posixPath = resourceProvider.posixPath(file);
-      sink.writelnWithIndent('path: $posixPath');
+      sink.writelnWithIndent('path: ${file.posixPath}');
 
       sink.writelnWithIndent('uri: ${result.uri}');