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>{};