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:
Danny Tuppeny 2020-07-09 17:18:07 +00:00 committed by commit-bot@chromium.org
parent d86fa966a9
commit 6db0396c83
23 changed files with 14040 additions and 5279 deletions

File diff suppressed because it is too large Load diff

View file

@ -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();

View file

@ -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,

View file

@ -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,

View file

@ -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,
),
));
}
}

View file

@ -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,

View file

@ -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),

View file

@ -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 =

View file

@ -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,

View file

@ -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,

View file

@ -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));

View file

@ -36,6 +36,8 @@ main() {
null,
TextDocumentIdentifier(mainFileUri.toString()),
positionFromMarker(content),
null,
null,
),
);
// And a request to cancel it.

View file

@ -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.

View file

@ -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);

View file

@ -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]),

View file

@ -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);

View file

@ -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);

View file

@ -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))
],
);
}

View file

@ -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, ' ')),
]);
});

View file

@ -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));

View file

@ -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));

View file

@ -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