mirror of
https://github.com/dart-lang/sdk
synced 2024-10-08 16:54:24 +00:00
Regenerate code from v3.15 LSP spec
Commit v3.15 of LSP spec + regen generated code Change-Id: Ic0823063791900f347e1ff1f2242a6e4e6ed8ca6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/153778 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
parent
d86fa966a9
commit
6db0396c83
File diff suppressed because it is too large
Load diff
|
@ -89,7 +89,7 @@ class CodeActionHandler extends MessageHandler<CodeActionParams,
|
|||
) {
|
||||
return clientSupportsLiteralCodeActions
|
||||
? Either2<Command, CodeAction>.t2(
|
||||
CodeAction(command.title, kind, null, null, command),
|
||||
CodeAction(command.title, kind, null, false, null, command),
|
||||
)
|
||||
: Either2<Command, CodeAction>.t1(command);
|
||||
}
|
||||
|
@ -103,6 +103,7 @@ class CodeActionHandler extends MessageHandler<CodeActionParams,
|
|||
assist.change.message,
|
||||
toCodeActionKind(assist.change.id, CodeActionKind.Refactor),
|
||||
const [],
|
||||
false,
|
||||
createWorkspaceEdit(server, assist.change.edits),
|
||||
null,
|
||||
);
|
||||
|
@ -117,6 +118,7 @@ class CodeActionHandler extends MessageHandler<CodeActionParams,
|
|||
fix.change.message,
|
||||
toCodeActionKind(fix.change.id, CodeActionKind.QuickFix),
|
||||
[diagnostic],
|
||||
false,
|
||||
createWorkspaceEdit(server, fix.change.edits),
|
||||
null,
|
||||
);
|
||||
|
@ -141,6 +143,7 @@ class CodeActionHandler extends MessageHandler<CodeActionParams,
|
|||
first.kind,
|
||||
// Merge diagnostics from all of the CodeActions.
|
||||
groups[edit].expand((r) => r.diagnostics).toList(),
|
||||
false,
|
||||
first.edit,
|
||||
first.command);
|
||||
}).toList();
|
||||
|
|
|
@ -154,7 +154,7 @@ class CompletionHandler
|
|||
'$name/$declaringUri';
|
||||
|
||||
Future<ErrorOr<List<CompletionItem>>> _getPluginResults(
|
||||
TextDocumentClientCapabilitiesCompletion completionCapabilities,
|
||||
CompletionClientCapabilities completionCapabilities,
|
||||
HashSet<CompletionItemKind> clientSupportedCompletionKinds,
|
||||
LineInfo lineInfo,
|
||||
String path,
|
||||
|
@ -177,7 +177,7 @@ class CompletionHandler
|
|||
}
|
||||
|
||||
Future<ErrorOr<List<CompletionItem>>> _getServerItems(
|
||||
TextDocumentClientCapabilitiesCompletion completionCapabilities,
|
||||
CompletionClientCapabilities completionCapabilities,
|
||||
HashSet<CompletionItemKind> clientSupportedCompletionKinds,
|
||||
bool includeSuggestionSets,
|
||||
ResolvedUnitResult unit,
|
||||
|
@ -340,7 +340,7 @@ class CompletionHandler
|
|||
}
|
||||
|
||||
Iterable<CompletionItem> _pluginResultsToItems(
|
||||
TextDocumentClientCapabilitiesCompletion completionCapabilities,
|
||||
CompletionClientCapabilities completionCapabilities,
|
||||
HashSet<CompletionItemKind> clientSupportedCompletionKinds,
|
||||
LineInfo lineInfo,
|
||||
List<plugin.CompletionGetSuggestionsResult> pluginResults,
|
||||
|
|
|
@ -148,11 +148,15 @@ class CompletionResolveHandler
|
|||
return success(CompletionItem(
|
||||
item.label,
|
||||
item.kind,
|
||||
null, // TODO(dantup): CompletionItemTags (eg. deprecated)
|
||||
data.displayUri != null && thisFilesChanges.isNotEmpty
|
||||
? "Auto import from '${data.displayUri}'\n\n${item.detail ?? ''}"
|
||||
.trim()
|
||||
: item.detail,
|
||||
documentation,
|
||||
// The deprecated field is deprecated, but we should still supply it
|
||||
// for clients that have not adopted CompletionItemTags.
|
||||
// ignore: deprecated_member_use_from_same_package
|
||||
item.deprecated,
|
||||
item.preselect,
|
||||
item.sortText,
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
// 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 'dart:io';
|
||||
|
||||
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
|
||||
import 'package:analysis_server/lsp_protocol/protocol_special.dart';
|
||||
import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
|
||||
|
@ -55,6 +57,18 @@ class InitializeMessageHandler
|
|||
|
||||
server.capabilities = server.capabilitiesComputer
|
||||
.computeServerCapabilities(params.capabilities);
|
||||
return success(InitializeResult(server.capabilities));
|
||||
|
||||
var sdkVersion = Platform.version;
|
||||
if (sdkVersion.contains(' ')) {
|
||||
sdkVersion = sdkVersion.substring(0, sdkVersion.indexOf(' '));
|
||||
}
|
||||
|
||||
return success(InitializeResult(
|
||||
server.capabilities,
|
||||
InitializeResultServerInfo(
|
||||
'Dart SDK LSP Analysis Server',
|
||||
sdkVersion,
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -377,7 +377,8 @@ class LspAnalysisServer extends AbstractAnalysisServer {
|
|||
}
|
||||
|
||||
void publishDiagnostics(String path, List<Diagnostic> errors) {
|
||||
final params = PublishDiagnosticsParams(Uri.file(path).toString(), errors);
|
||||
final params =
|
||||
PublishDiagnosticsParams(Uri.file(path).toString(), null, errors);
|
||||
final message = NotificationMessage(
|
||||
Method.textDocument_publishDiagnostics,
|
||||
params,
|
||||
|
|
|
@ -45,10 +45,11 @@ class LspSocketServer implements AbstractSocketServer {
|
|||
/// given serverChannel.
|
||||
void createAnalysisServer(LspServerCommunicationChannel serverChannel) {
|
||||
if (analysisServer != null) {
|
||||
ResponseError error = ResponseError<void>(
|
||||
ServerErrorCodes.ServerAlreadyStarted,
|
||||
'Server already started',
|
||||
null);
|
||||
final error = ResponseError(
|
||||
ServerErrorCodes.ServerAlreadyStarted,
|
||||
'Server already started',
|
||||
null,
|
||||
);
|
||||
serverChannel.sendNotification(NotificationMessage(
|
||||
Method.window_showMessage,
|
||||
ShowMessageParams(MessageType.Error, error.message),
|
||||
|
|
|
@ -175,7 +175,7 @@ lsp.SymbolKind declarationKindToSymbolKind(
|
|||
}
|
||||
|
||||
lsp.CompletionItem declarationToCompletionItem(
|
||||
lsp.TextDocumentClientCapabilitiesCompletion completionCapabilities,
|
||||
lsp.CompletionClientCapabilities completionCapabilities,
|
||||
HashSet<lsp.CompletionItemKind> supportedCompletionItemKinds,
|
||||
String file,
|
||||
int offset,
|
||||
|
@ -243,6 +243,7 @@ lsp.CompletionItem declarationToCompletionItem(
|
|||
return lsp.CompletionItem(
|
||||
label,
|
||||
completionKind,
|
||||
null, // TODO(dantup): CompletionItemTags
|
||||
getDeclarationCompletionDetail(declaration, completionKind, useDeprecated),
|
||||
null, // documentation - will be added during resolve.
|
||||
useDeprecated && declaration.isDeprecated ? true : null,
|
||||
|
@ -573,6 +574,7 @@ lsp.Diagnostic pluginToDiagnostic(
|
|||
error.code,
|
||||
languageSourceName,
|
||||
message,
|
||||
null, // TODO(dantup): DiagnosticTags
|
||||
relatedInformation,
|
||||
);
|
||||
}
|
||||
|
@ -692,7 +694,7 @@ CodeActionKind toCodeActionKind(String id, lsp.CodeActionKind fallback) {
|
|||
}
|
||||
|
||||
lsp.CompletionItem toCompletionItem(
|
||||
lsp.TextDocumentClientCapabilitiesCompletion completionCapabilities,
|
||||
lsp.CompletionClientCapabilities completionCapabilities,
|
||||
HashSet<lsp.CompletionItemKind> supportedCompletionItemKinds,
|
||||
server.LineInfo lineInfo,
|
||||
server.CompletionSuggestion suggestion,
|
||||
|
@ -749,6 +751,7 @@ lsp.CompletionItem toCompletionItem(
|
|||
return lsp.CompletionItem(
|
||||
label,
|
||||
completionKind,
|
||||
null, // TODO(dantup): CompletionItemTags
|
||||
getCompletionDetail(suggestion, completionKind, useDeprecated),
|
||||
asStringOrMarkupContent(formats, cleanDartdoc(suggestion.docComplete)),
|
||||
useDeprecated && suggestion.isDeprecated ? true : null,
|
||||
|
@ -801,6 +804,7 @@ lsp.Diagnostic toDiagnostic(
|
|||
errorCode.name.toLowerCase(),
|
||||
languageSourceName,
|
||||
message,
|
||||
null, // TODO(dantup): DiagnosticTags
|
||||
relatedInformation,
|
||||
);
|
||||
}
|
||||
|
@ -1060,7 +1064,7 @@ lsp.TextEdit toTextEdit(server.LineInfo lineInfo, server.SourceEdit edit) {
|
|||
}
|
||||
|
||||
lsp.WorkspaceEdit toWorkspaceEdit(
|
||||
lsp.WorkspaceClientCapabilities capabilities,
|
||||
lsp.ClientCapabilitiesWorkspace capabilities,
|
||||
List<FileEditInformation> edits,
|
||||
) {
|
||||
final clientSupportsTextDocumentEdits =
|
||||
|
|
|
@ -32,8 +32,8 @@ class LspNotificationManager extends AbstractNotificationManager {
|
|||
.map((error) => pluginToDiagnostic(server.getLineInfo, error))
|
||||
.toList();
|
||||
|
||||
final params =
|
||||
PublishDiagnosticsParams(Uri.file(filePath).toString(), diagnostics);
|
||||
final params = PublishDiagnosticsParams(
|
||||
Uri.file(filePath).toString(), null, diagnostics);
|
||||
final message = NotificationMessage(
|
||||
Method.textDocument_publishDiagnostics,
|
||||
params,
|
||||
|
|
|
@ -128,45 +128,65 @@ class ServerCapabilitiesComputer {
|
|||
false,
|
||||
null,
|
||||
)),
|
||||
dynamicRegistrations.hover ? null : true, // hoverProvider
|
||||
dynamicRegistrations.completion
|
||||
? null
|
||||
: CompletionOptions(
|
||||
true, // resolveProvider
|
||||
dartCompletionTriggerCharacters,
|
||||
),
|
||||
null, // allCommitCharacters
|
||||
true, // resolveProvider
|
||||
null, // workDoneProgress
|
||||
), // completionProvider
|
||||
dynamicRegistrations.hover
|
||||
? null
|
||||
: Either2<bool, HoverOptions>.t1(true), // hoverProvider
|
||||
dynamicRegistrations.signatureHelp
|
||||
? null
|
||||
: SignatureHelpOptions(
|
||||
dartSignatureHelpTriggerCharacters,
|
||||
null, // retriggerCharacters
|
||||
null, // workDoneProgress
|
||||
),
|
||||
dynamicRegistrations.definition ? null : true, // definitionProvider
|
||||
null, // declarationProvider
|
||||
dynamicRegistrations.definition
|
||||
? null
|
||||
: Either2<bool, DefinitionOptions>.t1(true), // definitionProvider
|
||||
null,
|
||||
dynamicRegistrations.implementation
|
||||
? null
|
||||
: true, // implementationProvider
|
||||
dynamicRegistrations.references ? null : true, // referencesProvider
|
||||
: Either3<bool, ImplementationOptions,
|
||||
ImplementationRegistrationOptions>.t1(
|
||||
true,
|
||||
), // implementationProvider
|
||||
dynamicRegistrations.references
|
||||
? null
|
||||
: Either2<bool, ReferenceOptions>.t1(true), // referencesProvider
|
||||
dynamicRegistrations.documentHighlights
|
||||
? null
|
||||
: true, // documentHighlightProvider
|
||||
: Either2<bool, DocumentHighlightOptions>.t1(
|
||||
true), // documentHighlightProvider
|
||||
dynamicRegistrations.documentSymbol
|
||||
? null
|
||||
: true, // documentSymbolProvider
|
||||
true, // workspaceSymbolProvider
|
||||
: Either2<bool, DocumentSymbolOptions>.t1(
|
||||
true), // documentSymbolProvider
|
||||
// "The `CodeActionOptions` return type is only valid if the client
|
||||
// signals code action literal support via the property
|
||||
// `textDocument.codeAction.codeActionLiteralSupport`."
|
||||
dynamicRegistrations.codeActions
|
||||
? null
|
||||
: codeActionLiteralSupport != null
|
||||
? Either2<bool, CodeActionOptions>.t2(
|
||||
CodeActionOptions(DartCodeActionKind.serverSupportedKinds))
|
||||
? Either2<bool, CodeActionOptions>.t2(CodeActionOptions(
|
||||
DartCodeActionKind.serverSupportedKinds,
|
||||
null, // workDoneProgress
|
||||
))
|
||||
: Either2<bool, CodeActionOptions>.t1(true),
|
||||
null,
|
||||
null, // codeLensProvider
|
||||
null, // documentLinkProvider
|
||||
null, // colorProvider
|
||||
dynamicRegistrations.formatting
|
||||
? null
|
||||
: enableFormatter, // documentFormattingProvider
|
||||
false, // documentRangeFormattingProvider
|
||||
: Either2<bool, DocumentFormattingOptions>.t1(
|
||||
enableFormatter), // documentFormattingProvider
|
||||
null, // documentRangeFormattingProvider
|
||||
dynamicRegistrations.typeFormatting
|
||||
? null
|
||||
: enableFormatter
|
||||
|
@ -177,15 +197,24 @@ class ServerCapabilitiesComputer {
|
|||
dynamicRegistrations.rename
|
||||
? null
|
||||
: renameOptionsSupport
|
||||
? Either2<bool, RenameOptions>.t2(RenameOptions(true))
|
||||
? Either2<bool, RenameOptions>.t2(RenameOptions(true, null))
|
||||
: Either2<bool, RenameOptions>.t1(true),
|
||||
null,
|
||||
null,
|
||||
dynamicRegistrations.folding ? null : true, // foldingRangeProvider
|
||||
null, // declarationProvider
|
||||
ExecuteCommandOptions(Commands.serverSupportedCommands),
|
||||
ServerCapabilitiesWorkspace(
|
||||
ServerCapabilitiesWorkspaceFolders(true, true)),
|
||||
dynamicRegistrations.folding
|
||||
? null
|
||||
: Either3<bool, FoldingRangeOptions,
|
||||
FoldingRangeRegistrationOptions>.t1(
|
||||
true,
|
||||
),
|
||||
ExecuteCommandOptions(
|
||||
Commands.serverSupportedCommands,
|
||||
null, // workDoneProgress
|
||||
),
|
||||
null, // selectionRangeProvider
|
||||
true, // workspaceSymbolProvider
|
||||
ServerCapabilitiesWorkspace(WorkspaceFoldersServerCapabilities(
|
||||
true,
|
||||
Either2<String, bool>.t2(true),
|
||||
)),
|
||||
null);
|
||||
}
|
||||
|
||||
|
@ -257,10 +286,11 @@ class ServerCapabilitiesComputer {
|
|||
dynamicRegistrations.completion,
|
||||
Method.textDocument_completion,
|
||||
CompletionRegistrationOptions(
|
||||
allTypes,
|
||||
dartCompletionTriggerCharacters,
|
||||
null,
|
||||
true,
|
||||
allTypes,
|
||||
null,
|
||||
),
|
||||
);
|
||||
register(
|
||||
|
@ -272,7 +302,11 @@ class ServerCapabilitiesComputer {
|
|||
dynamicRegistrations.signatureHelp,
|
||||
Method.textDocument_signatureHelp,
|
||||
SignatureHelpRegistrationOptions(
|
||||
dartSignatureHelpTriggerCharacters, allTypes),
|
||||
allTypes,
|
||||
dartSignatureHelpTriggerCharacters,
|
||||
null,
|
||||
null,
|
||||
),
|
||||
);
|
||||
register(
|
||||
dynamicRegistrations.references,
|
||||
|
@ -298,9 +332,9 @@ class ServerCapabilitiesComputer {
|
|||
enableFormatter && dynamicRegistrations.typeFormatting,
|
||||
Method.textDocument_onTypeFormatting,
|
||||
DocumentOnTypeFormattingRegistrationOptions(
|
||||
[dartFiles], // This one is currently Dart-specific
|
||||
dartTypeFormattingCharacters.first,
|
||||
dartTypeFormattingCharacters.skip(1).toList(),
|
||||
[dartFiles], // This one is currently Dart-specific
|
||||
),
|
||||
);
|
||||
register(
|
||||
|
@ -317,12 +351,15 @@ class ServerCapabilitiesComputer {
|
|||
dynamicRegistrations.codeActions,
|
||||
Method.textDocument_codeAction,
|
||||
CodeActionRegistrationOptions(
|
||||
allTypes, DartCodeActionKind.serverSupportedKinds),
|
||||
allTypes,
|
||||
DartCodeActionKind.serverSupportedKinds,
|
||||
null,
|
||||
),
|
||||
);
|
||||
register(
|
||||
dynamicRegistrations.rename,
|
||||
Method.textDocument_rename,
|
||||
RenameRegistrationOptions(true, allTypes),
|
||||
RenameRegistrationOptions(allTypes, true, null),
|
||||
);
|
||||
register(
|
||||
dynamicRegistrations.folding,
|
||||
|
|
|
@ -17,34 +17,50 @@ final DartFormatter formatter = DartFormatter();
|
|||
/// changes into account, this will also apply the edits to [oldContent].
|
||||
ErrorOr<Pair<String, List<plugin.SourceEdit>>> applyAndConvertEditsToServer(
|
||||
String oldContent,
|
||||
List<TextDocumentContentChangeEvent> changes, {
|
||||
List<
|
||||
Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>>
|
||||
changes, {
|
||||
failureIsCritical = false,
|
||||
}) {
|
||||
var newContent = oldContent;
|
||||
final serverEdits = <server.SourceEdit>[];
|
||||
|
||||
for (var change in changes) {
|
||||
if (change.range == null && change.rangeLength == null) {
|
||||
serverEdits
|
||||
..clear()
|
||||
..add(server.SourceEdit(0, newContent.length, change.text));
|
||||
newContent = change.text;
|
||||
} else {
|
||||
final lines = LineInfo.fromContent(newContent);
|
||||
final offsetStart = toOffset(lines, change.range.start,
|
||||
failureIsCritial: failureIsCritical);
|
||||
final offsetEnd = toOffset(lines, change.range.end,
|
||||
failureIsCritial: failureIsCritical);
|
||||
if (offsetStart.isError) {
|
||||
return ErrorOr.error(offsetStart.error);
|
||||
}
|
||||
if (offsetEnd.isError) {
|
||||
return ErrorOr.error(offsetEnd.error);
|
||||
}
|
||||
newContent = newContent.replaceRange(
|
||||
offsetStart.result, offsetEnd.result, change.text);
|
||||
serverEdits.add(server.SourceEdit(offsetStart.result,
|
||||
offsetEnd.result - offsetStart.result, change.text));
|
||||
// Change is a union that may/may not include a range. If no range
|
||||
// is provided (t2 of the union) the whole document should be replaced.
|
||||
final result = change.map(
|
||||
// TextDocumentContentChangeEvent1
|
||||
// {range, text}
|
||||
(change) {
|
||||
final lines = LineInfo.fromContent(newContent);
|
||||
final offsetStart = toOffset(lines, change.range.start,
|
||||
failureIsCritial: failureIsCritical);
|
||||
final offsetEnd = toOffset(lines, change.range.end,
|
||||
failureIsCritial: failureIsCritical);
|
||||
if (offsetStart.isError) {
|
||||
return ErrorOr.error(offsetStart.error);
|
||||
}
|
||||
if (offsetEnd.isError) {
|
||||
return ErrorOr.error(offsetEnd.error);
|
||||
}
|
||||
newContent = newContent.replaceRange(
|
||||
offsetStart.result, offsetEnd.result, change.text);
|
||||
serverEdits.add(server.SourceEdit(offsetStart.result,
|
||||
offsetEnd.result - offsetStart.result, change.text));
|
||||
},
|
||||
// TextDocumentContentChangeEvent2
|
||||
// {text}
|
||||
(change) {
|
||||
serverEdits
|
||||
..clear()
|
||||
..add(server.SourceEdit(0, newContent.length, change.text));
|
||||
newContent = change.text;
|
||||
},
|
||||
);
|
||||
// If any change fails, immediately return the error.
|
||||
if (result?.isError ?? false) {
|
||||
return ErrorOr.error(result.error);
|
||||
}
|
||||
}
|
||||
return ErrorOr.success(Pair(newContent, serverEdits));
|
||||
|
|
|
@ -36,6 +36,8 @@ main() {
|
|||
null,
|
||||
TextDocumentIdentifier(mainFileUri.toString()),
|
||||
positionFromMarker(content),
|
||||
null,
|
||||
null,
|
||||
),
|
||||
);
|
||||
// And a request to cancel it.
|
||||
|
|
|
@ -292,6 +292,7 @@ class CompletionTest extends AbstractLspAnalysisServerTest {
|
|||
await openFile(mainFileUri, withoutMarkers(content));
|
||||
final res = await getCompletion(mainFileUri, positionFromMarker(content));
|
||||
final item = res.singleWhere((c) => c.label == 'abcdefghij');
|
||||
// ignore: deprecated_member_use_from_same_package
|
||||
expect(item.deprecated, isNull);
|
||||
// If the does not say it supports the deprecated flag, we should show
|
||||
// '(deprecated)' in the details.
|
||||
|
@ -317,6 +318,7 @@ class CompletionTest extends AbstractLspAnalysisServerTest {
|
|||
await openFile(mainFileUri, withoutMarkers(content));
|
||||
final res = await getCompletion(mainFileUri, positionFromMarker(content));
|
||||
final item = res.singleWhere((c) => c.label == 'abcdefghij');
|
||||
// ignore: deprecated_member_use_from_same_package
|
||||
expect(item.deprecated, isTrue);
|
||||
// If the client says it supports the deprecated flag, we should not show
|
||||
// deprecated in the details.
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
|
||||
import 'package:analysis_server/lsp_protocol/protocol_special.dart';
|
||||
import 'package:analysis_server/src/protocol/protocol_internal.dart';
|
||||
import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Position;
|
||||
import 'package:test/test.dart';
|
||||
|
@ -29,16 +30,18 @@ class Bar {
|
|||
Future<void> test_documentChange_notifiesPlugins() async {
|
||||
await _initializeAndOpen();
|
||||
await changeFile(2, mainFileUri, [
|
||||
TextDocumentContentChangeEvent(
|
||||
Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>.t1(TextDocumentContentChangeEvent1(
|
||||
Range(Position(0, 6), Position(0, 9)),
|
||||
0,
|
||||
'Bar',
|
||||
),
|
||||
TextDocumentContentChangeEvent(
|
||||
)),
|
||||
Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>.t1(TextDocumentContentChangeEvent1(
|
||||
Range(Position(1, 21), Position(1, 24)),
|
||||
0,
|
||||
'updated',
|
||||
),
|
||||
)),
|
||||
]);
|
||||
|
||||
final notifiedChanges = pluginManager.analysisUpdateContentParams
|
||||
|
@ -53,16 +56,18 @@ class Bar {
|
|||
Future<void> test_documentChange_updatesOverlay() async {
|
||||
await _initializeAndOpen();
|
||||
await changeFile(2, mainFileUri, [
|
||||
TextDocumentContentChangeEvent(
|
||||
Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>.t1(TextDocumentContentChangeEvent1(
|
||||
Range(Position(0, 6), Position(0, 9)),
|
||||
0,
|
||||
'Bar',
|
||||
),
|
||||
TextDocumentContentChangeEvent(
|
||||
)),
|
||||
Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>.t1(TextDocumentContentChangeEvent1(
|
||||
Range(Position(1, 21), Position(1, 24)),
|
||||
0,
|
||||
'updated',
|
||||
),
|
||||
)),
|
||||
]);
|
||||
|
||||
expect(server.resourceProvider.hasOverlay(mainFilePath), isTrue);
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
|
||||
import 'package:analysis_server/lsp_protocol/protocol_special.dart';
|
||||
import 'package:test/test.dart';
|
||||
import 'package:test_reflective_loader/test_reflective_loader.dart';
|
||||
|
||||
|
@ -26,11 +27,12 @@ class FileModificationTest extends AbstractLspAnalysisServerTest {
|
|||
// to alert the user to something failing.
|
||||
final error = await expectErrorNotification<ShowMessageParams>(() async {
|
||||
await changeFile(222, mainFileUri, [
|
||||
TextDocumentContentChangeEvent(
|
||||
Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>.t1(TextDocumentContentChangeEvent1(
|
||||
Range(Position(999, 999), Position(999, 999)),
|
||||
null,
|
||||
' ',
|
||||
)
|
||||
))
|
||||
]);
|
||||
});
|
||||
|
||||
|
@ -58,11 +60,12 @@ class FileModificationTest extends AbstractLspAnalysisServerTest {
|
|||
await openFile(mainFileUri, initialContent);
|
||||
await changeFile(222, mainFileUri, [
|
||||
// Replace line1:5-1:8 with spaces.
|
||||
TextDocumentContentChangeEvent(
|
||||
Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>.t1(TextDocumentContentChangeEvent1(
|
||||
Range(Position(1, 5), Position(1, 8)),
|
||||
null,
|
||||
' ',
|
||||
)
|
||||
))
|
||||
]);
|
||||
expect(_getOverlay(mainFilePath), equals(expectedUpdatedContent));
|
||||
|
||||
|
@ -74,11 +77,12 @@ class FileModificationTest extends AbstractLspAnalysisServerTest {
|
|||
// It's not valid for a client to send a request to modify a file that it
|
||||
// has not opened, but Visual Studio has done it in the past so we should
|
||||
// ensure it generates an obvious error that the user can understand.
|
||||
final simpleEdit = TextDocumentContentChangeEvent(
|
||||
final simpleEdit = Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>.t1(TextDocumentContentChangeEvent1(
|
||||
Range(Position(1, 1), Position(1, 1)),
|
||||
null,
|
||||
'test',
|
||||
);
|
||||
));
|
||||
await initialize();
|
||||
final notificationParams = await expectErrorNotification<ShowMessageParams>(
|
||||
() => changeFile(222, mainFileUri, [simpleEdit]),
|
||||
|
|
|
@ -45,6 +45,8 @@ class InitializationTest extends AbstractLspAnalysisServerTest {
|
|||
// static registrations for them.
|
||||
// https://github.com/dart-lang/sdk/issues/38490
|
||||
InitializeResult initResult = initResponse.result;
|
||||
expect(initResult.serverInfo.name, 'Dart SDK LSP Analysis Server');
|
||||
expect(initResult.serverInfo.version, isNotNull);
|
||||
expect(initResult.capabilities, isNotNull);
|
||||
expect(initResult.capabilities.textDocumentSync, isNull);
|
||||
|
||||
|
|
|
@ -296,9 +296,10 @@ class RenameTest extends AbstractLspAnalysisServerTest {
|
|||
final request = makeRequest(
|
||||
Method.textDocument_rename,
|
||||
RenameParams(
|
||||
'Object2',
|
||||
TextDocumentIdentifier(mainFileUri.toString()),
|
||||
positionFromMarker(content),
|
||||
'Object2',
|
||||
null,
|
||||
),
|
||||
);
|
||||
final response = await channel.sendRequestToServer(request);
|
||||
|
|
|
@ -166,9 +166,10 @@ mixin ClientCapabilitiesHelperMixin {
|
|||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null);
|
||||
|
||||
final emptyWorkspaceClientCapabilities = WorkspaceClientCapabilities(
|
||||
final emptyWorkspaceClientCapabilities = ClientCapabilitiesWorkspace(
|
||||
null, null, null, null, null, null, null, null);
|
||||
|
||||
TextDocumentClientCapabilities extendTextDocumentCapabilities(
|
||||
|
@ -189,8 +190,8 @@ mixin ClientCapabilitiesHelperMixin {
|
|||
return TextDocumentClientCapabilities.fromJson(json);
|
||||
}
|
||||
|
||||
WorkspaceClientCapabilities extendWorkspaceCapabilities(
|
||||
WorkspaceClientCapabilities source,
|
||||
ClientCapabilitiesWorkspace extendWorkspaceCapabilities(
|
||||
ClientCapabilitiesWorkspace source,
|
||||
Map<String, dynamic> workspaceCapabilities,
|
||||
) {
|
||||
// TODO(dantup): As above - it seems like this round trip should be
|
||||
|
@ -201,7 +202,7 @@ mixin ClientCapabilitiesHelperMixin {
|
|||
json[key] = workspaceCapabilities[key];
|
||||
});
|
||||
}
|
||||
return WorkspaceClientCapabilities.fromJson(json);
|
||||
return ClientCapabilitiesWorkspace.fromJson(json);
|
||||
}
|
||||
|
||||
TextDocumentClientCapabilities withAllSupportedDynamicRegistrations(
|
||||
|
@ -228,8 +229,8 @@ mixin ClientCapabilitiesHelperMixin {
|
|||
});
|
||||
}
|
||||
|
||||
WorkspaceClientCapabilities withApplyEditSupport(
|
||||
WorkspaceClientCapabilities source,
|
||||
ClientCapabilitiesWorkspace withApplyEditSupport(
|
||||
ClientCapabilitiesWorkspace source,
|
||||
) {
|
||||
return extendWorkspaceCapabilities(source, {'applyEdit': true});
|
||||
}
|
||||
|
@ -280,22 +281,22 @@ mixin ClientCapabilitiesHelperMixin {
|
|||
});
|
||||
}
|
||||
|
||||
WorkspaceClientCapabilities withConfigurationSupport(
|
||||
WorkspaceClientCapabilities source,
|
||||
ClientCapabilitiesWorkspace withConfigurationSupport(
|
||||
ClientCapabilitiesWorkspace source,
|
||||
) {
|
||||
return extendWorkspaceCapabilities(source, {'configuration': true});
|
||||
}
|
||||
|
||||
WorkspaceClientCapabilities withDidChangeConfigurationDynamicRegistration(
|
||||
WorkspaceClientCapabilities source,
|
||||
ClientCapabilitiesWorkspace withDidChangeConfigurationDynamicRegistration(
|
||||
ClientCapabilitiesWorkspace source,
|
||||
) {
|
||||
return extendWorkspaceCapabilities(source, {
|
||||
'didChangeConfiguration': {'dynamicRegistration': true}
|
||||
});
|
||||
}
|
||||
|
||||
WorkspaceClientCapabilities withDocumentChangesSupport(
|
||||
WorkspaceClientCapabilities source,
|
||||
ClientCapabilitiesWorkspace withDocumentChangesSupport(
|
||||
ClientCapabilitiesWorkspace source,
|
||||
) {
|
||||
return extendWorkspaceCapabilities(source, {
|
||||
'workspaceEdit': {'documentChanges': true}
|
||||
|
@ -514,7 +515,10 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
Future changeFile(
|
||||
int newVersion,
|
||||
Uri uri,
|
||||
List<TextDocumentContentChangeEvent> changes,
|
||||
List<
|
||||
Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>>
|
||||
changes,
|
||||
) async {
|
||||
var notification = makeNotification(
|
||||
Method.textDocument_didChange,
|
||||
|
@ -553,6 +557,7 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
ExecuteCommandParams(
|
||||
command.command,
|
||||
command.arguments,
|
||||
null,
|
||||
),
|
||||
);
|
||||
return expectSuccessfulResponseTo(request);
|
||||
|
@ -647,7 +652,9 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
Method.textDocument_formatting,
|
||||
DocumentFormattingParams(
|
||||
TextDocumentIdentifier(fileUri),
|
||||
FormattingOptions(2, true), // These currently don't do anything
|
||||
FormattingOptions(
|
||||
2, true, false, false, false), // These currently don't do anything
|
||||
null,
|
||||
),
|
||||
);
|
||||
return expectSuccessfulResponseTo(request);
|
||||
|
@ -658,10 +665,11 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
final request = makeRequest(
|
||||
Method.textDocument_onTypeFormatting,
|
||||
DocumentOnTypeFormattingParams(
|
||||
character,
|
||||
FormattingOptions(
|
||||
2, true, false, false, false), // These currently don't do anything
|
||||
TextDocumentIdentifier(fileUri),
|
||||
pos,
|
||||
character,
|
||||
FormattingOptions(2, true), // These currently don't do anything
|
||||
),
|
||||
);
|
||||
return expectSuccessfulResponseTo(request);
|
||||
|
@ -675,12 +683,15 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
final request = makeRequest(
|
||||
Method.textDocument_codeAction,
|
||||
CodeActionParams(
|
||||
TextDocumentIdentifier(fileUri),
|
||||
range ?? beginningOfDocument,
|
||||
// TODO(dantup): We may need to revise the tests/implementation when
|
||||
// it's clear how we're supposed to handle diagnostics:
|
||||
// https://github.com/Microsoft/language-server-protocol/issues/583
|
||||
CodeActionContext([], kinds)),
|
||||
TextDocumentIdentifier(fileUri),
|
||||
range ?? beginningOfDocument,
|
||||
// TODO(dantup): We may need to revise the tests/implementation when
|
||||
// it's clear how we're supposed to handle diagnostics:
|
||||
// https://github.com/Microsoft/language-server-protocol/issues/583
|
||||
CodeActionContext([], kinds),
|
||||
null,
|
||||
null,
|
||||
),
|
||||
);
|
||||
return expectSuccessfulResponseTo(request);
|
||||
}
|
||||
|
@ -693,6 +704,8 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
context,
|
||||
TextDocumentIdentifier(uri.toString()),
|
||||
pos,
|
||||
null,
|
||||
null,
|
||||
),
|
||||
);
|
||||
return expectSuccessfulResponseTo<List<CompletionItem>>(request);
|
||||
|
@ -734,6 +747,8 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
Method.textDocument_documentSymbol,
|
||||
DocumentSymbolParams(
|
||||
TextDocumentIdentifier(fileUri),
|
||||
null,
|
||||
null,
|
||||
),
|
||||
);
|
||||
return expectSuccessfulResponseTo(request);
|
||||
|
@ -742,7 +757,11 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
Future<List<FoldingRange>> getFoldingRegions(Uri uri) {
|
||||
final request = makeRequest(
|
||||
Method.textDocument_foldingRange,
|
||||
FoldingRangeParams(TextDocumentIdentifier(uri.toString())),
|
||||
FoldingRangeParams(
|
||||
TextDocumentIdentifier(uri.toString()),
|
||||
null,
|
||||
null,
|
||||
),
|
||||
);
|
||||
return expectSuccessfulResponseTo<List<FoldingRange>>(request);
|
||||
}
|
||||
|
@ -781,6 +800,8 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
ReferenceContext(includeDeclarations),
|
||||
TextDocumentIdentifier(uri.toString()),
|
||||
pos,
|
||||
null,
|
||||
null,
|
||||
),
|
||||
);
|
||||
return expectSuccessfulResponseTo<List<Location>>(request);
|
||||
|
@ -814,7 +835,11 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
Future<List<SymbolInformation>> getWorkspaceSymbols(String query) {
|
||||
final request = makeRequest(
|
||||
Method.workspace_symbol,
|
||||
WorkspaceSymbolParams(query),
|
||||
WorkspaceSymbolParams(
|
||||
query,
|
||||
null,
|
||||
null,
|
||||
),
|
||||
);
|
||||
return expectSuccessfulResponseTo(request);
|
||||
}
|
||||
|
@ -872,7 +897,8 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
Uri rootUri,
|
||||
List<Uri> workspaceFolders,
|
||||
TextDocumentClientCapabilities textDocumentCapabilities,
|
||||
WorkspaceClientCapabilities workspaceCapabilities,
|
||||
ClientCapabilitiesWorkspace workspaceCapabilities,
|
||||
ClientCapabilitiesWindow windowCapabilities,
|
||||
Map<String, Object> initializationOptions,
|
||||
bool throwOnFailure = true,
|
||||
}) async {
|
||||
|
@ -884,17 +910,21 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
final request = makeRequest(
|
||||
Method.initialize,
|
||||
InitializeParams(
|
||||
null,
|
||||
null,
|
||||
rootPath,
|
||||
rootUri?.toString(),
|
||||
initializationOptions,
|
||||
ClientCapabilities(
|
||||
workspaceCapabilities,
|
||||
textDocumentCapabilities,
|
||||
windowCapabilities,
|
||||
null,
|
||||
rootPath,
|
||||
rootUri?.toString(),
|
||||
initializationOptions,
|
||||
ClientCapabilities(
|
||||
workspaceCapabilities,
|
||||
textDocumentCapabilities,
|
||||
null,
|
||||
),
|
||||
null,
|
||||
workspaceFolders?.map(toWorkspaceFolder)?.toList()));
|
||||
),
|
||||
null,
|
||||
workspaceFolders?.map(toWorkspaceFolder)?.toList(),
|
||||
null,
|
||||
));
|
||||
final response = await sendRequestToServer(request);
|
||||
expect(response.id, equals(request.id));
|
||||
|
||||
|
@ -922,7 +952,7 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
: TextDocumentIdentifier(uri.toString());
|
||||
final request = makeRequest(
|
||||
Method.textDocument_rename,
|
||||
RenameParams(docIdentifier, pos, newName),
|
||||
RenameParams(newName, docIdentifier, pos, null),
|
||||
);
|
||||
return request;
|
||||
}
|
||||
|
@ -1090,7 +1120,11 @@ mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
|
|||
return changeFile(
|
||||
newVersion,
|
||||
uri,
|
||||
[TextDocumentContentChangeEvent(null, null, content)],
|
||||
[
|
||||
Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>.t2(
|
||||
TextDocumentContentChangeEvent2(content))
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
|
||||
import 'package:analysis_server/lsp_protocol/protocol_special.dart';
|
||||
import 'package:test/test.dart';
|
||||
import 'package:test_reflective_loader/test_reflective_loader.dart';
|
||||
|
||||
|
@ -23,8 +24,10 @@ class ServerTest extends AbstractLspAnalysisServerTest {
|
|||
// client and server are out of sync and we expect the server to shut down.
|
||||
final error = await expectErrorNotification<ShowMessageParams>(() async {
|
||||
await changeFile(222, mainFileUri, [
|
||||
TextDocumentContentChangeEvent(
|
||||
Range(Position(99, 99), Position(99, 99)), null, ' '),
|
||||
Either2<TextDocumentContentChangeEvent1,
|
||||
TextDocumentContentChangeEvent2>.t1(
|
||||
TextDocumentContentChangeEvent1(
|
||||
Range(Position(99, 99), Position(99, 99)), null, ' ')),
|
||||
]);
|
||||
});
|
||||
|
||||
|
|
|
@ -17,10 +17,12 @@ void main() {
|
|||
});
|
||||
|
||||
test('with list fields can be checked for equality', () {
|
||||
final a = TextDocumentClientCapabilitiesCodeActionKind(
|
||||
[CodeActionKind.QuickFix]);
|
||||
final b = TextDocumentClientCapabilitiesCodeActionKind(
|
||||
[CodeActionKind.QuickFix]);
|
||||
final a = CodeActionClientCapabilitiesCodeActionKind(
|
||||
[CodeActionKind.QuickFix],
|
||||
);
|
||||
final b = CodeActionClientCapabilitiesCodeActionKind(
|
||||
[CodeActionKind.QuickFix],
|
||||
);
|
||||
|
||||
expect(a, equals(b));
|
||||
expect(a.hashCode, equals(b.hashCode));
|
||||
|
|
|
@ -47,6 +47,7 @@ void main() {
|
|||
'test_err',
|
||||
'/tmp/source.dart',
|
||||
'err!!',
|
||||
null,
|
||||
[DiagnosticRelatedInformation(location, 'message')],
|
||||
);
|
||||
final output = json.encode(codeAction.toJson());
|
||||
|
@ -244,7 +245,7 @@ void main() {
|
|||
|
||||
test('ResponseMessage does not include a result for an error', () {
|
||||
final id = Either2<num, String>.t1(1);
|
||||
final error = ResponseError<String>(ErrorCodes.ParseError, 'Error', null);
|
||||
final error = ResponseError(ErrorCodes.ParseError, 'Error', null);
|
||||
final resp = ResponseMessage(id, null, error, jsonRpcVersion);
|
||||
final jsonMap = resp.toJson();
|
||||
expect(jsonMap, contains('error'));
|
||||
|
@ -254,7 +255,7 @@ void main() {
|
|||
test('ResponseMessage throws if both result and error are non-null', () {
|
||||
final id = Either2<num, String>.t1(1);
|
||||
final result = 'my result';
|
||||
final error = ResponseError<String>(ErrorCodes.ParseError, 'Error', null);
|
||||
final error = ResponseError(ErrorCodes.ParseError, 'Error', null);
|
||||
final resp = ResponseMessage(id, result, error, jsonRpcVersion);
|
||||
expect(resp.toJson, throwsA(TypeMatcher<String>()));
|
||||
});
|
||||
|
@ -315,11 +316,20 @@ void main() {
|
|||
});
|
||||
|
||||
test('objects with lists can round-trip through to json and back', () {
|
||||
final obj = InitializeParams(1, '!root', null, null,
|
||||
ClientCapabilities(null, null, null), '!trace', [
|
||||
WorkspaceFolder('!uri1', '!name1'),
|
||||
WorkspaceFolder('!uri2', '!name2'),
|
||||
]);
|
||||
final obj = InitializeParams(
|
||||
1,
|
||||
InitializeParamsClientInfo('server name', '1.2.3'),
|
||||
'!root',
|
||||
null,
|
||||
null,
|
||||
ClientCapabilities(null, null, null, null),
|
||||
'!trace',
|
||||
[
|
||||
WorkspaceFolder('!uri1', '!name1'),
|
||||
WorkspaceFolder('!uri2', '!name2'),
|
||||
],
|
||||
null,
|
||||
);
|
||||
final json = jsonEncode(obj);
|
||||
final restoredObj = InitializeParams.fromJson(jsonDecode(json));
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ final Uri specLicenseUri = Uri.parse(
|
|||
/// The URI of the version of the spec to generate from. This should be periodically updated as
|
||||
/// there's no longer a stable URI for the latest published version.
|
||||
final Uri specUri = Uri.parse(
|
||||
'https://raw.githubusercontent.com/microsoft/language-server-protocol/gh-pages/_specifications/specification-3-14.md');
|
||||
'https://raw.githubusercontent.com/microsoft/language-server-protocol/gh-pages/_specifications/specification-3-15.md');
|
||||
|
||||
/// Pattern to extract inline types from the `result: {xx, yy }` notes in the spec.
|
||||
/// Doesn't parse past full stops as some of these have english sentences tagged on
|
||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue