blob: 75946318bdb47d5835bac2e5963721ba9e969c38 [file] [log] [blame]
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// 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:async';
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
import 'package:analysis_server/lsp_protocol/protocol_special.dart';
import 'package:analysis_server/src/lsp/constants.dart';
import 'package:analysis_server/src/lsp/handlers/custom/handler_diagnostic_server.dart';
import 'package:analysis_server/src/lsp/handlers/handler_code_actions.dart';
import 'package:analysis_server/src/lsp/handlers/handler_completion.dart';
import 'package:analysis_server/src/lsp/handlers/handler_definition.dart';
import 'package:analysis_server/src/lsp/handlers/handler_document_highlights.dart';
import 'package:analysis_server/src/lsp/handlers/handler_document_symbols.dart';
import 'package:analysis_server/src/lsp/handlers/handler_execute_command.dart';
import 'package:analysis_server/src/lsp/handlers/handler_folding.dart';
import 'package:analysis_server/src/lsp/handlers/handler_format_on_type.dart';
import 'package:analysis_server/src/lsp/handlers/handler_formatting.dart';
import 'package:analysis_server/src/lsp/handlers/handler_hover.dart';
import 'package:analysis_server/src/lsp/handlers/handler_initialize.dart';
import 'package:analysis_server/src/lsp/handlers/handler_initialized.dart';
import 'package:analysis_server/src/lsp/handlers/handler_references.dart';
import 'package:analysis_server/src/lsp/handlers/handler_rename.dart';
import 'package:analysis_server/src/lsp/handlers/handler_signature_help.dart';
import 'package:analysis_server/src/lsp/handlers/handler_text_document_changes.dart';
import 'package:analysis_server/src/lsp/handlers/handler_change_workspace_folders.dart';
import 'package:analysis_server/src/lsp/handlers/handler_workspace_symbols.dart';
import 'package:analysis_server/src/lsp/handlers/handlers.dart';
import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
/// The server moves to this state when a critical unrecoverrable error (for
/// example, inconsistent document state between server/client) occurs and will
/// reject all messages.
class FailureStateMessageHandler extends ServerStateMessageHandler {
FailureStateMessageHandler(LspAnalysisServer server) : super(server);
@override
FutureOr<ErrorOr<Object>> handleUnknownMessage(IncomingMessage message) {
return failure(
ErrorCodes.InternalError,
'An unrecoverable error occurred and the server cannot process messages',
null);
}
}
class InitializedStateMessageHandler extends ServerStateMessageHandler {
InitializedStateMessageHandler(LspAnalysisServer server) : super(server) {
reject(Method.initialize, ServerErrorCodes.ServerAlreadyInitialized,
'Server already initialized');
reject(Method.initialized, ServerErrorCodes.ServerAlreadyInitialized,
'Server already initialized');
registerHandler(new TextDocumentOpenHandler(server));
registerHandler(new TextDocumentChangeHandler(server));
registerHandler(new TextDocumentCloseHandler(server));
registerHandler(new HoverHandler(server));
registerHandler(new CompletionHandler(server));
registerHandler(new SignatureHelpHandler(server));
registerHandler(new DefinitionHandler(server));
registerHandler(new ReferencesHandler(server));
registerHandler(new FormattingHandler(server));
registerHandler(new FormatOnTypeHandler(server));
registerHandler(new DocumentHighlightsHandler(server));
registerHandler(new DocumentSymbolHandler(server));
registerHandler(new CodeActionHandler(server));
registerHandler(new ExecuteCommandHandler(server));
registerHandler(new WorkspaceFoldersHandler(server));
registerHandler(new PrepareRenameHandler(server));
registerHandler(new RenameHandler(server));
registerHandler(new FoldingHandler(server));
registerHandler(new DiagnosticServerHandler(server));
registerHandler(new WorkspaceSymbolHandler(server));
}
}
class InitializingStateMessageHandler extends ServerStateMessageHandler {
InitializingStateMessageHandler(
LspAnalysisServer server, List<String> openWorkspacePaths)
: super(server) {
reject(Method.initialize, ServerErrorCodes.ServerAlreadyInitialized,
'Server already initialized');
registerHandler(new IntializedMessageHandler(server, openWorkspacePaths));
}
@override
ErrorOr<void> handleUnknownMessage(IncomingMessage message) {
// Silently drop non-requests.
if (message is! RequestMessage) {
return success();
}
return failure(
ErrorCodes.ServerNotInitialized,
'Unable to handle ${message.method} before the server is initialized '
'and the client has sent the initialized notification');
}
}
class UninitializedStateMessageHandler extends ServerStateMessageHandler {
UninitializedStateMessageHandler(LspAnalysisServer server) : super(server) {
registerHandler(new InitializeMessageHandler(server));
}
@override
FutureOr<ErrorOr<Object>> handleUnknownMessage(IncomingMessage message) {
// Silently drop non-requests.
if (message is! RequestMessage) {
return success();
}
return failure(ErrorCodes.ServerNotInitialized,
'Unable to handle ${message.method} before client has sent initialize request');
}
}