From 7b7dfa6bb52376922061ad670d00c7d8e012e2d7 Mon Sep 17 00:00:00 2001 From: pq Date: Thu, 18 Jan 2024 22:05:18 +0000 Subject: [PATCH] add `analysisOptions` to `FileResult`s See: https://github.com/dart-lang/sdk/issues/54667 Change-Id: I5d756e9f8ba2282c7c022a8dc6c11fe4da254a3e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/347126 Reviewed-by: Brian Wilkerson Commit-Queue: Phil Quitslund Reviewed-by: Konstantin Shcheglov --- .../src/handler/legacy/edit_get_fixes.dart | 16 ++++++++++-- .../abstract_code_actions_producer.dart | 26 ++++++++++++------- .../code_actions/analysis_options.dart | 1 + .../src/lsp/handlers/code_actions/dart.dart | 4 ++- .../lsp/handlers/code_actions/plugins.dart | 1 + .../lsp/handlers/code_actions/pubspec.dart | 5 ++-- .../lsp/handlers/handler_code_actions.dart | 17 ++++++++++++ pkg/analyzer/lib/dart/analysis/results.dart | 4 +++ .../lib/src/dart/analysis/driver.dart | 2 ++ .../lib/src/dart/analysis/results.dart | 8 ++++++ .../lib/src/dart/micro/resolve_file.dart | 1 + pkg/analyzer_cli/lib/src/driver.dart | 10 +++++-- pkg/analyzer_cli/test/reporter_test.dart | 2 ++ 13 files changed, 79 insertions(+), 18 deletions(-) diff --git a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart index 9f2e8b6b33e..4e1b98051fb 100644 --- a/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart +++ b/pkg/analysis_server/lib/src/handler/legacy/edit_get_fixes.dart @@ -15,12 +15,14 @@ import 'package:analysis_server/src/services/correction/fix.dart'; import 'package:analysis_server/src/services/correction/fix/analysis_options/fix_generator.dart'; import 'package:analysis_server/src/services/correction/fix/pubspec/fix_generator.dart'; import 'package:analysis_server/src/services/correction/fix_internal.dart'; +import 'package:analyzer/dart/analysis/results.dart'; import 'package:analyzer/dart/analysis/session.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/src/analysis_options/analysis_options_provider.dart'; import 'package:analyzer/src/dart/analysis/results.dart' as engine; import 'package:analyzer/src/exception/exception.dart'; +import 'package:analyzer/src/generated/engine.dart'; import 'package:analyzer/src/generated/source.dart' show SourceFactory; import 'package:analyzer/src/pubspec/pubspec_validator.dart'; import 'package:analyzer/src/task/options.dart'; @@ -128,6 +130,9 @@ class EditGetFixesHandler extends LegacyHandler if (fixes.isNotEmpty) { fixes.sort(Fix.compareFixes); var lineInfo = LineInfo.fromContent(content); + // Options are not used in the analysis *of options* so associating + // an empty set is accurate if not ideal. + var analysisOptions = AnalysisOptionsImpl(); var result = engine.ErrorsResultImpl( session: session, file: optionsFile, @@ -139,6 +144,7 @@ class EditGetFixesHandler extends LegacyHandler isMacroAugmentation: false, isPart: false, errors: errors, + analysisOptions: analysisOptions, ); var serverError = newAnalysisError_fromEngine(result, error); var errorFixes = AnalysisErrorFixes(serverError); @@ -228,8 +234,13 @@ error.errorCode: ${error.errorCode} if (node is! YamlMap) { return errorFixesList; } - final analysisOptions = - session.analysisContext.getAnalysisOptionsForFile(pubspecFile); + + var fileResult = session.getFile(pubspecFile.path); + if (fileResult is! FileResult) { + return errorFixesList; + } + + final analysisOptions = fileResult.analysisOptions; final errors = validatePubspec( contents: node, source: pubspecFile.createSource(), @@ -257,6 +268,7 @@ error.errorCode: ${error.errorCode} isMacroAugmentation: false, isPart: false, errors: errors, + analysisOptions: analysisOptions, ); var serverError = newAnalysisError_fromEngine(result, error); var errorFixes = AnalysisErrorFixes(serverError); diff --git a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart index e88bad5ccc2..f73ecc1c162 100644 --- a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart +++ b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart @@ -11,6 +11,7 @@ import 'package:analysis_server/src/lsp/lsp_analysis_server.dart'; import 'package:analysis_server/src/lsp/mapping.dart'; import 'package:analysis_server/src/protocol_server.dart' as protocol; import 'package:analysis_server/src/request_handler_mixin.dart'; +import 'package:analyzer/dart/analysis/analysis_options.dart'; import 'package:analyzer/dart/analysis/session.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/file_system/file_system.dart'; @@ -36,6 +37,8 @@ abstract class AbstractCodeActionsProducer final bool Function(CodeActionKind?) shouldIncludeKind; final LspClientCapabilities capabilities; + final AnalysisOptions analysisOptions; + @override final LspAnalysisServer server; @@ -47,6 +50,7 @@ abstract class AbstractCodeActionsProducer required this.length, required this.shouldIncludeKind, required this.capabilities, + required this.analysisOptions, }); String get name; @@ -131,16 +135,18 @@ abstract class AbstractCodeActionsProducer engine.ErrorsResultImpl createResult( AnalysisSession session, LineInfo lineInfo, List errors) { return engine.ErrorsResultImpl( - session: session, - file: file, - content: file.readAsStringSync(), - uri: server.uriConverter.toClientUri(path), - lineInfo: lineInfo, - isAugmentation: false, - isLibrary: true, - isMacroAugmentation: false, - isPart: false, - errors: errors); + session: session, + file: file, + content: file.readAsStringSync(), + uri: server.uriConverter.toClientUri(path), + lineInfo: lineInfo, + isAugmentation: false, + isLibrary: true, + isMacroAugmentation: false, + isPart: false, + errors: errors, + analysisOptions: analysisOptions, + ); } Future> getAssistActions(); diff --git a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/analysis_options.dart b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/analysis_options.dart index 6d79e032447..a866f271d15 100644 --- a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/analysis_options.dart +++ b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/analysis_options.dart @@ -24,6 +24,7 @@ class AnalysisOptionsCodeActionsProducer extends AbstractCodeActionsProducer { required super.length, required super.shouldIncludeKind, required super.capabilities, + required super.analysisOptions, }); @override diff --git a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/dart.dart b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/dart.dart index 76f21d78d2d..f88abc7612f 100644 --- a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/dart.dart +++ b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/dart.dart @@ -8,7 +8,8 @@ import 'package:analysis_server/lsp_protocol/protocol.dart'; import 'package:analysis_server/src/lsp/constants.dart'; import 'package:analysis_server/src/lsp/handlers/code_actions/abstract_code_actions_producer.dart'; import 'package:analysis_server/src/lsp/mapping.dart'; -import 'package:analysis_server/src/protocol_server.dart' hide Position; +import 'package:analysis_server/src/protocol_server.dart' + hide AnalysisOptions, Position; import 'package:analysis_server/src/services/correction/assist.dart'; import 'package:analysis_server/src/services/correction/assist_internal.dart'; import 'package:analysis_server/src/services/correction/change_workspace.dart'; @@ -44,6 +45,7 @@ class DartCodeActionsProducer extends AbstractCodeActionsProducer { required super.length, required super.shouldIncludeKind, required super.capabilities, + required super.analysisOptions, required this.triggerKind, }); diff --git a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/plugins.dart b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/plugins.dart index 77c61539d92..0b08ce0e59a 100644 --- a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/plugins.dart +++ b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/plugins.dart @@ -25,6 +25,7 @@ class PluginCodeActionsProducer extends AbstractCodeActionsProducer { required super.length, required super.shouldIncludeKind, required super.capabilities, + required super.analysisOptions, }) : driver = server.getAnalysisDriver(file.path); @override diff --git a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/pubspec.dart b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/pubspec.dart index 5866263b227..8ce8175e703 100644 --- a/pkg/analysis_server/lib/src/lsp/handlers/code_actions/pubspec.dart +++ b/pkg/analysis_server/lib/src/lsp/handlers/code_actions/pubspec.dart @@ -21,6 +21,7 @@ class PubspecCodeActionsProducer extends AbstractCodeActionsProducer { required super.length, required super.shouldIncludeKind, required super.capabilities, + required super.analysisOptions, }); @override @@ -54,9 +55,7 @@ class PubspecCodeActionsProducer extends AbstractCodeActionsProducer { contents: node, source: pubspecFile.createSource(), provider: resourceProvider, - analysisOptions: server.contextManager - .getContextFor(path) - ?.getAnalysisOptionsForFile(pubspecFile), + analysisOptions: analysisOptions, ); final codeActions = []; diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart index 0653cfe2e6c..49047e6823b 100644 --- a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart +++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart @@ -14,6 +14,8 @@ import 'package:analysis_server/src/lsp/handlers/code_actions/pubspec.dart'; import 'package:analysis_server/src/lsp/handlers/handlers.dart'; import 'package:analysis_server/src/lsp/mapping.dart'; import 'package:analysis_server/src/lsp/registration/feature_registration.dart'; +import 'package:analyzer/dart/analysis/results.dart'; +import 'package:analyzer/src/clients/build_resolvers/build_resolvers.dart'; import 'package:analyzer/src/util/file_paths.dart' as file_paths; import 'package:collection/collection.dart' show groupBy; @@ -141,6 +143,17 @@ class CodeActionHandler final includeQuickFixes = shouldIncludeAnyOfKind(CodeActionKind.QuickFix); final includeRefactors = shouldIncludeAnyOfKind(CodeActionKind.Refactor); + Future getOptions() async { + if (unit != null) return unit.analysisOptions; + var session = await server.getAnalysisSession(unitPath); + var fileResult = session?.getFile(unitPath); + if (fileResult is FileResult) return fileResult.analysisOptions; + // Default to empty options. + return AnalysisOptionsImpl(); + } + + var analysisOptions = await getOptions(); + final actionComputers = [ if (isDart && libraryResult != null && unit != null) DartCodeActionsProducer( @@ -156,6 +169,7 @@ class CodeActionHandler shouldIncludeKind: shouldIncludeKind, capabilities: capabilities, triggerKind: params.context.triggerKind, + analysisOptions: analysisOptions, ), if (isPubspec) PubspecCodeActionsProducer( @@ -167,6 +181,7 @@ class CodeActionHandler length: length, shouldIncludeKind: shouldIncludeKind, capabilities: capabilities, + analysisOptions: analysisOptions, ), if (isAnalysisOptions) AnalysisOptionsCodeActionsProducer( @@ -178,6 +193,7 @@ class CodeActionHandler length: length, shouldIncludeKind: shouldIncludeKind, capabilities: capabilities, + analysisOptions: analysisOptions, ), PluginCodeActionsProducer( server, @@ -188,6 +204,7 @@ class CodeActionHandler length: length, shouldIncludeKind: shouldIncludeKind, capabilities: capabilities, + analysisOptions: analysisOptions, ), ]; final sorter = _CodeActionSorter(params.range, shouldIncludeKind); diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart index dad66b078b1..c2d209c5b73 100644 --- a/pkg/analyzer/lib/dart/analysis/results.dart +++ b/pkg/analyzer/lib/dart/analysis/results.dart @@ -2,6 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'package:analyzer/dart/analysis/analysis_options.dart'; import 'package:analyzer/dart/analysis/session.dart'; import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/element/element.dart'; @@ -84,6 +85,9 @@ abstract class ErrorsResult /// /// Clients may not extend, implement or mix-in this class. abstract class FileResult implements SomeFileResult, AnalysisResult { + /// The analysis options for this file. + AnalysisOptions get analysisOptions; + /// The latest read content of [file], the same that was used to compute /// other properties of this result. String get content; diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart index f57e12908ce..4b5aee1de95 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart @@ -1548,6 +1548,7 @@ class AnalysisDriver { isMacroAugmentation: file.isMacroAugmentation, isPart: file.kind is PartFileKind, errors: errors, + analysisOptions: file.analysisOptions, ); } @@ -1843,6 +1844,7 @@ class AnalysisDriver { arguments: [missingUri], ), ], + analysisOptions: file.analysisOptions, ); } diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart index ddc9aafebc2..37900153586 100644 --- a/pkg/analyzer/lib/src/dart/analysis/results.dart +++ b/pkg/analyzer/lib/src/dart/analysis/results.dart @@ -14,6 +14,7 @@ import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/src/dart/analysis/file_state.dart'; import 'package:analyzer/src/dart/element/type_system.dart'; +import 'package:analyzer/src/generated/engine.dart'; abstract class AnalysisResultImpl implements AnalysisResult { @override @@ -72,6 +73,9 @@ class ErrorsResultImpl implements ErrorsResult { @override final String content; + @override + final AnalysisOptions analysisOptions; + ErrorsResultImpl({ required this.session, required this.file, @@ -83,6 +87,7 @@ class ErrorsResultImpl implements ErrorsResult { required this.isMacroAugmentation, required this.isPart, required this.errors, + required this.analysisOptions, }); @override @@ -116,6 +121,9 @@ class FileResultImpl extends AnalysisResultImpl implements FileResult { isLibrary = fileState.kind is LibraryFileKind, isPart = fileState.kind is PartFileKind; + @override + AnalysisOptions get analysisOptions => fileState.analysisOptions; + @override File get file => fileState.resource; diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart index f9277b84b95..d91d1fdd162 100644 --- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart +++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart @@ -361,6 +361,7 @@ class FileResolver { isMacroAugmentation: file.isMacroAugmentation, isPart: file.kind is PartFileKind, errors: errors, + analysisOptions: file.analysisOptions, ); }); } diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart index 517d2beecfe..ec92c42b7e4 100644 --- a/pkg/analyzer_cli/lib/src/driver.dart +++ b/pkg/analyzer_cli/lib/src/driver.dart @@ -5,6 +5,7 @@ import 'dart:io' as io; import 'package:analyzer/dart/analysis/context_root.dart'; +import 'package:analyzer/dart/analysis/results.dart'; import 'package:analyzer/dart/sdk/build_sdk_summary.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/file_system/file_system.dart'; @@ -241,8 +242,9 @@ class Driver implements CommandLineStarter { var pathContext = resourceProvider.pathContext; for (var path in filesToAnalyze) { if (file_paths.isAnalysisOptionsYaml(pathContext, path)) { - var file = resourceProvider.getFile(path); - var analysisOptions = analysisDriver.getAnalysisOptionsForFile(file); + var fileResult = analysisDriver.currentSession.getFile(path); + if (fileResult is! FileResult) continue; + var file = fileResult.file; var content = file.readAsStringSync(); var lineInfo = LineInfo.fromContent(content); var contextRoot = @@ -258,6 +260,7 @@ class Driver implements CommandLineStarter { contextRoot.root.path, sdkVersionConstraint, ); + var analysisOptions = fileResult.analysisOptions; await formatter.formatErrors([ ErrorsResultImpl( session: analysisDriver.currentSession, @@ -270,6 +273,7 @@ class Driver implements CommandLineStarter { isMacroAugmentation: false, isPart: false, errors: errors, + analysisOptions: analysisOptions, ) ]); for (var error in errors) { @@ -315,6 +319,7 @@ class Driver implements CommandLineStarter { isMacroAugmentation: false, isPart: false, errors: errors, + analysisOptions: analysisOptions, ), ]); } @@ -343,6 +348,7 @@ class Driver implements CommandLineStarter { isLibrary: true, isPart: false, errors: errors, + analysisOptions: analysisOptions, ), ]); for (var error in errors) { diff --git a/pkg/analyzer_cli/test/reporter_test.dart b/pkg/analyzer_cli/test/reporter_test.dart index 8fb4c080852..6bdd4327b4f 100644 --- a/pkg/analyzer_cli/test/reporter_test.dart +++ b/pkg/analyzer_cli/test/reporter_test.dart @@ -7,6 +7,7 @@ import 'package:analyzer/error/error.dart'; import 'package:analyzer/file_system/memory_file_system.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/src/dart/analysis/results.dart'; +import 'package:analyzer/src/generated/engine.dart'; import 'package:analyzer_cli/src/ansi.dart' as ansi; import 'package:analyzer_cli/src/error_formatter.dart'; import 'package:test/test.dart' hide ErrorFormatter; @@ -123,6 +124,7 @@ ErrorsResultImpl mockResult(ErrorType type, ErrorSeverity severity) { isMacroAugmentation: false, isPart: false, errors: [error], + analysisOptions: AnalysisOptionsImpl(), ); }