diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a7da871..5b23040c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.4.0 - Added `allow_with_comments` parameter for `no_empty_block` lint. +- Added extension support for `avoid_using_api` - Added `exclude_entity` parameter for `prefer_match_file_name` lint. It is now possible to configure this lint to ignore `enum`, `extension` and `mixin` declarations via `analysis_options.yaml`. 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..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 @@ -245,5 +245,39 @@ class AvoidUsingApiLinter { ); } }); + + context.registry.addMethodInvocation((node) { + final methodName = node.methodName.name; + if (methodName != identifier) return; + + final enclosingElement = node.methodName.staticElement?.enclosingElement3; + if (enclosingElement is! ExtensionElement || + enclosingElement.name != className) { + return; + } + + final sourcePath = enclosingElement.librarySource.uri.toString(); + if (!_matchesSource(sourcePath, source)) { + return; + } + + reporter.atNode(node.methodName, entryCode); + }); + + context.registry.addPrefixedIdentifier((node) { + final propertyName = node.identifier.name; + if (propertyName != identifier) return; + + final enclosingElement = node.identifier.staticElement?.enclosingElement3; + if (enclosingElement is! ExtensionElement || + enclosingElement.name != className) { + return; + } + + final sourcePath = enclosingElement.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 bd422108..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 @@ -22,3 +22,9 @@ const test2 = 'Hello World'; void test() {} 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 new file mode 100644 index 00000000..3a2b7c69 --- /dev/null +++ b/lint_test/avoid_using_api/identifier_extension_source_ban/analysis_options.yaml @@ -0,0 +1,18 @@ +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" + - 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 new file mode 100644 index 00000000..a3c0a8d0 --- /dev/null +++ b/lint_test/avoid_using_api/identifier_extension_source_ban/lib/identifier_extension_source_ban_test.dart @@ -0,0 +1,11 @@ +import 'package:external_source/external_source.dart'; + +void extensionIdentifierBanTesting() { + const int a = 10; + + // expect_lint: avoid_using_api + a.banned(); + + // expect_lint: avoid_using_api + a.bannedGetter; +} 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: ../../../