👟👟👟 `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);
});
});