diff --git a/CHANGELOG.md b/CHANGELOG.md index f8bac6246f..c0cfb6a5d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +* fix: correctly handle disabling rules with false. * fix: dart-code-metrics crash saying `Bad state: No element` when running command. ## 4.14.0 diff --git a/lib/src/config_builder/models/analysis_options.dart b/lib/src/config_builder/models/analysis_options.dart index 585f57c202..1aeaaa3f6c 100644 --- a/lib/src/config_builder/models/analysis_options.dart +++ b/lib/src/config_builder/models/analysis_options.dart @@ -64,18 +64,32 @@ class AnalysisOptions { } if (data is Iterable) { - return Map.unmodifiable(Map>.fromEntries([ - ...data.whereType().map((node) => MapEntry(node, {})), - ...data - .whereType>() - .where((node) => - node.keys.length == 1 && - node.values.first is Map) - .map((node) => MapEntry( - node.keys.first, - node.values.first as Map, - )), - ])); + return Map.unmodifiable(Map>.fromEntries( + data.fold([], (previousValue, element) { + if (element is String) { + return [...previousValue, MapEntry(element, {})]; + } + + if (element is Map) { + final hasSingleKey = element.keys.length == 1; + final value = element.values.first; + + if (hasSingleKey && value is Map || value is bool) { + final updatedValue = value is bool + ? {'enabled': value} + : value as Map; + + return [ + ...previousValue, + MapEntry(element.keys.first, updatedValue), + ]; + } + } + + return previousValue; + }), + )..removeWhere((key, value) => + (value['enabled'] is bool && value['enabled'] == false))); } else if (data is Map) { final rulesNode = data; diff --git a/test/src/config_builder/models/analysis_options_test.dart b/test/src/config_builder/models/analysis_options_test.dart index ec0c2fc3b9..890d9fbaa3 100644 --- a/test/src/config_builder/models/analysis_options_test.dart +++ b/test/src/config_builder/models/analysis_options_test.dart @@ -153,6 +153,12 @@ void main() { 'rule-id3', ], 'rules4': null, + 'rules5': [ + 'rule-id1', + 'rule-id2', + 'rule-id3', + {'rule-id1': false}, + ], }, }); @@ -185,6 +191,15 @@ void main() { ); expect(options.readMapOfMap(['dart_code_metrics', 'rules4']), isEmpty); + + expect( + options.readMapOfMap(['dart_code_metrics', 'rules5']), + allOf( + containsPair('rule-id2', {}), + containsPair('rule-id3', {}), + hasLength(2), + ), + ); }); test(