dart-lang / sdk

The Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.
https://dart.dev
BSD 3-Clause "New" or "Revised" License
10.26k stars 1.58k forks source link

Analysis failure when analysis_options.yaml is malformed #56811

Open abitofevrything opened 1 month ago

abitofevrything commented 1 month ago

dart analyze and the dart analysis server both fail when analysis_options.yaml contains malformed data.

Notably, dart analyze outputs a single error and then hangs forever:

Error from the analysis server: Internal error: Failed to handle request: analysis.setAnalysisRoots
type 'Null' is not a subtype of type 'Object' in type cast
#0      YamlNodeExtension.valueOrThrow (package:analyzer/src/util/yaml.dart:147:36)
#1      _LintConfig.asBool (package:analyzer/src/lint/config.dart:77:47)
#2      _LintConfig._parseYaml.<anonymous closure>.<anonymous closure> (package:analyzer/src/lint/config.dart:146:19)
#3      CastMap.forEach.<anonymous closure> (dart:_internal/cast.dart:286:8)
#4      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:633:13)
#5      CastMap.forEach (dart:_internal/cast.dart:285:13)
#6      MapView.forEach (dart:collection/maps.dart:347:10)
#7      _LintConfig._parseYaml.<anonymous closure> (package:analyzer/src/lint/config.dart:144:46)
#8      _HashMap.forEach (dart:collection-patch/collection_patch.dart:153:15)
#9      MapView.forEach (dart:collection/maps.dart:347:10)
#10     _LintConfig._parseYaml (package:analyzer/src/lint/config.dart:117:16)
#11     new LintConfig.parseMap (package:analyzer/src/lint/config.dart:38:62)
#12     parseConfig (package:analyzer/src/lint/config.dart:15:25)
#13     AnalysisOptionsImplExtensions.applyOptions (package:analyzer/src/analysis_options/apply_options.dart:229:18)
#14     ContextBuilderImpl._createOptionsMap (package:analyzer/src/dart/analysis/context_builder.dart:210:15)
#15     ContextBuilderImpl.createContext (package:analyzer/src/dart/analysis/context_builder.dart:135:15)
#16     new AnalysisContextCollectionImpl (package:analyzer/src/dart/analysis/analysis_context_collection.dart:108:36)
#17     ContextManagerImpl._createAnalysisContexts.performContextRebuildGuarded.performContextRebuild (package:analysis_server/src/context_manager.dart:549:40)
<asynchronous suspension>
#18     ContextManagerImpl._createAnalysisContexts.performContextRebuildGuarded (package:analysis_server/src/context_manager.dart:694:11)
<asynchronous suspension>
#19     _CancellingTaskQueue.queue.<anonymous closure> (package:analysis_server/src/context_manager.dart:978:15)
<asynchronous suspension>
#20     ContextManagerImpl.setRoots (package:analysis_server/src/context_manager.dart:364:5)
<asynchronous suspension>
#21     LegacyAnalysisServer.setAnalysisRoots (package:analysis_server/src/legacy_analysis_server.dart:793:9)
<asynchronous suspension>
#22     AnalysisSetAnalysisRootsHandler.handle (package:analysis_server/src/handler/legacy/analysis_set_analysis_roots.dart:46:7)
<asynchronous suspension>
#23     LegacyAnalysisServer.handleRequest.<anonymous closure>.<anonymous closure> (package:analysis_server/src/legacy_analysis_server.dart:577:11)
<asynchronous suspension>
#24     OperationPerformanceImpl.runAsync (package:analyzer/src/util/performance/operation_performance.dart:174:14)
<asynchronous suspension>
#25     LegacyAnalysisServer.handleRequest.<anonymous closure> (package:analysis_server/src/legacy_analysis_server.dart:558:7)
<asynchronous suspension>

