From ea40baaf56993c792f4d766292a82d7b980d1dc5 Mon Sep 17 00:00:00 2001 From: iimironchuk Date: Mon, 28 Apr 2025 15:23:35 +0300 Subject: [PATCH 1/2] prefer_match_file_name ignore extensions --- .../visitors/prefer_match_file_name_visitor.dart | 5 +---- lint_test/prefer_match_file_name_ignore_extensions.dart | 5 +++++ 2 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 lint_test/prefer_match_file_name_ignore_extensions.dart diff --git a/lib/src/lints/prefer_match_file_name/visitors/prefer_match_file_name_visitor.dart b/lib/src/lints/prefer_match_file_name/visitors/prefer_match_file_name_visitor.dart index 3e6024b6..eaa79e33 100644 --- a/lib/src/lints/prefer_match_file_name/visitors/prefer_match_file_name_visitor.dart +++ b/lib/src/lints/prefer_match_file_name/visitors/prefer_match_file_name_visitor.dart @@ -27,10 +27,7 @@ class PreferMatchFileNameVisitor extends RecursiveAstVisitor { void visitExtensionDeclaration(ExtensionDeclaration node) { super.visitExtensionDeclaration(node); - final name = node.name; - if (name != null) { - _declarations.add((token: name, parent: node)); - } + return; } @override diff --git a/lint_test/prefer_match_file_name_ignore_extensions.dart b/lint_test/prefer_match_file_name_ignore_extensions.dart new file mode 100644 index 00000000..7b5f8f58 --- /dev/null +++ b/lint_test/prefer_match_file_name_ignore_extensions.dart @@ -0,0 +1,5 @@ +// ignore_for_file: unused_element, unused_field + +/// Check if the `prefer_match_file_name` rule ignored for extensions +// expect_lint: prefer_match_file_name +extension DefaultExtension on String {} \ No newline at end of file From 261d6618c88913ad89d8256e04f0a10fea0b281f Mon Sep 17 00:00:00 2001 From: iimironchuk Date: Mon, 28 Apr 2025 17:27:38 +0300 Subject: [PATCH 2/2] extension ignored by parameter --- lib/analysis_options.yaml | 3 ++- .../prefer_match_file_name_parameters.dart | 20 +++++++++++++++++++ .../prefer_match_file_name_rule.dart | 11 ++++++++-- .../prefer_match_file_name_visitor.dart | 15 +++++++++++++- 4 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 lib/src/lints/prefer_match_file_name/models/prefer_match_file_name_parameters.dart diff --git a/lib/analysis_options.yaml b/lib/analysis_options.yaml index 78d35b72..840ff1ba 100644 --- a/lib/analysis_options.yaml +++ b/lib/analysis_options.yaml @@ -93,7 +93,8 @@ custom_lint: - prefer_first - prefer_last - - prefer_match_file_name + - prefer_match_file_name: + ignore_extensions: true - proper_super_calls linter: diff --git a/lib/src/lints/prefer_match_file_name/models/prefer_match_file_name_parameters.dart b/lib/src/lints/prefer_match_file_name/models/prefer_match_file_name_parameters.dart new file mode 100644 index 00000000..5838d51a --- /dev/null +++ b/lib/src/lints/prefer_match_file_name/models/prefer_match_file_name_parameters.dart @@ -0,0 +1,20 @@ +/// A data model class that represents the "prefer factmatch file name" input +/// parameters +class PreferMatchFileNameParameters { + /// A variable that indicates whether to ignore extensions + final bool ignoreExtensions; + + static const bool _defaultIgnoreExtensionsValue = false; + + /// Constructor for [PreferMatchFileNameParameters] model + const PreferMatchFileNameParameters({ + required this.ignoreExtensions, + }); + + /// Method for creating from json data + factory PreferMatchFileNameParameters.fromJson(Map json) => + PreferMatchFileNameParameters( + ignoreExtensions: + json['ignore_extensions'] as bool? ?? _defaultIgnoreExtensionsValue, + ); +} diff --git a/lib/src/lints/prefer_match_file_name/prefer_match_file_name_rule.dart b/lib/src/lints/prefer_match_file_name/prefer_match_file_name_rule.dart index 26c52e90..806a8189 100644 --- a/lib/src/lints/prefer_match_file_name/prefer_match_file_name_rule.dart +++ b/lib/src/lints/prefer_match_file_name/prefer_match_file_name_rule.dart @@ -1,11 +1,14 @@ import 'package:analyzer/error/listener.dart'; import 'package:custom_lint_builder/custom_lint_builder.dart'; import 'package:path/path.dart' as p; +import 'package:solid_lints/src/lints/prefer_match_file_name/models/prefer_match_file_name_parameters.dart'; import 'package:solid_lints/src/lints/prefer_match_file_name/visitors/prefer_match_file_name_visitor.dart'; import 'package:solid_lints/src/models/rule_config.dart'; import 'package:solid_lints/src/models/solid_lint_rule.dart'; import 'package:solid_lints/src/utils/node_utils.dart'; +import '../number_of_parameters/models/number_of_parameters_parameters.dart'; + /// Warns about a mismatch between file name and first declared element inside. /// /// This improves navigation by matching file content and file name. @@ -48,7 +51,8 @@ import 'package:solid_lints/src/utils/node_utils.dart'; /// class SomethingPublic {} // OK /// ``` /// -class PreferMatchFileNameRule extends SolidLintRule { +class PreferMatchFileNameRule + extends SolidLintRule { /// This lint rule represents the error if iterable /// access can be simplified. static const String lintName = 'prefer_match_file_name'; @@ -62,6 +66,7 @@ class PreferMatchFileNameRule extends SolidLintRule { final config = RuleConfig( configs: configs, name: lintName, + paramsParser: PreferMatchFileNameParameters.fromJson, problemMessage: (value) => 'File name does not match with first declared element name.', ); @@ -76,7 +81,9 @@ class PreferMatchFileNameRule extends SolidLintRule { CustomLintContext context, ) { context.registry.addCompilationUnit((node) { - final visitor = PreferMatchFileNameVisitor(); + final isIgnored = config.parameters.ignoreExtensions; + + final visitor = PreferMatchFileNameVisitor(ignoreExtensions: isIgnored); node.accept(visitor); diff --git a/lib/src/lints/prefer_match_file_name/visitors/prefer_match_file_name_visitor.dart b/lib/src/lints/prefer_match_file_name/visitors/prefer_match_file_name_visitor.dart index eaa79e33..20acafc2 100644 --- a/lib/src/lints/prefer_match_file_name/visitors/prefer_match_file_name_visitor.dart +++ b/lib/src/lints/prefer_match_file_name/visitors/prefer_match_file_name_visitor.dart @@ -7,6 +7,14 @@ import 'package:solid_lints/src/lints/prefer_match_file_name/models/declaration_ class PreferMatchFileNameVisitor extends RecursiveAstVisitor { final _declarations = []; + /// Variable for making sure if extensions should be ignored + final bool ignoreExtensions; + + /// Constructor of [PreferMatchFileNameVisitor] class + PreferMatchFileNameVisitor({ + required this.ignoreExtensions, + }); + /// List of all declarations Iterable get declarations => _declarations ..sort( @@ -27,7 +35,12 @@ class PreferMatchFileNameVisitor extends RecursiveAstVisitor { void visitExtensionDeclaration(ExtensionDeclaration node) { super.visitExtensionDeclaration(node); - return; + if (!ignoreExtensions) { + final name = node.name; + if (name != null) { + _declarations.add((token: name, parent: node)); + } + } } @override