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 3e6024b6..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,9 +35,11 @@ class PreferMatchFileNameVisitor extends RecursiveAstVisitor { void visitExtensionDeclaration(ExtensionDeclaration node) { super.visitExtensionDeclaration(node); - final name = node.name; - if (name != null) { - _declarations.add((token: name, parent: node)); + if (!ignoreExtensions) { + final name = node.name; + if (name != null) { + _declarations.add((token: name, parent: node)); + } } } 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