dart-lang / sdk

The Dart SDK, including the VM, dart2js, core libraries, and more.
https://dart.dev
BSD 3-Clause "New" or "Revised" License
9.94k stars 1.53k forks source link

[analyzer] `completion.getSuggestions` to handle `dynamic` #47507

Open asashour opened 2 years ago

asashour commented 2 years ago

There is a test case in IntelliJ plugin for completion.getSuggestions, for completing import 'dart:core' show prin

This used to work, but fails after https://github.com/dart-lang/sdk/commit/c9c4aa5b25d5a64b6bd9ec8287c5a8f1fb668726#diff-2e4c5d5cea7e48adddaaccc1bea6a662cd66cd61fc0449bb5ed46b7c994f4e0bR508, giving a server-side error and a client-side timeout.

The reason is the DynamicElement not handled. I guess this should be fixed, by adding dynamic as a suggested option.

equivalent test case for 'get_suggestions_test.dart' ```dart Future test_getSuggestions_dynamic() async { setTestSource('test.dart', r''' import 'dart:core' show prin^ '''); writeFile(path, content); await standardAnalysisSetup(); await analysisFinished; var result = await sendCompletionGetSuggestions(path, completionOffset); var completionId = result.id; var param = await onCompletionResults.firstWhere( (CompletionResultsParams param) => param.id == completionId && param.isLast); var length = 4; expect(param.replacementOffset, completionOffset - length); expect(param.replacementLength, length); param.results.firstWhere( (CompletionSuggestion suggestion) => suggestion.completion == 'print'); } ```
Error ```dart 1634536428720:Ex:Failed to handle completion domain request:: completion.getSuggestions Invalid argument(s):: Cannot suggest a DynamicElementImpl #0 SuggestionBuilder.suggestElement (package::analysis_server/src/services/completion/dart/suggestion_builder.dart::393::7) #1 CombinatorContributor.computeSuggestions (package::analysis_server/src/services/completion/dart/combinator_contributor.dart::29::21) #2 DartCompletionManager.computeSuggestions. (package::analysis_server/src/services/completion/dart/completion_manager.dart::160::31) #3 DartCompletionManager.computeSuggestions. (package::analysis_server/src/services/completion/dart/completion_manager.dart::159::11) #4 OperationPerformanceImpl.runAsync (package::analyzer/src/util/performance/operation_performance.dart::160::29) #5 DartCompletionManager.computeSuggestions (package::analysis_server/src/services/completion/dart/completion_manager.dart::157::27) #6 CompletionDomainHandler.computeSuggestions.. (package::analysis_server/src/domain_completion.dart::111::13) #7 OperationPerformanceImpl.runAsync (package::analyzer/src/util/performance/operation_performance.dart::160::14) #8 CompletionDomainHandler.computeSuggestions. (package::analysis_server/src/domain_completion.dart::108::7) #9 OperationPerformanceImpl.runAsync (package::analyzer/src/util/performance/operation_performance.dart::160::14) #10 CompletionDomainHandler.computeSuggestions (package::analysis_server/src/domain_completion.dart::97::5) #11 CompletionDomainHandler.processRequest. (package::analysis_server/src/domain_completion.dart::374::22) #12 CompletionPerformance.runRequestOperation. (package::analysis_server/src/services/completion/completion_performance.dart::62::16) #13 OperationPerformanceImpl.runAsync (package::analyzer/src/util/performance/operation_performance.dart::160::14) #14 CompletionDomainHandler.processRequest (package::analysis_server/src/domain_completion.dart::288::5) ```
bwilkerson commented 2 years ago

That probably isn't the right solution. We should investigate to see why a DynamicElement is being suggested. It looks like the code is looking at the names that are declared in dart:core, and is finding one associated with the declaration of dynamic. There shouldn't be such a mapping. The real issue appears to not be in the code completion contributor, but in the way recovery is being done in that sample of code.