👟👟👟 `prefer_relative_imports`: stop parsing pubspecs (query ws package for self-references) (#1812)

* stop parsing pubspecs (query ws package for self-references)

* fix NoSuchMethodError

* uri test tweaks

* expectation fix

* + tests
diff --git a/lib/src/rules/prefer_relative_imports.dart b/lib/src/rules/prefer_relative_imports.dart
index 39edc44..3a23530 100644
--- a/lib/src/rules/prefer_relative_imports.dart
+++ b/lib/src/rules/prefer_relative_imports.dart
@@ -4,12 +4,10 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:yaml/yaml.dart';
+import 'package:path/path.dart' as path;
 
 import '../analyzer.dart';
 import '../ast.dart';
-import '../rules/implementation_imports.dart';
 
 const _desc = r'Prefer relative imports for files in `lib/`.';
 
@@ -34,22 +32,6 @@
 
 ''';
 
-YamlMap _parseYaml(String content) {
-  if (content == null) {
-    return YamlMap();
-  }
-  try {
-    YamlNode doc = loadYamlNode(content);
-    if (doc is YamlMap) {
-      return doc;
-    }
-    return YamlMap();
-    // ignore: avoid_catches_without_on_clauses
-  } catch (_) {
-    return YamlMap();
-  }
-}
-
 class PreferRelativeImports extends LintRule implements NodeLintRule {
   PreferRelativeImports()
       : super(
@@ -72,8 +54,6 @@
   final LinterContext context;
 
   bool isInLibFolder;
-  File pubspecFile;
-  YamlMap parsedPubspec;
 
   _Visitor(this.rule, this.context);
 
@@ -82,45 +62,23 @@
     if (!isInLibFolder) return false;
 
     // Is it a package: import?
-    String importUri = node?.uri?.stringValue;
-    if (importUri == null) return false;
+    final importUri = node.uriContent;
+    if (importUri?.startsWith('package:') != true) return false;
 
-    Uri uri;
-    try {
-      uri = Uri.parse(importUri);
-      if (!isPackage(uri)) return false;
-    } on FormatException catch (_) {
-      return false;
-    }
+    final source = node.uriSource;
+    if (source == null) return false;
 
-    // Is the package: import referencing the current package?
-    var segments = uri.pathSegments;
-    if (segments.isEmpty) return false;
-
-    if (parsedPubspec == null) {
-      String content;
-      try {
-        content = pubspecFile.readAsStringSync();
-        // ignore: avoid_catches_without_on_clauses
-      } catch (_) {}
-      parsedPubspec = _parseYaml(content);
-    }
-
-    return parsedPubspec['name'] == segments[0];
+    // todo (pq): context.package.contains(source) should work (but does not)
+    return path.isWithin(context.package.root, source.fullName);
   }
 
   @override
   void visitCompilationUnit(CompilationUnit node) {
     isInLibFolder = isInLibDir(node, context.package);
-
-    pubspecFile = locatePubspecFile(node);
-    parsedPubspec = null;
   }
 
   @override
   void visitImportDirective(ImportDirective node) {
-    if (pubspecFile == null) return;
-
     if (isPackageSelfReference(node)) {
       rule.reportLint(node.uri);
     }
diff --git a/test/_data/prefer_relative_imports/_packages b/test/_data/prefer_relative_imports/_packages
index 4565373..a484002 100644
--- a/test/_data/prefer_relative_imports/_packages
+++ b/test/_data/prefer_relative_imports/_packages
@@ -1 +1,2 @@
 sample_project:lib/
+p6:../p6/lib/
diff --git a/test/_data/prefer_relative_imports/bin/bin.dart b/test/_data/prefer_relative_imports/bin/bin.dart
new file mode 100644
index 0000000..d50bf50
--- /dev/null
+++ b/test/_data/prefer_relative_imports/bin/bin.dart
@@ -0,0 +1 @@
+import 'package:sample_project/dummy.dart'; // OK
diff --git a/test/_data/prefer_relative_imports/lib/main.dart b/test/_data/prefer_relative_imports/lib/main.dart
index 9c29077..6a80588 100644
--- a/test/_data/prefer_relative_imports/lib/main.dart
+++ b/test/_data/prefer_relative_imports/lib/main.dart
@@ -1,3 +1,5 @@
 import 'package:sample_project/dummy.dart'; //LINT
 
+import 'package:p6/p6_lib.dart'; //OK
+
 import 'dummy.dart'; //OK
diff --git a/test/integration_test.dart b/test/integration_test.dart
index 9166328..4be9022 100644
--- a/test/integration_test.dart
+++ b/test/integration_test.dart
@@ -686,8 +686,12 @@
           '--packages',
           'test/_data/prefer_relative_imports/_packages'
         ], LinterOptions());
-        expect(collectingOut.trim(),
-            contains('3 files analyzed, 1 issue found, in'));
+        expect(
+            collectingOut.trim(),
+            stringContainsInOrder([
+              'main.dart 1:8',
+              '4 files analyzed, 1 issue found, in',
+            ]));
         expect(exitCode, 1);
       });
     });