Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
b67c8bc
chore: update SDK and dependencies
Aug 25, 2026
09000b3
refactor: simplify parameter checking logic and update skip condition…
Aug 25, 2026
b4a0047
refactor: update member access utils to resolve expression elements f…
Aug 25, 2026
e3d7553
refactor: simplify ParameterType classification using pattern matchin…
Aug 25, 2026
6a82db2
refactor: update magic number visitor to use RecordLiteralField inste…
Aug 25, 2026
3a67209
refactor: optimize BuildContext search using ancestors traversal and …
Aug 25, 2026
7d967f4
chore: remove deprecated and unnecessary lint rules from analysis opt…
Aug 25, 2026
9e587cf
refactor: use field formal parameters in AnalysisOptionsLoader constr…
Aug 25, 2026
2bc45dd
refactor: update avoid_returning_widgets visitor to ignore incomplete…
Aug 25, 2026
eb146ed
refactor: use initializer list shorthand in DeclarationOrderingVisito…
Aug 25, 2026
968e4d8
refactor: simplify MemberOrderingReporter constructor using field for…
Aug 25, 2026
6d6475e
refactor: simplify NoEmptyBlockVisitor constructor using field formal…
Aug 25, 2026
c217099
refactor: simplify PreferConditionalExpressionsVisitor constructor us…
Aug 25, 2026
37a931a
fix: correct field access for ExtensionTypeDeclaration in file name v…
Aug 25, 2026
d1aaf5d
fix: resolve incorrect type parameter lookup in ExtensionTypeDeclarat…
Aug 25, 2026
2a67b56
refactor: rename constructor message parameter to _message for direct…
Aug 25, 2026
20ff8d2
refactor: simplify SolidLintRule constructor by using field formal pa…
Aug 25, 2026
0fc4514
refactor: simplify RuleParametersParser assignment in SolidMultiLintR…
Aug 25, 2026
8da3fea
refactor: update test helper to use getFile for dummy unit retrieval
Aug 25, 2026
880c92b
refactor: simplify visitor constructors and update AST node handling …
Aug 25, 2026
07994bc
style: apply consistent formatting and minor cleanups across the code…
Aug 25, 2026
61c4789
refactor: remove redundant export of main.dart from library entry point
Aug 25, 2026
8ca1c5f
refactor: move test package to dev_dependencies as pana resolves it c…
Aug 25, 2026
aa2c2aa
chore: update minimum Dart SDK constraint to 3.12.0
Aug 25, 2026
266005a
style: reformat Dart code to improve readability and apply consistent…
Aug 25, 2026
500083d
refactor: migrate fix imports to analysis_server_plugin and remove an…
Aug 25, 2026
3df96b8
fix: update record field type check and add test cases for magic numb…
Aug 25, 2026
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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
## 1.0.0-dev.2

- Upgraded minimum Dart SDK constraint to `>=3.12.0`.
- Upgraded `analyzer` to `^14.1.0` and `analysis_server_plugin` to `^0.3.20`.
- Resolved false positives in `avoid_returning_widgets` rule.
- Resolved false positives on constructors in `number_of_parameters` rule.
- Improved `member_ordering` configuration.
Expand Down
4 changes: 0 additions & 4 deletions lib/analysis_options.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -138,10 +138,8 @@ linter:
- avoid_implementing_value_types
- avoid_init_to_null
- avoid_multiple_declarations_per_line
- avoid_null_checks_in_equality_operators
- avoid_positional_boolean_parameters
- avoid_print
- avoid_private_typedef_functions
- avoid_redundant_argument_values
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
Expand DownExpand Up@@ -273,7 +271,6 @@ linter:
- type_annotate_public_apis
- type_init_formals
- unawaited_futures
- unnecessary_await_in_return
- unnecessary_brace_in_string_interps
- unnecessary_breaks
- unnecessary_const
Expand All@@ -298,7 +295,6 @@ linter:
- use_decorated_box
- use_full_hex_values_for_flutter_colors
- use_function_type_syntax_for_parameters
- use_if_null_to_convert_nulls_to_bools
- use_is_even_rather_than_modulo
- use_named_constants
- use_raw_strings
Expand Down
2 changes: 0 additions & 2 deletions lib/solid_lints.dart
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,5 +3,3 @@
/// This package is an analyzer plugin and is intended to be used via
/// `analysis_options.yaml`.
library;

export'main.dart';
7 changes: 3 additions & 4 deletions lib/src/common/parameter_parser/analysis_options_loader.dart
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,10 +33,9 @@ class AnalysisOptionsLoader {
}

