From babf88e9b8e18ca50c69dd7a72164891afcdac16 Mon Sep 17 00:00:00 2001 From: xJac0b Date: Fri, 6 Jun 2025 14:58:36 +0200 Subject: [PATCH 1/5] feat: add new rule use_descriptive_names_for_type_parameters --- lib/solid_lints.dart | 2 + ...iptive_names_for_type_parameters_rule.dart | 84 +++++++++++++++++++ ...ive_names_for_type_parameters_visitor.dart | 60 +++++++++++++ .../analysis_options.yaml | 3 + ...iptive_names_for_type_parameters_test.dart | 45 ++++++++++ 5 files changed, 194 insertions(+) create mode 100644 lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart create mode 100644 lib/src/lints/use_descriptive_names_for_type_parameters/visitors/use_descriptive_names_for_type_parameters_visitor.dart create mode 100644 lint_test/use_descriptive_names_for_type_parameters_test/analysis_options.yaml create mode 100644 lint_test/use_descriptive_names_for_type_parameters_test/use_descriptive_names_for_type_parameters_test.dart diff --git a/lib/solid_lints.dart b/lib/solid_lints.dart index b2a24a9d..6353c5fd 100644 --- a/lib/solid_lints.dart +++ b/lib/solid_lints.dart @@ -29,6 +29,7 @@ import 'package:solid_lints/src/lints/prefer_first/prefer_first_rule.dart'; import 'package:solid_lints/src/lints/prefer_last/prefer_last_rule.dart'; import 'package:solid_lints/src/lints/prefer_match_file_name/prefer_match_file_name_rule.dart'; import 'package:solid_lints/src/lints/proper_super_calls/proper_super_calls_rule.dart'; +import 'package:solid_lints/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart'; import 'package:solid_lints/src/models/solid_lint_rule.dart'; /// Creates a plugin for our custom linter @@ -67,6 +68,7 @@ class _SolidLints extends PluginBase { PreferEarlyReturnRule.createRule(configs), AvoidFinalWithGetterRule.createRule(configs), NamedParametersOrderingRule.createRule(configs), + UseDescriptiveNamesForTypeParametersRule.createRule(configs), ]; // Return only enabled rules diff --git a/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart b/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart new file mode 100644 index 00000000..e9735fe7 --- /dev/null +++ b/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart @@ -0,0 +1,84 @@ +import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/error/listener.dart'; +import 'package:custom_lint_builder/custom_lint_builder.dart'; +import 'package:solid_lints/src/lints/use_descriptive_names_for_type_parameters/visitors/use_descriptive_names_for_type_parameters_visitor.dart'; +import 'package:solid_lints/src/models/rule_config.dart'; +import 'package:solid_lints/src/models/solid_lint_rule.dart'; + +/// A `use_descriptive_names_for_type_parameters` rule which +/// warns about single-letter type parameter names when there are +/// three or more type parameters. +class UseDescriptiveNamesForTypeParametersRule extends SolidLintRule { + /// The lint rule name. + static const lintName = 'use_descriptive_names_for_type_parameters'; + + UseDescriptiveNamesForTypeParametersRule._(super.config); + + /// Creates a new instance of [UseDescriptiveNamesForTypeParametersRule] + /// based on the lint configuration. + factory UseDescriptiveNamesForTypeParametersRule.createRule( + CustomLintConfigs configs, + ) { + final rule = RuleConfig( + configs: configs, + name: lintName, + problemMessage: (_) => + 'Type parameters should have descriptive names instead ' + 'of single letters when there are three or more type parameters.', + ); + + return UseDescriptiveNamesForTypeParametersRule._(rule); + } + + @override + void run( + CustomLintResolver resolver, + ErrorReporter reporter, + CustomLintContext context, + ) { + context.registry.addClassDeclaration((node) { + final visitor = UseDescriptiveNamesForTypeParametersVisitor(); + visitor.visitClassDeclaration(node); + _reportViolations(reporter, visitor.singleLetterTypeParameters); + }); + + context.registry.addFunctionDeclaration((node) { + final visitor = UseDescriptiveNamesForTypeParametersVisitor(); + visitor.visitFunctionDeclaration(node); + _reportViolations(reporter, visitor.singleLetterTypeParameters); + }); + + context.registry.addMethodDeclaration((node) { + final visitor = UseDescriptiveNamesForTypeParametersVisitor(); + visitor.visitMethodDeclaration(node); + _reportViolations(reporter, visitor.singleLetterTypeParameters); + }); + + context.registry.addGenericTypeAlias((node) { + final visitor = UseDescriptiveNamesForTypeParametersVisitor(); + visitor.visitGenericTypeAlias(node); + _reportViolations(reporter, visitor.singleLetterTypeParameters); + }); + + context.registry.addExtensionDeclaration((node) { + final visitor = UseDescriptiveNamesForTypeParametersVisitor(); + visitor.visitExtensionDeclaration(node); + _reportViolations(reporter, visitor.singleLetterTypeParameters); + }); + + context.registry.addMixinDeclaration((node) { + final visitor = UseDescriptiveNamesForTypeParametersVisitor(); + visitor.visitMixinDeclaration(node); + _reportViolations(reporter, visitor.singleLetterTypeParameters); + }); + } + + void _reportViolations( + ErrorReporter reporter, + List singleLetterTypeParameters, + ) { + for (final param in singleLetterTypeParameters) { + reporter.atNode(param, code); + } + } +} diff --git a/lib/src/lints/use_descriptive_names_for_type_parameters/visitors/use_descriptive_names_for_type_parameters_visitor.dart b/lib/src/lints/use_descriptive_names_for_type_parameters/visitors/use_descriptive_names_for_type_parameters_visitor.dart new file mode 100644 index 00000000..f1d2ff5f --- /dev/null +++ b/lib/src/lints/use_descriptive_names_for_type_parameters/visitors/use_descriptive_names_for_type_parameters_visitor.dart @@ -0,0 +1,60 @@ +import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/dart/ast/visitor.dart'; + +/// AST Visitor which finds type parameters with single-letter names +/// in declarations with three or more type parameters. +class UseDescriptiveNamesForTypeParametersVisitor + extends RecursiveAstVisitor { + /// List of type parameters with single-letter names. + final singleLetterTypeParameters = []; + + @override + void visitClassDeclaration(ClassDeclaration node) { + super.visitClassDeclaration(node); + _checkTypeParameters(node.typeParameters); + } + + @override + void visitFunctionDeclaration(FunctionDeclaration node) { + super.visitFunctionDeclaration(node); + final function = node.functionExpression; + _checkTypeParameters(function.typeParameters); + } + + @override + void visitMethodDeclaration(MethodDeclaration node) { + super.visitMethodDeclaration(node); + _checkTypeParameters(node.typeParameters); + } + + @override + void visitGenericTypeAlias(GenericTypeAlias node) { + super.visitGenericTypeAlias(node); + _checkTypeParameters(node.typeParameters); + } + + @override + void visitExtensionDeclaration(ExtensionDeclaration node) { + super.visitExtensionDeclaration(node); + _checkTypeParameters(node.typeParameters); + } + + @override + void visitMixinDeclaration(MixinDeclaration node) { + super.visitMixinDeclaration(node); + _checkTypeParameters(node.typeParameters); + } + + void _checkTypeParameters(TypeParameterList? typeParameters) { + if (typeParameters == null || typeParameters.typeParameters.length < 3) { + return; + } + + for (final param in typeParameters.typeParameters) { + final name = param.name.lexeme; + if (name.length == 1) { + singleLetterTypeParameters.add(param); + } + } + } +} diff --git a/lint_test/use_descriptive_names_for_type_parameters_test/analysis_options.yaml b/lint_test/use_descriptive_names_for_type_parameters_test/analysis_options.yaml new file mode 100644 index 00000000..852d28aa --- /dev/null +++ b/lint_test/use_descriptive_names_for_type_parameters_test/analysis_options.yaml @@ -0,0 +1,3 @@ +custom_lint: + rules: + - use_descriptive_names_for_type_parameters diff --git a/lint_test/use_descriptive_names_for_type_parameters_test/use_descriptive_names_for_type_parameters_test.dart b/lint_test/use_descriptive_names_for_type_parameters_test/use_descriptive_names_for_type_parameters_test.dart new file mode 100644 index 00000000..84ad85c3 --- /dev/null +++ b/lint_test/use_descriptive_names_for_type_parameters_test/use_descriptive_names_for_type_parameters_test.dart @@ -0,0 +1,45 @@ +/// Check the `use_descriptive_names_for_type_parameters` rule + +// expect_lint: use_descriptive_names_for_type_parameters +class SomeClass {} + +class ValidClass {} + +class TwoParams {} + +// expect_lint: use_descriptive_names_for_type_parameters +class AnotherClass {} + +// expect_lint: use_descriptive_names_for_type_parameters +void functionWithTypes(T t, U u, K k) {} + +void validFunction(Type t, Data d, Context c) {} + +void twoTypeParams(T t, U u) {} + +// expect_lint: use_descriptive_names_for_type_parameters +class ComplexClass { + // expect_lint: use_descriptive_names_for_type_parameters + void method() {} +} + +class ValidComplexClass { + void validMethod() {} +} + +// expect_lint: use_descriptive_names_for_type_parameters +typedef SomeAlias = Map>; + +typedef ValidAlias = Map>; + +typedef TwoParamAlias = Map; + +// expect_lint: use_descriptive_names_for_type_parameters +extension Ext on List {} + +extension ValidExt on List {} + +// expect_lint: use_descriptive_names_for_type_parameters +mixin Mixin {} + +mixin ValidMixin {} From 3769d30f0029592b18e3a9e959693ffdb3ce48bf Mon Sep 17 00:00:00 2001 From: xJac0b Date: Fri, 6 Jun 2025 15:59:42 +0200 Subject: [PATCH 2/5] refactor code --- ...iptive_names_for_type_parameters_rule.dart | 40 ++++++------- ...ive_names_for_type_parameters_visitor.dart | 60 ------------------- 2 files changed, 17 insertions(+), 83 deletions(-) delete mode 100644 lib/src/lints/use_descriptive_names_for_type_parameters/visitors/use_descriptive_names_for_type_parameters_visitor.dart diff --git a/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart b/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart index e9735fe7..b6d67cd5 100644 --- a/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart +++ b/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart @@ -1,7 +1,6 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/error/listener.dart'; import 'package:custom_lint_builder/custom_lint_builder.dart'; -import 'package:solid_lints/src/lints/use_descriptive_names_for_type_parameters/visitors/use_descriptive_names_for_type_parameters_visitor.dart'; import 'package:solid_lints/src/models/rule_config.dart'; import 'package:solid_lints/src/models/solid_lint_rule.dart'; @@ -37,48 +36,43 @@ class UseDescriptiveNamesForTypeParametersRule extends SolidLintRule { CustomLintContext context, ) { context.registry.addClassDeclaration((node) { - final visitor = UseDescriptiveNamesForTypeParametersVisitor(); - visitor.visitClassDeclaration(node); - _reportViolations(reporter, visitor.singleLetterTypeParameters); + _checkAndReport(node.typeParameters, reporter); }); context.registry.addFunctionDeclaration((node) { - final visitor = UseDescriptiveNamesForTypeParametersVisitor(); - visitor.visitFunctionDeclaration(node); - _reportViolations(reporter, visitor.singleLetterTypeParameters); + _checkAndReport(node.functionExpression.typeParameters, reporter); }); context.registry.addMethodDeclaration((node) { - final visitor = UseDescriptiveNamesForTypeParametersVisitor(); - visitor.visitMethodDeclaration(node); - _reportViolations(reporter, visitor.singleLetterTypeParameters); + _checkAndReport(node.typeParameters, reporter); }); context.registry.addGenericTypeAlias((node) { - final visitor = UseDescriptiveNamesForTypeParametersVisitor(); - visitor.visitGenericTypeAlias(node); - _reportViolations(reporter, visitor.singleLetterTypeParameters); + _checkAndReport(node.typeParameters, reporter); }); context.registry.addExtensionDeclaration((node) { - final visitor = UseDescriptiveNamesForTypeParametersVisitor(); - visitor.visitExtensionDeclaration(node); - _reportViolations(reporter, visitor.singleLetterTypeParameters); + _checkAndReport(node.typeParameters, reporter); }); context.registry.addMixinDeclaration((node) { - final visitor = UseDescriptiveNamesForTypeParametersVisitor(); - visitor.visitMixinDeclaration(node); - _reportViolations(reporter, visitor.singleLetterTypeParameters); + _checkAndReport(node.typeParameters, reporter); }); } - void _reportViolations( + void _checkAndReport( + TypeParameterList? typeParameters, ErrorReporter reporter, - List singleLetterTypeParameters, ) { - for (final param in singleLetterTypeParameters) { - reporter.atNode(param, code); + if (typeParameters == null || typeParameters.typeParameters.length < 3) { + return; + } + + for (final param in typeParameters.typeParameters) { + final name = param.name.lexeme; + if (name.length == 1) { + reporter.atNode(param, code); + } } } } diff --git a/lib/src/lints/use_descriptive_names_for_type_parameters/visitors/use_descriptive_names_for_type_parameters_visitor.dart b/lib/src/lints/use_descriptive_names_for_type_parameters/visitors/use_descriptive_names_for_type_parameters_visitor.dart deleted file mode 100644 index f1d2ff5f..00000000 --- a/lib/src/lints/use_descriptive_names_for_type_parameters/visitors/use_descriptive_names_for_type_parameters_visitor.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/ast/visitor.dart'; - -/// AST Visitor which finds type parameters with single-letter names -/// in declarations with three or more type parameters. -class UseDescriptiveNamesForTypeParametersVisitor - extends RecursiveAstVisitor { - /// List of type parameters with single-letter names. - final singleLetterTypeParameters = []; - - @override - void visitClassDeclaration(ClassDeclaration node) { - super.visitClassDeclaration(node); - _checkTypeParameters(node.typeParameters); - } - - @override - void visitFunctionDeclaration(FunctionDeclaration node) { - super.visitFunctionDeclaration(node); - final function = node.functionExpression; - _checkTypeParameters(function.typeParameters); - } - - @override - void visitMethodDeclaration(MethodDeclaration node) { - super.visitMethodDeclaration(node); - _checkTypeParameters(node.typeParameters); - } - - @override - void visitGenericTypeAlias(GenericTypeAlias node) { - super.visitGenericTypeAlias(node); - _checkTypeParameters(node.typeParameters); - } - - @override - void visitExtensionDeclaration(ExtensionDeclaration node) { - super.visitExtensionDeclaration(node); - _checkTypeParameters(node.typeParameters); - } - - @override - void visitMixinDeclaration(MixinDeclaration node) { - super.visitMixinDeclaration(node); - _checkTypeParameters(node.typeParameters); - } - - void _checkTypeParameters(TypeParameterList? typeParameters) { - if (typeParameters == null || typeParameters.typeParameters.length < 3) { - return; - } - - for (final param in typeParameters.typeParameters) { - final name = param.name.lexeme; - if (name.length == 1) { - singleLetterTypeParameters.add(param); - } - } - } -} From 130ca22df95fbad169b565fa28bac51140a011ea Mon Sep 17 00:00:00 2001 From: xJac0b Date: Fri, 6 Jun 2025 16:03:25 +0200 Subject: [PATCH 3/5] use cascade notattion --- ...iptive_names_for_type_parameters_rule.dart | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart b/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart index b6d67cd5..89f425d4 100644 --- a/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart +++ b/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart @@ -35,29 +35,21 @@ class UseDescriptiveNamesForTypeParametersRule extends SolidLintRule { ErrorReporter reporter, CustomLintContext context, ) { - context.registry.addClassDeclaration((node) { - _checkAndReport(node.typeParameters, reporter); - }); - - context.registry.addFunctionDeclaration((node) { - _checkAndReport(node.functionExpression.typeParameters, reporter); - }); - - context.registry.addMethodDeclaration((node) { - _checkAndReport(node.typeParameters, reporter); - }); - - context.registry.addGenericTypeAlias((node) { - _checkAndReport(node.typeParameters, reporter); - }); - - context.registry.addExtensionDeclaration((node) { - _checkAndReport(node.typeParameters, reporter); - }); + void checkTypeParameters(TypeParameterList? typeParameters) { + _checkAndReport(typeParameters, reporter); + } - context.registry.addMixinDeclaration((node) { - _checkAndReport(node.typeParameters, reporter); - }); + context.registry + ..addClassDeclaration((node) => checkTypeParameters(node.typeParameters)) + ..addFunctionDeclaration( + (node) => checkTypeParameters(node.functionExpression.typeParameters), + ) + ..addMethodDeclaration((node) => checkTypeParameters(node.typeParameters)) + ..addGenericTypeAlias((node) => checkTypeParameters(node.typeParameters)) + ..addExtensionDeclaration( + (node) => checkTypeParameters(node.typeParameters), + ) + ..addMixinDeclaration((node) => checkTypeParameters(node.typeParameters)); } void _checkAndReport( From 7c54c798bbbfb5ce752350f68813b16b17210885 Mon Sep 17 00:00:00 2001 From: xJac0b Date: Sun, 28 Sep 2025 12:17:52 +0200 Subject: [PATCH 4/5] Add test case with nested functions --- ..._descriptive_names_for_type_parameters_test.dart | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lint_test/use_descriptive_names_for_type_parameters_test/use_descriptive_names_for_type_parameters_test.dart b/lint_test/use_descriptive_names_for_type_parameters_test/use_descriptive_names_for_type_parameters_test.dart index 84ad85c3..a462aa13 100644 --- a/lint_test/use_descriptive_names_for_type_parameters_test/use_descriptive_names_for_type_parameters_test.dart +++ b/lint_test/use_descriptive_names_for_type_parameters_test/use_descriptive_names_for_type_parameters_test.dart @@ -1,5 +1,7 @@ /// Check the `use_descriptive_names_for_type_parameters` rule +// ignore_for_file: unused_element + // expect_lint: use_descriptive_names_for_type_parameters class SomeClass {} @@ -15,6 +17,17 @@ void functionWithTypes(T t, U u, K k) {} void validFunction(Type t, Data d, Context c) {} +void functionWithGenericFunctionDeclarations() { + // expect_lint: use_descriptive_names_for_type_parameters + void _fail3() {} + + void _pass2() {} + + void _pass1() {} + + void _pass0() {} +} + void twoTypeParams(T t, U u) {} // expect_lint: use_descriptive_names_for_type_parameters From f7e4b808b2147057749ddb8ba2df89294a27b926 Mon Sep 17 00:00:00 2001 From: xJac0b Date: Sun, 28 Sep 2025 12:20:19 +0200 Subject: [PATCH 5/5] Add parameter for minimum number of type parameters --- ..._names_for_type_parameters_parameters.dart | 22 +++++++++++++++++++ ...iptive_names_for_type_parameters_rule.dart | 14 ++++++++---- .../analysis_options.yaml | 3 ++- 3 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 lib/src/lints/use_descriptive_names_for_type_parameters/models/use_descriptive_names_for_type_parameters_parameters.dart diff --git a/lib/src/lints/use_descriptive_names_for_type_parameters/models/use_descriptive_names_for_type_parameters_parameters.dart b/lib/src/lints/use_descriptive_names_for_type_parameters/models/use_descriptive_names_for_type_parameters_parameters.dart new file mode 100644 index 00000000..3b8312fa --- /dev/null +++ b/lib/src/lints/use_descriptive_names_for_type_parameters/models/use_descriptive_names_for_type_parameters_parameters.dart @@ -0,0 +1,22 @@ +/// A data model class that represents the +/// "use descriptive names for type parameters" input parameters. +class UseDescriptiveNamesForTypeParametersParameters { + static const _defaultMinTypeParameters = 3; + + /// Minimum number of type parameters required before the rule is enforced. + final int minTypeParameters; + + /// Constructor for [UseDescriptiveNamesForTypeParametersParameters] model + const UseDescriptiveNamesForTypeParametersParameters({ + required this.minTypeParameters, + }); + + /// Method for creating from json data + factory UseDescriptiveNamesForTypeParametersParameters.fromJson( + Map json, + ) => + UseDescriptiveNamesForTypeParametersParameters( + minTypeParameters: + json['min_type_parameters'] as int? ?? _defaultMinTypeParameters, + ); +} diff --git a/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart b/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart index 89f425d4..ea13be9d 100644 --- a/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart +++ b/lib/src/lints/use_descriptive_names_for_type_parameters/use_descriptive_names_for_type_parameters_rule.dart @@ -1,13 +1,15 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/error/listener.dart'; import 'package:custom_lint_builder/custom_lint_builder.dart'; +import 'package:solid_lints/src/lints/use_descriptive_names_for_type_parameters/models/use_descriptive_names_for_type_parameters_parameters.dart'; import 'package:solid_lints/src/models/rule_config.dart'; import 'package:solid_lints/src/models/solid_lint_rule.dart'; /// A `use_descriptive_names_for_type_parameters` rule which /// warns about single-letter type parameter names when there are /// three or more type parameters. -class UseDescriptiveNamesForTypeParametersRule extends SolidLintRule { +class UseDescriptiveNamesForTypeParametersRule + extends SolidLintRule { /// The lint rule name. static const lintName = 'use_descriptive_names_for_type_parameters'; @@ -21,9 +23,11 @@ class UseDescriptiveNamesForTypeParametersRule extends SolidLintRule { final rule = RuleConfig( configs: configs, name: lintName, - problemMessage: (_) => + paramsParser: UseDescriptiveNamesForTypeParametersParameters.fromJson, + problemMessage: (value) => 'Type parameters should have descriptive names instead ' - 'of single letters when there are three or more type parameters.', + 'of single letters when there are ${value.minTypeParameters} or ' + 'more type parameters.', ); return UseDescriptiveNamesForTypeParametersRule._(rule); @@ -56,7 +60,9 @@ class UseDescriptiveNamesForTypeParametersRule extends SolidLintRule { TypeParameterList? typeParameters, ErrorReporter reporter, ) { - if (typeParameters == null || typeParameters.typeParameters.length < 3) { + if (typeParameters == null || + typeParameters.typeParameters.length < + config.parameters.minTypeParameters) { return; } diff --git a/lint_test/use_descriptive_names_for_type_parameters_test/analysis_options.yaml b/lint_test/use_descriptive_names_for_type_parameters_test/analysis_options.yaml index 852d28aa..dfcddd4f 100644 --- a/lint_test/use_descriptive_names_for_type_parameters_test/analysis_options.yaml +++ b/lint_test/use_descriptive_names_for_type_parameters_test/analysis_options.yaml @@ -1,3 +1,4 @@ custom_lint: rules: - - use_descriptive_names_for_type_parameters + - use_descriptive_names_for_type_parameters: + min_type_parameters: 3