From 29d5e179871df6d2c2c9e0fb1d32a8867b582e1c Mon Sep 17 00:00:00 2001 From: naipaka Date: Mon, 30 Jun 2025 15:44:39 +0900 Subject: [PATCH 1/2] feat: update avoid_single_child lint to include SliverMainAxisGroup and SliverCrossAxisGroup --- .../example/lints/avoid_single_child.dart | 52 +++++++++++++++---- .../lib/src/lints/avoid_single_child.dart | 9 +++- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/packages/altive_lints/example/lints/avoid_single_child.dart b/packages/altive_lints/example/lints/avoid_single_child.dart index a6d2204..53df7c2 100644 --- a/packages/altive_lints/example/lints/avoid_single_child.dart +++ b/packages/altive_lints/example/lints/avoid_single_child.dart @@ -55,6 +55,18 @@ class MyWidget extends StatelessWidget { ], ), // expect_lint: avoid_single_child + SliverMainAxisGroup( + slivers: [ + SliverToBoxAdapter(child: Text('Hello')), + ], + ), + // expect_lint: avoid_single_child + SliverCrossAxisGroup( + slivers: [ + SliverToBoxAdapter(child: Text('Hello')), + ], + ), + // expect_lint: avoid_single_child Column( children: [ if (random.nextBool()) const Text('Hello World'), @@ -73,16 +85,16 @@ class MyWidget extends StatelessWidget { // expect_lint: avoid_single_child Column( children: [ - if(isValued)...[ + if (isValued) ...[ Container(), - ]else...[ + ] else ...[ Container(), ], ], ), Column( children: [ - if(isValued)...[ + if (isValued) ...[ Container(), ], Container(), @@ -91,14 +103,14 @@ class MyWidget extends StatelessWidget { // expect_lint: avoid_single_child Column( children: [ - if(isValued)...[ + if (isValued) ...[ Container(), ], ], ), Column( children: [ - if(isValued)...[ + if (isValued) ...[ Container(), Container(), ], @@ -106,16 +118,14 @@ class MyWidget extends StatelessWidget { ), // expect_lint: avoid_single_child Column( - children: [ - if(isValued)...[] - else...[] - ], + children: [if (isValued) ...[] else ...[]], ), // expect_lint: avoid_single_child Column( children: [ - if(isValued)...[] - else...[ + if (isValued) + ...[] + else ...[ Container(), ] ], @@ -155,6 +165,26 @@ class MyWidget extends StatelessWidget { for (final e in ['a', 'b', 'c']) Text('Hello $e'), ], ), + SliverMainAxisGroup( + slivers: [ + SliverAppBar( + title: const Text('Sliver App Bar'), + ), + SliverToBoxAdapter( + child: const Text('Hello World'), + ), + ], + ), + SliverCrossAxisGroup( + slivers: [ + SliverAppBar( + title: const Text('Sliver App Bar'), + ), + SliverToBoxAdapter( + child: const Text('Hello World'), + ), + ], + ), Column( children: [ if (random.nextBool()) const Text('Hello 1'), diff --git a/packages/altive_lints/lib/src/lints/avoid_single_child.dart b/packages/altive_lints/lib/src/lints/avoid_single_child.dart index a47c3c8..5b65634 100644 --- a/packages/altive_lints/lib/src/lints/avoid_single_child.dart +++ b/packages/altive_lints/lib/src/lints/avoid_single_child.dart @@ -7,7 +7,7 @@ import 'package:custom_lint_builder/custom_lint_builder.dart'; /// widgets intended for multiple children with only one child. /// /// This includes widgets like `Column`, `Row`, `Stack`, `Flex`, `Wrap`, -/// `ListView`, and `SliverList`. +/// `ListView`, `SliverList`, `SliverMainAxisGroup`, and `SliverCrossAxisGroup`. /// /// Using these widgets with a single child can lead to /// unnecessary overhead and less efficient layouts. @@ -60,9 +60,14 @@ class AvoidSingleChild extends DartLintRule { 'Stack', 'ListView', 'SliverList', + 'SliverMainAxisGroup', + 'SliverCrossAxisGroup', ].contains(className)) { final childrenArg = node.argumentList.arguments.firstWhereOrNull( - (arg) => arg is NamedExpression && arg.name.label.name == 'children', + (arg) => + arg is NamedExpression && + (arg.name.label.name == 'children' || + arg.name.label.name == 'slivers'), ); final ListLiteral childrenList; From 9e50149b971bd5925dc3cd519fe8640292d60471 Mon Sep 17 00:00:00 2001 From: naipaka Date: Mon, 30 Jun 2025 16:38:14 +0900 Subject: [PATCH 2/2] chore: update dependencies --- packages/altive_lints/example/pubspec.yaml | 2 +- .../altive_lints/lib/src/lints/avoid_hardcoded_color.dart | 6 +++--- packages/altive_lints/lib/src/utils/types_utils.dart | 2 +- packages/altive_lints/pubspec.yaml | 8 ++++---- packages/diffscrape/pubspec.yaml | 8 ++++---- pubspec.yaml | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/altive_lints/example/pubspec.yaml b/packages/altive_lints/example/pubspec.yaml index b7b295a..62d3942 100644 --- a/packages/altive_lints/example/pubspec.yaml +++ b/packages/altive_lints/example/pubspec.yaml @@ -13,4 +13,4 @@ dev_dependencies: altive_lints: path: ../ clock: ^1.1.2 - custom_lint: ^0.7.0 + custom_lint: ^0.7.5 diff --git a/packages/altive_lints/lib/src/lints/avoid_hardcoded_color.dart b/packages/altive_lints/lib/src/lints/avoid_hardcoded_color.dart index f1ba37d..7370b62 100644 --- a/packages/altive_lints/lib/src/lints/avoid_hardcoded_color.dart +++ b/packages/altive_lints/lib/src/lints/avoid_hardcoded_color.dart @@ -1,5 +1,5 @@ import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/error/listener.dart'; import 'package:custom_lint_builder/custom_lint_builder.dart'; @@ -65,8 +65,8 @@ class AvoidHardcodedColor extends DartLintRule { context.registry.addPrefixedIdentifier((node) { final prefix = node.prefix.name; if (prefix == 'Colors') { - final element = node.staticElement; - if (element is PropertyAccessorElement) { + final element = node.element; + if (element is PropertyAccessorElement2) { final returnType = element.returnType; // Allow Colors.transparent as a valid hardcoded color, as it serves. if (node.identifier.name == 'transparent') { diff --git a/packages/altive_lints/lib/src/utils/types_utils.dart b/packages/altive_lints/lib/src/utils/types_utils.dart index e3c1c79..c97d0ac 100644 --- a/packages/altive_lints/lib/src/utils/types_utils.dart +++ b/packages/altive_lints/lib/src/utils/types_utils.dart @@ -82,7 +82,7 @@ bool _isWidget(DartType? type) => type?.getDisplayString() == 'Widget'; bool _isSubclassOfWidget(DartType? type) => type is InterfaceType && type.allSupertypes.any(_isWidget); -bool _isWidgetState(DartType? type) => type?.element?.displayName == 'State'; +bool _isWidgetState(DartType? type) => type?.element3?.displayName == 'State'; bool _isSubclassOfWidgetState(DartType? type) => type is InterfaceType && type.allSupertypes.any(_isWidgetState); diff --git a/packages/altive_lints/pubspec.yaml b/packages/altive_lints/pubspec.yaml index 5af4449..d8276d8 100644 --- a/packages/altive_lints/pubspec.yaml +++ b/packages/altive_lints/pubspec.yaml @@ -15,9 +15,9 @@ environment: sdk: ^3.0.0 dependencies: - analyzer: ">=6.7.0 <8.0.0" - collection: ^1.18.0 - custom_lint_builder: ^0.7.0 + analyzer: ^7.4.5 + collection: ^1.19.1 + custom_lint_builder: ^0.7.5 dev_dependencies: - test: ^1.25.14 + test: ^1.26.2 diff --git a/packages/diffscrape/pubspec.yaml b/packages/diffscrape/pubspec.yaml index ad8b1f9..a28759c 100644 --- a/packages/diffscrape/pubspec.yaml +++ b/packages/diffscrape/pubspec.yaml @@ -8,10 +8,10 @@ environment: sdk: ^3.2.3 dependencies: - args: ^2.5.0 - html: ^0.15.4 - http: ^1.2.1 + args: ^2.7.0 + html: ^0.15.6 + http: ^1.4.0 dev_dependencies: altive_lints: ^1.21.0 - test: ^1.25.7 + test: ^1.26.2 diff --git a/pubspec.yaml b/pubspec.yaml index f06762d..a98d97c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,4 +7,4 @@ environment: dev_dependencies: altive_lints: path: packages/altive_lints - melos: ^6.1.0 + melos: ^6.3.3