AnalysisOptionsLoader._({
required ResourceProvider resourceProvider,
required AnalysisOptionsParser parser,
}) : _resourceProvider = resourceProvider,
_parser = parser;
required this._resourceProvider,
required this._parser,
});

/// Gets the options for a specific rule by its name.
Map<String, Object?>? getRuleOptions(RuleContext context, String ruleName) =>
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import'dart:convert';

import'package:analyzer/file_system/file_system.dart';
import'package:solid_lints/src/common/parameter_parser/cached_package_config.dart';

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,10 +23,9 @@ class AstStructuralHashVisitor extends UnifyingAstVisitor<void> {

/// Creates a new [AstStructuralHashVisitor].
AstStructuralHashVisitor({
requiredbool ignoreLiterals,
requiredbool ignoreIdentifiers,
}) : _ignoreLiterals = ignoreLiterals,
_ignoreIdentifiers = ignoreIdentifiers;
requiredthis._ignoreLiterals,
requiredthis._ignoreIdentifiers,
});

/// Computes the structural hash for the given [node].
///
Expand DownExpand Up@@ -124,9 +123,9 @@ class AstStructuralHashVisitor extends UnifyingAstVisitor<void> {
}

@override
voidvisitNamedExpression(NamedExpression node) {
_append(node.name.label.name);
super.visitNamedExpression(node);
voidvisitNamedArgument(NamedArgument node) {
_append(node.name.lexeme);
super.visitNamedArgument(node);
}

// --- Literals ---
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@ import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/diagnostic/diagnostic.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:collection/collection.dart';
import 'package:solid_lints/src/common/parameter_parser/analysis_options_loader.dart';
import 'package:solid_lints/src/lints/avoid_duplicate_code/avoid_duplicate_code_rule.dart';
Expand DownExpand Up@@ -40,19 +39,13 @@ class AvoidDuplicateCodeVisitor extends RecursiveAstVisitor<void> {
AvoidDuplicateCodeVisitor(
this._rule,
this._parameters, {
required String filePath,
required int modificationStamp,
required IgnoreMatcher ignoreMatcher,
ContextRoot? contextRoot,
ResourceProvider? resourceProvider,
AnalysisOptionsLoader? analysisOptionsLoader,
}) : _filePath = filePath,
_modificationStamp = modificationStamp,
_contextRoot = contextRoot,
_resourceProvider =
resourceProvider ?? PhysicalResourceProvider.INSTANCE,
_analysisOptionsLoader = analysisOptionsLoader,
_ignoreMatcher = ignoreMatcher;
required this._filePath,
required this._modificationStamp,
required this._ignoreMatcher,
required this._resourceProvider,
this._contextRoot,
this._analysisOptionsLoader,
});

