From de6f83a43588aa36519237a61c5fc2ce5768cef7 Mon Sep 17 00:00:00 2001 From: iimironchuk Date: Wed, 30 Apr 2025 15:46:13 +0300 Subject: [PATCH 1/7] lint is working for extensions --- CHANGELOG.md | 2 +- .../avoid_using_api_linter.dart | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fdab793..7dc83d0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## 0.4.0 - Added `allow_with_comments` parameter for `no_empty_block` lint. - +- Fixed an issue with `avoid_using_api` for extensions ## 0.3.0 - Added `exclude` parameter for the following lints: diff --git a/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart b/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart index 1b3f93c3..e11712d5 100644 --- a/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart +++ b/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart @@ -245,5 +245,30 @@ class AvoidUsingApiLinter { ); } }); + + context.registry.addMethodInvocation((node) { + final methodName = node.methodName.name; + if (methodName != identifier) { + return; + } + + final element = node.methodName.staticElement; + if (element == null || element.enclosingElement3 is! ExtensionElement) { + return; + } + + final extensionElement = element.enclosingElement3! as ExtensionElement; + + if (extensionElement.name != className) { + return; + } + + final sourcePath = extensionElement.librarySource.uri.toString(); + if (!_matchesSource(sourcePath, source)) { + return; + } + + reporter.atNode(node.methodName, entryCode); + }); } } From 2ad01062ae8c9a66c9f3263ad84b1abf13d13e37 Mon Sep 17 00:00:00 2001 From: iimironchuk Date: Wed, 30 Apr 2025 16:19:52 +0300 Subject: [PATCH 2/7] test case for avoid_using_api --- .../external_source/lib/external_source.dart | 4 ++++ .../analysis_options.yaml | 14 ++++++++++++++ .../identifier_extension_source_ban_test.dart | 8 ++++++++ .../pubspec.yaml | 17 +++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 lint_test/avoid_using_api/identifier_extension_source_ban/analysis_options.yaml create mode 100644 lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart create mode 100644 lint_test/avoid_using_api/identifier_extension_source_ban/pubspec.yaml diff --git a/lint_test/avoid_using_api/external_source/lib/external_source.dart b/lint_test/avoid_using_api/external_source/lib/external_source.dart index bd422108..5f7e4c12 100644 --- a/lint_test/avoid_using_api/external_source/lib/external_source.dart +++ b/lint_test/avoid_using_api/external_source/lib/external_source.dart @@ -22,3 +22,7 @@ const test2 = 'Hello World'; void test() {} int banned = 5; + +extension BannedExtension on int { + int banned() => this + 10; +} diff --git a/lint_test/avoid_using_api/identifier_extension_source_ban/analysis_options.yaml b/lint_test/avoid_using_api/identifier_extension_source_ban/analysis_options.yaml new file mode 100644 index 00000000..33d3d993 --- /dev/null +++ b/lint_test/avoid_using_api/identifier_extension_source_ban/analysis_options.yaml @@ -0,0 +1,14 @@ +analyzer: + plugins: + - ../../custom_lint + +custom_lint: + rules: + - avoid_using_api: + severity: warning + entries: + - class_name: BannedExtension + identifier: banned + source: package:external_source + reason: "Banned identifier from BannedExtension from package:external_source is not allowed" + diff --git a/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart b/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart new file mode 100644 index 00000000..1bd5f58e --- /dev/null +++ b/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart @@ -0,0 +1,8 @@ +import 'package:external_source/external_source.dart'; + +void extensionIdentifierBanTesting(){ + const int a = 10; + + // expect_lint: avoid_using_api + a.banned(); +} \ No newline at end of file diff --git a/lint_test/avoid_using_api/identifier_extension_source_ban/pubspec.yaml b/lint_test/avoid_using_api/identifier_extension_source_ban/pubspec.yaml new file mode 100644 index 00000000..012fa6ca --- /dev/null +++ b/lint_test/avoid_using_api/identifier_extension_source_ban/pubspec.yaml @@ -0,0 +1,17 @@ +name: identifier_extension_source_ban +description: A sample command-line application. +version: 1.0.0 +publish_to: none + +environment: + sdk: ^3.7.2 + +dependencies: + external_source: + path: ../external_source + +dev_dependencies: + lints: ^3.0.0 + test: ^1.21.0 + solid_lints: + path: ../../../ From 525c7c5dfb69d8d40eb90c021ad119fcaa475aed Mon Sep 17 00:00:00 2001 From: iimironchuk Date: Wed, 30 Apr 2025 17:50:05 +0300 Subject: [PATCH 3/7] avoid_using_api works with getters + cleared test case --- .../avoid_using_api_linter.dart | 18 ++++++++++++++++++ .../external_source/lib/external_source.dart | 2 ++ .../analysis_options.yaml | 4 ++++ .../identifier_extension_source_ban_test.dart | 3 +++ 4 files changed, 27 insertions(+) diff --git a/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart b/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart index e11712d5..738bc61f 100644 --- a/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart +++ b/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart @@ -270,5 +270,23 @@ class AvoidUsingApiLinter { reporter.atNode(node.methodName, entryCode); }); + + context.registry.addPrefixedIdentifier((node) { + final propertyName = node.identifier.name; + if (propertyName != identifier) return; + + final element = node.identifier.staticElement; + if (element == null || element.enclosingElement3 is! ExtensionElement) { + return; + } + + final extensionElement = element.enclosingElement3! as ExtensionElement; + if (extensionElement.name != className) return; + + final sourcePath = extensionElement.librarySource.uri.toString(); + if (!_matchesSource(sourcePath, source)) return; + + reporter.atNode(node.identifier, entryCode); + }); } } diff --git a/lint_test/avoid_using_api/external_source/lib/external_source.dart b/lint_test/avoid_using_api/external_source/lib/external_source.dart index 5f7e4c12..144c6bd1 100644 --- a/lint_test/avoid_using_api/external_source/lib/external_source.dart +++ b/lint_test/avoid_using_api/external_source/lib/external_source.dart @@ -25,4 +25,6 @@ int banned = 5; extension BannedExtension on int { int banned() => this + 10; + + int get bannedGetter => 10; } diff --git a/lint_test/avoid_using_api/identifier_extension_source_ban/analysis_options.yaml b/lint_test/avoid_using_api/identifier_extension_source_ban/analysis_options.yaml index 33d3d993..3a2b7c69 100644 --- a/lint_test/avoid_using_api/identifier_extension_source_ban/analysis_options.yaml +++ b/lint_test/avoid_using_api/identifier_extension_source_ban/analysis_options.yaml @@ -11,4 +11,8 @@ custom_lint: identifier: banned source: package:external_source reason: "Banned identifier from BannedExtension from package:external_source is not allowed" + - class_name: BannedExtension + identifier: bannedGetter + source: package:external_source + reason: "bannedGetter identifier from BannedExtension from package:external_source is not allowed" diff --git a/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart b/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart index 1bd5f58e..ecf70735 100644 --- a/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart +++ b/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart @@ -5,4 +5,7 @@ void extensionIdentifierBanTesting(){ // expect_lint: avoid_using_api a.banned(); + + // expect_lint: avoid_using_api + a.bannedGetter; } \ No newline at end of file From f359e7be9ecaa0d382bbdc10b08bebdfff373ad9 Mon Sep 17 00:00:00 2001 From: Yurii Prykhodko <144313329+yurii-prykhodko-solid@users.noreply.github.com> Date: Wed, 30 Apr 2025 20:22:46 +0300 Subject: [PATCH 4/7] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dc83d0f..de92b189 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## 0.4.0 - Added `allow_with_comments` parameter for `no_empty_block` lint. -- Fixed an issue with `avoid_using_api` for extensions +- Added extension support for `avoid_using_api` ## 0.3.0 - Added `exclude` parameter for the following lints: From e1548ea2b85ec07a413dabf57b0ccc77af0e3fea Mon Sep 17 00:00:00 2001 From: Yurii Prykhodko <144313329+yurii-prykhodko-solid@users.noreply.github.com> Date: Wed, 30 Apr 2025 20:22:59 +0300 Subject: [PATCH 5/7] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index de92b189..1d3c3c3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - Added `allow_with_comments` parameter for `no_empty_block` lint. - Added extension support for `avoid_using_api` + ## 0.3.0 - Added `exclude` parameter for the following lints: From ac92672e885281842e92f5bb33210782c0762bb3 Mon Sep 17 00:00:00 2001 From: Yurii Prykhodko Date: Mon, 5 May 2025 09:58:50 +0300 Subject: [PATCH 6/7] simplify --- .../avoid_using_api_linter.dart | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart b/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart index 738bc61f..a89b8da0 100644 --- a/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart +++ b/lib/src/lints/avoid_using_api/avoid_using_api_linter.dart @@ -248,22 +248,15 @@ class AvoidUsingApiLinter { context.registry.addMethodInvocation((node) { final methodName = node.methodName.name; - if (methodName != identifier) { - return; - } + if (methodName != identifier) return; - final element = node.methodName.staticElement; - if (element == null || element.enclosingElement3 is! ExtensionElement) { + final enclosingElement = node.methodName.staticElement?.enclosingElement3; + if (enclosingElement is! ExtensionElement || + enclosingElement.name != className) { return; } - final extensionElement = element.enclosingElement3! as ExtensionElement; - - if (extensionElement.name != className) { - return; - } - - final sourcePath = extensionElement.librarySource.uri.toString(); + final sourcePath = enclosingElement.librarySource.uri.toString(); if (!_matchesSource(sourcePath, source)) { return; } @@ -275,15 +268,13 @@ class AvoidUsingApiLinter { final propertyName = node.identifier.name; if (propertyName != identifier) return; - final element = node.identifier.staticElement; - if (element == null || element.enclosingElement3 is! ExtensionElement) { + final enclosingElement = node.identifier.staticElement?.enclosingElement3; + if (enclosingElement is! ExtensionElement || + enclosingElement.name != className) { return; } - final extensionElement = element.enclosingElement3! as ExtensionElement; - if (extensionElement.name != className) return; - - final sourcePath = extensionElement.librarySource.uri.toString(); + final sourcePath = enclosingElement.librarySource.uri.toString(); if (!_matchesSource(sourcePath, source)) return; reporter.atNode(node.identifier, entryCode); From e5a3c32fe4f5ea6c816697275bc99127263aee36 Mon Sep 17 00:00:00 2001 From: Yurii Prykhodko Date: Mon, 5 May 2025 09:58:57 +0300 Subject: [PATCH 7/7] fmt --- .../lib/identifier_extension_source_ban_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart b/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart index ecf70735..a3c0a8d0 100644 --- a/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart +++ b/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart @@ -1,6 +1,6 @@ import 'package:external_source/external_source.dart'; -void extensionIdentifierBanTesting(){ +void extensionIdentifierBanTesting() { const int a = 10; // expect_lint: avoid_using_api @@ -8,4 +8,4 @@ void extensionIdentifierBanTesting(){ // expect_lint: avoid_using_api a.bannedGetter; -} \ No newline at end of file +}