use workspace package to locate `lib/` (#1810)
* use workspace package to locate `lib/`
* tweak
* => path.isWithin
* feedbacks
diff --git a/lib/src/ast.dart b/lib/src/ast.dart
index d39b73d..7c5c5b1 100644
--- a/lib/src/ast.dart
+++ b/lib/src/ast.dart
@@ -10,8 +10,9 @@
import 'package:analyzer/error/error.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/error/codes.dart'; // ignore: implementation_imports
-import 'package:analyzer/src/generated/resolver.dart'; // ignore: implementation_imports
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
import 'package:path/path.dart' as path;
import 'analyzer.dart';
@@ -105,37 +106,6 @@
return false;
}
-/// Return true if the given node is declared in a compilation unit that is in
-/// a `lib/` folder.
-bool isDefinedInLib(CompilationUnit compilationUnit) {
- String fullName = compilationUnit?.declaredElement?.source?.fullName;
- if (fullName == null) {
- return false;
- }
-
- final resourceProvider =
- compilationUnit?.declaredElement?.session?.resourceProvider;
- if (resourceProvider == null) {
- return false;
- }
-
- File file = resourceProvider.getFile(fullName);
- Folder folder = file.parent;
-
- // Look for a pubspec.yaml file.
- while (folder != null) {
- if (folder.getChildAssumingFile('pubspec.yaml').exists) {
- // Determine if this file is a child of the lib/ folder.
- String relPath = file.path.substring(folder.path.length + 1);
- return path.split(relPath).first == 'lib';
- }
-
- folder = folder.parent;
- }
-
- return false;
-}
-
/// Returns `true` if this element is the `==` method declaration.
bool isEquals(ClassMember element) =>
element is MethodDeclaration && element.name?.name == '==';
@@ -151,6 +121,15 @@
(element is FieldDeclaration &&
getFieldIdentifier(element, 'hashCode') != null);
+/// Return true if this compilation unit [node] is declared within the given
+/// [package]'s `lib/` directory tree.
+bool isInLibDir(CompilationUnit node, WorkspacePackage package) {
+ final cuPath = node.declaredElement.library?.source?.fullName;
+ if (cuPath == null) return false;
+ final libDir = path.join(package.root, 'lib');
+ return path.isWithin(libDir, cuPath);
+}
+
/// Returns `true` if the keyword associated with the given [token] matches
/// [keyword].
bool isKeyword(Token token, Keyword keyword) =>
diff --git a/lib/src/rules/avoid_renaming_method_parameters.dart b/lib/src/rules/avoid_renaming_method_parameters.dart
index c2b9990..fc5adaf 100644
--- a/lib/src/rules/avoid_renaming_method_parameters.dart
+++ b/lib/src/rules/avoid_renaming_method_parameters.dart
@@ -55,18 +55,31 @@
@override
void registerNodeProcessors(
NodeLintRegistry registry, LinterContext context) {
- final visitor = _Visitor(this);
+ final visitor = _Visitor(this, context);
registry.addMethodDeclaration(this, visitor);
+ registry.addCompilationUnit(this, visitor);
}
}
class _Visitor extends SimpleAstVisitor<void> {
final LintRule rule;
+ final LinterContext context;
- _Visitor(this.rule);
+ /// Tracks if we are in a compilation unit within a `lib/` dir so we can
+ /// short-circuit needless checking of method declarations.
+ bool isInLib;
+
+ _Visitor(this.rule, this.context);
+
+ @override
+ void visitCompilationUnit(CompilationUnit node) {
+ isInLib = isInLibDir(node, context.package);
+ }
@override
void visitMethodDeclaration(MethodDeclaration node) {
+ if (!isInLib) return;
+
if (node.isStatic) return;
if (node.documentationComment != null) return;
@@ -80,7 +93,6 @@
final classElement = parentElement as ClassElement;
if (classElement.isPrivate) return;
- if (!isDefinedInLib(getCompilationUnit(node))) return;
final parentMethod = classElement.lookUpInheritedMethod(
node.name.name, classElement.library);
diff --git a/lib/src/rules/prefer_relative_imports.dart b/lib/src/rules/prefer_relative_imports.dart
index 2a11c18..39edc44 100644
--- a/lib/src/rules/prefer_relative_imports.dart
+++ b/lib/src/rules/prefer_relative_imports.dart
@@ -61,7 +61,7 @@
@override
void registerNodeProcessors(
NodeLintRegistry registry, LinterContext context) {
- final visitor = _Visitor(this);
+ final visitor = _Visitor(this, context);
registry.addCompilationUnit(this, visitor);
registry.addImportDirective(this, visitor);
}
@@ -69,12 +69,13 @@
class _Visitor extends SimpleAstVisitor<void> {
final PreferRelativeImports rule;
+ final LinterContext context;
bool isInLibFolder;
File pubspecFile;
YamlMap parsedPubspec;
- _Visitor(this.rule);
+ _Visitor(this.rule, this.context);
bool isPackageSelfReference(ImportDirective node) {
// Ignore this compilation unit if it's not in the lib/ folder.
@@ -110,7 +111,7 @@
@override
void visitCompilationUnit(CompilationUnit node) {
- isInLibFolder = isDefinedInLib(node);
+ isInLibFolder = isInLibDir(node, context.package);
pubspecFile = locatePubspecFile(node);
parsedPubspec = null;
diff --git a/lib/src/rules/public_member_api_docs.dart b/lib/src/rules/public_member_api_docs.dart
index e738148..e6bf7e7 100644
--- a/lib/src/rules/public_member_api_docs.dart
+++ b/lib/src/rules/public_member_api_docs.dart
@@ -203,7 +203,7 @@
@override
visitCompilationUnit(CompilationUnit node) {
// Ignore this compilation unit if it's not in the lib/ folder.
- isInLibFolder = isDefinedInLib(node);
+ isInLibFolder = isInLibDir(node, context.package);
if (!isInLibFolder) return;
Map<String, FunctionDeclaration> getters = <String, FunctionDeclaration>{};