Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import 'package:solid_lints/src/lints/cyclomatic_complexity/cyclomatic_complexit
import 'package:solid_lints/src/lints/double_literal_format/double_literal_format_rule.dart';
import 'package:solid_lints/src/lints/double_literal_format/fixes/double_literal_format_fix.dart';
import 'package:solid_lints/src/lints/function_lines_of_code/function_lines_of_code_rule.dart';
import 'package:solid_lints/src/lints/number_of_parameters/number_of_parameters_rule.dart';
import 'package:solid_lints/src/lints/prefer_first/fixes/prefer_first_fix.dart';
import 'package:solid_lints/src/lints/prefer_first/prefer_first_rule.dart';
import 'package:solid_lints/src/lints/proper_super_calls/proper_super_calls_rule.dart';
Expand Down Expand Up @@ -63,6 +64,9 @@ class SolidLintsPlugin extends Plugin {
CyclomaticComplexityRule(
analysisOptionsLoader: analysisLoader,
),
NumberOfParametersRule(
analysisOptionsLoader: analysisLoader,
),
UseNearestContextRule(),
preferFirstRule,
// TODO: Add more lint rules and use analysisLoader
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ class NumberOfParametersParameters {
required this.exclude,
});

/// Empty [NumberOfParametersParameters] model.
factory NumberOfParametersParameters.empty() {
return NumberOfParametersParameters(
maxParameters: _defaultMaxParameters,
exclude: ExcludedIdentifiersListParameter(exclude: []),
);
}

/// Method for creating from json data
factory NumberOfParametersParameters.fromJson(Map<String, Object?> json) =>
NumberOfParametersParameters(
Expand Down
85 changes: 40 additions & 45 deletions lib/src/lints/number_of_parameters/number_of_parameters_rule.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/error/listener.dart';
import 'package:custom_lint_builder/custom_lint_builder.dart';
import 'package:analyzer/analysis_rule/rule_context.dart';
import 'package:analyzer/analysis_rule/rule_visitor_registry.dart';
import 'package:analyzer/error/error.dart';
import 'package:solid_lints/src/lints/number_of_parameters/models/number_of_parameters_parameters.dart';
import 'package:solid_lints/src/models/rule_config.dart';
import 'package:solid_lints/src/lints/number_of_parameters/visitors/number_of_parameters_visitor.dart';
import 'package:solid_lints/src/models/solid_lint_rule.dart';

/// A number of parameters metric which checks whether we didn't exceed
Expand All @@ -14,10 +14,11 @@ import 'package:solid_lints/src/models/solid_lint_rule.dart';
/// Assuming config:
///
/// ```yaml
/// custom_lint:
/// rules:
/// - number_of_parameters:
/// max_parameters: 2
/// plugins:
/// solid_lints:
/// diagnostics:
/// number_of_parameters:
/// max_parameters: 2
/// ```
///
/// #### BAD:
Expand All @@ -37,50 +38,44 @@ import 'package:solid_lints/src/models/solid_lint_rule.dart';
/// ```
class NumberOfParametersRule
extends SolidLintRule<NumberOfParametersParameters> {
/// This lint rule represents the error if number of
/// parameters reaches the maximum value.
/// The name of this lint rule.
static const lintName = 'number_of_parameters';

NumberOfParametersRule._(super.rule);
static const _code = LintCode(
lintName,
'The maximum allowed number of parameters is {0}. '
'Try reducing the number of parameters.',
);

/// Creates a new instance of [NumberOfParametersRule]
/// based on the lint configuration.
factory NumberOfParametersRule.createRule(CustomLintConfigs configs) {
final rule = RuleConfig(
configs: configs,
name: lintName,
paramsParser: NumberOfParametersParameters.fromJson,
problemMessage: (value) =>
'The maximum allowed number of parameters is ${value.maxParameters}. '
'Try reducing the number of parameters.',
);
@override
DiagnosticCode get diagnosticCode => _code;

return NumberOfParametersRule._(rule);
}
/// Creates a new instance of [NumberOfParametersRule].
NumberOfParametersRule({
required super.analysisOptionsLoader,
}) : super.withParameters(
name: lintName,
description:
"Checks whether we didn't exceed the maximum allowed number "
'of parameters for a function, method or constructor.',
parametersParser: NumberOfParametersParameters.fromJson,
);

@override
void run(
CustomLintResolver resolver,
DiagnosticReporter reporter,
CustomLintContext context,
void registerNodeProcessors(
RuleVisitorRegistry registry,
RuleContext context,
) {
context.registry.addDeclaration((node) {
final isIgnored = config.parameters.exclude.shouldIgnore(node);
final parameters = switch (node) {
(final MethodDeclaration node) =>
node.parameters?.parameters.length ?? 0,
(final FunctionDeclaration node) =>
node.functionExpression.parameters?.parameters.length ?? 0,
_ => 0,
};
super.registerNodeProcessors(registry, context);

final parameters =
getParametersForContext(context) ??
NumberOfParametersParameters.empty();

final visitor = NumberOfParametersVisitor(this, parameters);

if (!isIgnored && parameters > config.parameters.maxParameters) {
reporter.atOffset(
offset: node.firstTokenAfterCommentAndMetadata.offset,
length: node.end,
diagnosticCode: code,
);
}
});
registry.addFunctionDeclaration(this, visitor);
registry.addMethodDeclaration(this, visitor);
registry.addConstructorDeclaration(this, visitor);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:solid_lints/src/lints/number_of_parameters/models/number_of_parameters_parameters.dart';
import 'package:solid_lints/src/lints/number_of_parameters/number_of_parameters_rule.dart';
import 'package:solid_lints/src/utils/node_utils.dart';

/// A visitor that checks the number of parameters for functions, methods, and
/// constructors.
class NumberOfParametersVisitor extends SimpleAstVisitor<void> {
final NumberOfParametersRule _rule;
final NumberOfParametersParameters _parameters;

/// Creates a new instance of [NumberOfParametersVisitor].
NumberOfParametersVisitor(this._rule, this._parameters);

void _check(Declaration node, FormalParameterList? parameterList) {
if (parameterList == null) return;

final isIgnored = _parameters.exclude.shouldIgnore(node);
if (isIgnored) return;

final count = parameterList.parameters.length;
if (count > _parameters.maxParameters) {
_rule.reportAtNode(
parameterList,
arguments: [_parameters.maxParameters.toString()],
);
}
Comment thread
solid-illiaaihistov marked this conversation as resolved.
}

@override
void visitFunctionDeclaration(FunctionDeclaration node) {
_check(node, node.functionExpression.parameters);
}

@override
void visitMethodDeclaration(MethodDeclaration node) {
if (isOverride(node.metadata)) return;
_check(node, node.parameters);
}

@override
void visitConstructorDeclaration(ConstructorDeclaration node) {
_check(node, node.parameters);
}
}

This file was deleted.

This file was deleted.

15 changes: 0 additions & 15 deletions lint_test/number_of_parameters_copy_with_test/pubspec.yaml

This file was deleted.

20 changes: 0 additions & 20 deletions lint_test/number_of_parameters_test.dart

This file was deleted.

Loading
Loading