@override
void visitCompilationUnit(CompilationUnit node) {
Expand DownExpand Up@@ -317,7 +310,7 @@ class AvoidDuplicateCodeVisitor extends RecursiveAstVisitor<void> {
return _packageRootCache.putIfAbsent(dirPath, () {
var dir = _resourceProvider.getFolder(dirPath);
while (true) {
final pubspec = dir.getChildAssumingFile('pubspec.yaml');
final pubspec = dir.getFile('pubspec.yaml');
if (pubspec.exists) {
return dir.path;
}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
import 'package:analysis_server_plugin/edit/change_builder/change_builder.dart';
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
import 'package:analysis_server_plugin/edit/dart/dart_fix_kind_priority.dart';
import 'package:analysis_server_plugin/edit/fix/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:solid_lints/src/lints/avoid_final_with_getter/avoid_final_with_getter_rule.dart';
import 'package:solid_lints/src/lints/avoid_final_with_getter/visitors/getter_variable_visitor.dart';
import 'package:solid_lints/src/lints/avoid_final_with_getter/visitors/variable_references_visitor.dart';
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,7 +41,7 @@ class AvoidReturningWidgetsVisitor extends RecursiveAstVisitor<void> {
}

if (node isMethodDeclaration&&
(node.isAbstract||
(!node.isComplete||
node.body isEmptyFunctionBody||
(node.isGetter &&_isStateWidgetCastingGetter(node)))) {
return;
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
import 'package:analysis_server_plugin/edit/change_builder/change_builder.dart';
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
import 'package:analysis_server_plugin/edit/dart/dart_fix_kind_priority.dart';
import 'package:analysis_server_plugin/edit/fix/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/source/source_range.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:solid_lints/src/lints/avoid_unnecessary_type_assertions/avoid_unnecessary_type_assertions_rule.dart';

/// A Quick fix for `avoid_unnecessary_type_assertions` rule
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,7 +74,7 @@ class AvoidUnusedParametersVisitor extends RecursiveAstVisitor<void> {
final parameters = node.parameters;

if ((parent is ClassDeclaration && parent.abstractKeyword != null) ||
node.isAbstract ||
!node.isComplete ||
node.externalKeyword != null ||
(parameters == null || parameters.parameters.isEmpty)) {
return;
Expand DownExpand Up@@ -150,24 +150,11 @@ class AvoidUnusedParametersVisitor extends RecursiveAstVisitor<void> {
parameter.declaredFragment?.element.baseElement.nonSynthetic,
);

/// Variables declared and initialized as 'Foo(this.param)'
bool isFieldFormalParameter = parameter is FieldFormalParameter;
final isInitializingFormal =
parameter is FieldFormalParameter ||
parameter is SuperFormalParameter;

/// Variables declared and initialized as 'Foo(super.param)'
bool isSuperFormalParameter = parameter is SuperFormalParameter;

if (parameter is DefaultFormalParameter) {
/// Variables as 'Foo({super.param})' or 'Foo({this.param})'
/// is being reported as [DefaultFormalParameter] instead
/// of [SuperFormalParameter] it seems to be an issue in DartSDK
isFieldFormalParameter = parameter.toSource().contains('this.');
isSuperFormalParameter = parameter.toSource().contains('super.');
}

if (name != null &&
!isPresentInAll &&
!isFieldFormalParameter &&
!isSuperFormalParameter) {
if (name != null && !isPresentInAll && !isInitializingFormal) {
result.add(parameter);
}
}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
import 'package:analysis_server_plugin/edit/change_builder/change_builder.dart';
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
import 'package:analysis_server_plugin/edit/dart/dart_fix_kind_priority.dart';
import 'package:analysis_server_plugin/edit/fix/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:solid_lints/src/lints/double_literal_format/double_literal_format_rule.dart';
import 'package:solid_lints/src/lints/double_literal_format/double_literal_format_utils.dart';

Expand Down
14 changes: 12 additions & 2 deletions lib/src/lints/feature_envy/utils/member_access_utils.dart
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,7 +15,12 @@ abstract final class MemberAccessUtils {

final baseElement = switch (target.unwrapTarget) {
ExtensionOverride(:final argumentList) =>
argumentList.arguments.firstOrNull?.staticType?.element,
argumentList
.arguments
.firstOrNull
?.argumentExpression
.staticType
?.element,
final expr => expr?.staticType?.element,
};

Expand All@@ -37,7 +42,12 @@ abstract final class MemberAccessUtils {
(target != null || !isPatternField) &&
switch (target?.unwrapTarget) {
ExtensionOverride(:final argumentList) =>
argumentList.arguments.firstOrNull?.unwrapTarget.isThisOrSuper ??
argumentList
.arguments
.firstOrNull
?.argumentExpression
.unwrapTarget
.isThisOrSuper ??
false,
final expr => expr.isThisOrSuperOrNull,
};
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,10 +44,9 @@ class DeclarationOrderingVisitor {

/// Creates instance of [DeclarationOrderingVisitor].
DeclarationOrderingVisitor({
requiredMemberOrderingParameters parameters,
requiredbool isFlutterWidget,
}) : _parameters = parameters,
_isFlutterWidget = isFlutterWidget;
requiredthis._parameters,
requiredthis._isFlutterWidget,
});

/// Visits a [ClassMember].
voidvisit(ClassMember member) =>switch (member) {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,10 +33,9 @@ class MemberOrderingReporter {

/// Creates instance of [MemberOrderingReporter].
constMemberOrderingReporter({
requiredList<MemberInfo> membersInfo,
requiredMemberOrderingRule rule,
}) : _membersInfo = membersInfo,
_rule = rule;
requiredthis._membersInfo,
requiredthis._rule,
});

/// Generates diagnostic reports based on the configuration parameters.
voidreport({
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
import 'package:analysis_server_plugin/edit/change_builder/change_builder.dart';
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
import 'package:analysis_server_plugin/edit/dart/dart_fix_kind_priority.dart';
import 'package:analysis_server_plugin/edit/fix/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:collection/collection.dart';
import 'package:solid_lints/src/common/parameter_parser/analysis_options_loader.dart';
import 'package:solid_lints/src/lints/named_parameters_ordering/models/named_parameters_ordering_parameters.dart';
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,36 +35,15 @@ enum ParameterType {
}

/// Classifies a [FormalParameter] into a [ParameterType].
///
/// Recursively unwraps [DefaultFormalParameter] wrappers to determine
/// the underlying parameter kind.
static ParameterType fromParameter(
FormalParameter parameter, {
bool hasDefaultValue = false,
}) {
if (parameter is DefaultFormalParameter &&
parameter.parameter is! DefaultFormalParameter) {
return fromParameter(
parameter.parameter,
hasDefaultValue: parameter.defaultValue != null,
);
}

switch (parameter) {
case SuperFormalParameter(:final isRequired):
return isRequired
? ParameterType.requiredInherited
: ParameterType.inherited;

case DefaultFormalParameter():
case _ when hasDefaultValue:
return ParameterType.defaultValue;

case FieldFormalParameter(:final isRequired) ||
FunctionTypedFormalParameter(:final isRequired) ||
SimpleFormalParameter(:final isRequired):
return isRequired ? ParameterType.required : ParameterType.nullable;
}
static ParameterType fromParameter(FormalParameter parameter) {
return switch (parameter) {
SuperFormalParameter(:final isRequired) =>
isRequired ? ParameterType.requiredInherited : ParameterType.inherited,
FormalParameter(defaultClause: _?) => ParameterType.defaultValue,
FormalParameter(:final isRequired) when isRequired =>
ParameterType.required,
_ => ParameterType.nullable,
};
}

/// String representation of the parameter type
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,12 +38,10 @@ class NoEmptyBlockVisitor extends RecursiveAstVisitor<void> {

/// Constructor for [NoEmptyBlockVisitor]
NoEmptyBlockVisitor({
required AnalysisRule rule,
required bool allowWithComments,
required ExcludedIdentifiersListParameter exclude,
}) : _rule = rule,
_allowWithComments = allowWithComments,
_exclude = exclude;
required this._rule,
required this._allowWithComments,
required this._exclude,
});

@override
void visitBlock(Block node) {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,7 +71,7 @@ class NoMagicNumberRuleVisitor extends SimpleAstVisitor<void> {
return p isTypedLiteral||
p isMapLiteralEntry||
p isRecordLiteral||
(p isNamedExpression&& p.parent isRecordLiteral);
p isRecordLiteralNamedField;
}

bool_isWidgetParameter(Literal literal) {
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
import 'package:analysis_server_plugin/edit/change_builder/change_builder.dart';
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
import 'package:analysis_server_plugin/edit/dart/dart_fix_kind_priority.dart';
import 'package:analysis_server_plugin/edit/fix/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:solid_lints/src/lints/prefer_conditional_expressions/models/statement_info.dart';
import 'package:solid_lints/src/lints/prefer_conditional_expressions/prefer_conditional_expressions_rule.dart';

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,10 +35,9 @@ class PreferConditionalExpressionsVisitor extends RecursiveAstVisitor<void> {

/// Creates instance of [PreferConditionalExpressionsVisitor]
PreferConditionalExpressionsVisitor({
requiredPreferConditionalExpressionsRule rule,
requiredbool ignoreNested,
}) : _rule = rule,
_ignoreNested = ignoreNested;
requiredthis._rule,
requiredthis._ignoreNested,
});

@override
voidvisitIfStatement(IfStatement node) {
Expand Down
4 changes: 2 additions & 2 deletions lib/src/lints/prefer_first/fixes/prefer_first_fix.dart
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
import'package:analysis_server_plugin/edit/change_builder/change_builder.dart';
import'package:analysis_server_plugin/edit/dart/correction_producer.dart';
import'package:analysis_server_plugin/edit/dart/dart_fix_kind_priority.dart';
import'package:analysis_server_plugin/edit/fix/fix.dart';
import'package:analyzer/dart/ast/ast.dart';
import'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import'package:analyzer_plugin/utilities/fixes/fixes.dart';
import'package:solid_lints/src/lints/prefer_first/prefer_first_rule.dart';

/// A Quick fix for `prefer_first` rule
Expand Down
4 changes: 2 additions & 2 deletions lib/src/lints/prefer_last/fixes/prefer_last_fix.dart
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
import'package:analysis_server_plugin/edit/change_builder/change_builder.dart';
import'package:analysis_server_plugin/edit/dart/correction_producer.dart';
import'package:analysis_server_plugin/edit/dart/dart_fix_kind_priority.dart';
import'package:analysis_server_plugin/edit/fix/fix.dart';
import'package:analyzer/dart/ast/ast.dart';
import'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import'package:analyzer_plugin/utilities/fixes/fixes.dart';
import'package:solid_lints/src/lints/prefer_last/prefer_last_rule.dart';

/// A Quick fix for `prefer_last` rule
Expand Down
Loading