null
Error response from the server: SERVER_ERROR type 'Null' is not a subtype of type 'Object' in type cast
#0      YamlNodeExtension.valueOrThrow (package:analyzer/src/util/yaml.dart:147:36)
#1      _LintConfig.asBool (package:analyzer/src/lint/config.dart:77:47)
#2      _LintConfig._parseYaml.<anonymous closure>.<anonymous closure> (package:analyzer/src/lint/config.dart:146:19)
#3      CastMap.forEach.<anonymous closure> (dart:_internal/cast.dart:286:8)
#4      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:633:13)
#5      CastMap.forEach (dart:_internal/cast.dart:285:13)
#6      MapView.forEach (dart:collection/maps.dart:347:10)
#7      _LintConfig._parseYaml.<anonymous closure> (package:analyzer/src/lint/config.dart:144:46)
#8      _HashMap.forEach (dart:collection-patch/collection_patch.dart:153:15)
#9      MapView.forEach (dart:collection/maps.dart:347:10)
#10     _LintConfig._parseYaml (package:analyzer/src/lint/config.dart:117:16)
#11     new LintConfig.parseMap (package:analyzer/src/lint/config.dart:38:62)
#12     parseConfig (package:analyzer/src/lint/config.dart:15:25)
#13     AnalysisOptionsImplExtensions.applyOptions (package:analyzer/src/analysis_options/apply_options.dart:229:18)
#14     ContextBuilderImpl._createOptionsMap (package:analyzer/src/dart/analysis/context_builder.dart:210:15)
#15     ContextBuilderImpl.createContext (package:analyzer/src/dart/analysis/context_builder.dart:135:15)
#16     new AnalysisContextCollectionImpl (package:analyzer/src/dart/analysis/analysis_context_collection.dart:108:36)
#17     ContextManagerImpl._createAnalysisContexts.performContextRebuildGuarded.performContextRebuild (package:analysis_server/src/context_manager.dart:549:40)
<asynchronous suspension>
#18     ContextManagerImpl._createAnalysisContexts.performContextRebuildGuarded (package:analysis_server/src/context_manager.dart:694:11)
<asynchronous suspension>
#19     _CancellingTaskQueue.queue.<anonymous closure> (package:analysis_server/src/context_manager.dart:978:15)
<asynchronous suspension>
#20     ContextManagerImpl.setRoots (package:analysis_server/src/context_manager.dart:364:5)
<asynchronous suspension>
#21     LegacyAnalysisServer.setAnalysisRoots (package:analysis_server/src/legacy_analysis_server.dart:793:9)
<asynchronous suspension>
#22     AnalysisSetAnalysisRootsHandler.handle (package:analysis_server/src/handler/legacy/analysis_set_analysis_roots.dart:46:7)
<asynchronous suspension>
#23     LegacyAnalysisServer.handleRequest.<anonymous closure>.<anonymous closure> (package:analysis_server/src/legacy_analysis_server.dart:577:11)
<asynchronous suspension>
#24     OperationPerformanceImpl.runAsync (package:analyzer/src/util/performance/operation_performance.dart:174:14)
<asynchronous suspension>
#25     LegacyAnalysisServer.handleRequest.<anonymous closure> (package:analysis_server/src/legacy_analysis_server.dart:558:7)
<asynchronous suspension>

Analyzing flutter_project_amit_63_ibrahim_juma...                      |

This issue also causes the analysis server to fail to start, which means IDEs appear to be misconfigured and do not report errors or other lints.

In this case, the analysis_options.yaml causing the issue was the following:

include: package:flutter_lints/flutter.yaml

analyzer:
  errors:
    unused_import: ignore

    avoid_print: ignore
    prefer_const_constructors: ignore
    prefer_const_literals_to_create_immutables: ignore
    prefer_const_constructors_in_immutables: ignore
    prefer_final_fields: ignore
    sized_box_for_whitespace: ignore
    use_key_in_widget_constructors: ignore
    must_be_immutable: ignore
    prefer_typing_uninitialized_variables: ignore
    sort_child_properties_last: ignore
    unnecessary_string_interpolations: ignore
    body_might_complete_normally_nullable: ignore
    depend_on_referenced_packages: ignore

linter:
  rules:
    prefer_const_constructors:
    prefer_single_quotes: true

(note the missing value after prefer_const_constructors).

dart-github-bot commented 1 month ago

Summary: The Dart analyzer and analysis server fail when analysis_options.yaml contains malformed data, causing the analyzer to hang and the analysis server to fail to start. This prevents IDEs from reporting errors and lints, leading to misconfiguration. The issue is caused by a missing value after a key in the analysis_options.yaml file.