diff --git a/src/ServiceHost/LanguageService/Contracts/Completion.cs b/src/ServiceHost/LanguageService/Contracts/Completion.cs
index 5f26ea96..ef78330d 100644
--- a/src/ServiceHost/LanguageService/Contracts/Completion.cs
+++ b/src/ServiceHost/LanguageService/Contracts/Completion.cs
@@ -4,9 +4,10 @@
//
using System.Diagnostics;
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
+using Microsoft.SqlTools.ServiceLayer.WorkspaceService.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
public class CompletionRequest
{
diff --git a/src/ServiceHost/LanguageService/Contracts/Definition.cs b/src/ServiceHost/LanguageService/Contracts/Definition.cs
index b18845c3..b6a211e6 100644
--- a/src/ServiceHost/LanguageService/Contracts/Definition.cs
+++ b/src/ServiceHost/LanguageService/Contracts/Definition.cs
@@ -3,9 +3,10 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
+using Microsoft.SqlTools.ServiceLayer.WorkspaceService.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
public class DefinitionRequest
{
diff --git a/src/ServiceHost/LanguageService/Contracts/Diagnostics.cs b/src/ServiceHost/LanguageService/Contracts/Diagnostics.cs
index a5472607..c1895bdf 100644
--- a/src/ServiceHost/LanguageService/Contracts/Diagnostics.cs
+++ b/src/ServiceHost/LanguageService/Contracts/Diagnostics.cs
@@ -3,9 +3,10 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
+using Microsoft.SqlTools.ServiceLayer.WorkspaceService.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
public class PublishDiagnosticsNotification
{
diff --git a/src/ServiceHost/LanguageService/Contracts/DocumentHighlight.cs b/src/ServiceHost/LanguageService/Contracts/DocumentHighlight.cs
index 6849ddfb..db459eb4 100644
--- a/src/ServiceHost/LanguageService/Contracts/DocumentHighlight.cs
+++ b/src/ServiceHost/LanguageService/Contracts/DocumentHighlight.cs
@@ -3,9 +3,10 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
+using Microsoft.SqlTools.ServiceLayer.WorkspaceService.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
public enum DocumentHighlightKind
{
diff --git a/src/ServiceHost/LanguageService/Contracts/ExpandAliasRequest.cs b/src/ServiceHost/LanguageService/Contracts/ExpandAliasRequest.cs
index d7f9fde4..7a970db5 100644
--- a/src/ServiceHost/LanguageService/Contracts/ExpandAliasRequest.cs
+++ b/src/ServiceHost/LanguageService/Contracts/ExpandAliasRequest.cs
@@ -3,9 +3,9 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
public class ExpandAliasRequest
{
diff --git a/src/ServiceHost/LanguageService/Contracts/FindModuleRequest.cs b/src/ServiceHost/LanguageService/Contracts/FindModuleRequest.cs
index ab78a158..dff3939c 100644
--- a/src/ServiceHost/LanguageService/Contracts/FindModuleRequest.cs
+++ b/src/ServiceHost/LanguageService/Contracts/FindModuleRequest.cs
@@ -3,10 +3,10 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
using System.Collections.Generic;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
public class FindModuleRequest
{
diff --git a/src/ServiceHost/LanguageService/Contracts/Hover.cs b/src/ServiceHost/LanguageService/Contracts/Hover.cs
index 2e196fba..dd7f05c0 100644
--- a/src/ServiceHost/LanguageService/Contracts/Hover.cs
+++ b/src/ServiceHost/LanguageService/Contracts/Hover.cs
@@ -3,9 +3,10 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
+using Microsoft.SqlTools.ServiceLayer.WorkspaceService.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
public class MarkedString
{
diff --git a/src/ServiceHost/LanguageService/Contracts/InstallModuleRequest.cs b/src/ServiceHost/LanguageService/Contracts/InstallModuleRequest.cs
index b03b8864..361bb60f 100644
--- a/src/ServiceHost/LanguageService/Contracts/InstallModuleRequest.cs
+++ b/src/ServiceHost/LanguageService/Contracts/InstallModuleRequest.cs
@@ -3,9 +3,9 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
class InstallModuleRequest
{
diff --git a/src/ServiceHost/LanguageService/Contracts/References.cs b/src/ServiceHost/LanguageService/Contracts/References.cs
index 25a92b12..d2e12ccd 100644
--- a/src/ServiceHost/LanguageService/Contracts/References.cs
+++ b/src/ServiceHost/LanguageService/Contracts/References.cs
@@ -3,9 +3,10 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
+using Microsoft.SqlTools.ServiceLayer.WorkspaceService.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
public class ReferencesRequest
{
diff --git a/src/ServiceHost/LanguageService/Contracts/ShowOnlineHelpRequest.cs b/src/ServiceHost/LanguageService/Contracts/ShowOnlineHelpRequest.cs
index 8f21fb1b..d77eeafa 100644
--- a/src/ServiceHost/LanguageService/Contracts/ShowOnlineHelpRequest.cs
+++ b/src/ServiceHost/LanguageService/Contracts/ShowOnlineHelpRequest.cs
@@ -3,9 +3,9 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
public class ShowOnlineHelpRequest
{
diff --git a/src/ServiceHost/LanguageService/Contracts/SignatureHelp.cs b/src/ServiceHost/LanguageService/Contracts/SignatureHelp.cs
index 5d4233e3..26e62b21 100644
--- a/src/ServiceHost/LanguageService/Contracts/SignatureHelp.cs
+++ b/src/ServiceHost/LanguageService/Contracts/SignatureHelp.cs
@@ -3,9 +3,10 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
+using Microsoft.SqlTools.ServiceLayer.WorkspaceService.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts
{
public class SignatureHelpRequest
{
diff --git a/src/ServiceHost/LanguageService/LanguageService.cs b/src/ServiceHost/LanguageService/LanguageService.cs
index 3ab77697..51665fbd 100644
--- a/src/ServiceHost/LanguageService/LanguageService.cs
+++ b/src/ServiceHost/LanguageService/LanguageService.cs
@@ -3,31 +3,160 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices;
+using System.Threading.Tasks;
using Microsoft.SqlTools.EditorServices.Session;
+using Microsoft.SqlTools.EditorServices.Utility;
+using Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol;
+using Microsoft.SqlTools.ServiceLayer.WorkspaceService.Contracts;
-namespace Microsoft.SqlTools.LanguageSupport
+namespace Microsoft.SqlTools.ServiceLayer.LanguageService
{
///
/// Main class for Language Service functionality
///
public class LanguageService
{
+
+ #region Singleton Instance Implementation
+
+ private static LanguageService instance;
+
+ public static LanguageService Instance
+ {
+ get
+ {
+ if (instance == null)
+ {
+ instance = new LanguageService();
+ }
+ return instance;
+ }
+ }
+
+ ///
+ /// Constructor for the Language Service class
+ ///
+ ///
+ private LanguageService(SqlToolsContext context)
+ {
+ this.Context = context;
+ }
+
+ ///
+ /// Default, parameterless contstructor.
+ /// TODO: Remove once the SqlToolsContext stuff is sorted out
+ ///
+ private LanguageService()
+ {
+
+ }
+
+ #endregion
+
///
/// Gets or sets the current SQL Tools context
///
///
private SqlToolsContext Context { get; set; }
- ///
- /// Constructor for the Language Service class
- ///
- ///
- public LanguageService(SqlToolsContext context)
+ public void InitializeService(ServiceHost.ServiceHost serviceHost)
{
- this.Context = context;
+ // Register the requests that this service will handle
+ serviceHost.SetRequestHandler(DefinitionRequest.Type, HandleDefinitionRequest);
+ serviceHost.SetRequestHandler(ReferencesRequest.Type, HandleReferencesRequest);
+ serviceHost.SetRequestHandler(CompletionRequest.Type, HandleCompletionRequest);
+ serviceHost.SetRequestHandler(CompletionResolveRequest.Type, HandleCompletionResolveRequest);
+ serviceHost.SetRequestHandler(SignatureHelpRequest.Type, HandleSignatureHelpRequest);
+ serviceHost.SetRequestHandler(DocumentHighlightRequest.Type, HandleDocumentHighlightRequest);
+ serviceHost.SetRequestHandler(HoverRequest.Type, HandleHoverRequest);
+ serviceHost.SetRequestHandler(DocumentSymbolRequest.Type, HandleDocumentSymbolRequest);
+ serviceHost.SetRequestHandler(WorkspaceSymbolRequest.Type, HandleWorkspaceSymbolRequest);
+
+ // Register a no-op shutdown task for validation of the shutdown logic
+ serviceHost.RegisterShutdownTask(async (shutdownParams, shutdownRequestContext) =>
+ {
+ Logger.Write(LogLevel.Verbose, "Shutting down language service");
+ await Task.FromResult(0);
+ });
}
+ #region Request Handlers
+
+ private static async Task HandleDefinitionRequest(
+ TextDocumentPosition textDocumentPosition,
+ RequestContext requestContext)
+ {
+ Logger.Write(LogLevel.Verbose, "HandleDefinitionRequest");
+ await Task.FromResult(true);
+ }
+
+ private static async Task HandleReferencesRequest(
+ ReferencesParams referencesParams,
+ RequestContext requestContext)
+ {
+ Logger.Write(LogLevel.Verbose, "HandleReferencesRequest");
+ await Task.FromResult(true);
+ }
+
+ private static async Task HandleCompletionRequest(
+ TextDocumentPosition textDocumentPosition,
+ RequestContext requestContext)
+ {
+ Logger.Write(LogLevel.Verbose, "HandleCompletionRequest");
+ await Task.FromResult(true);
+ }
+
+ private static async Task HandleCompletionResolveRequest(
+ CompletionItem completionItem,
+ RequestContext requestContext)
+ {
+ Logger.Write(LogLevel.Verbose, "HandleCompletionResolveRequest");
+ await Task.FromResult(true);
+ }
+
+ private static async Task HandleSignatureHelpRequest(
+ TextDocumentPosition textDocumentPosition,
+ RequestContext requestContext)
+ {
+ Logger.Write(LogLevel.Verbose, "HandleSignatureHelpRequest");
+ await Task.FromResult(true);
+ }
+
+ private static async Task HandleDocumentHighlightRequest(
+ TextDocumentPosition textDocumentPosition,
+ RequestContext requestContext)
+ {
+ Logger.Write(LogLevel.Verbose, "HandleDocumentHighlightRequest");
+ await Task.FromResult(true);
+ }
+
+ private static async Task HandleHoverRequest(
+ TextDocumentPosition textDocumentPosition,
+ RequestContext requestContext)
+ {
+ Logger.Write(LogLevel.Verbose, "HandleHoverRequest");
+ await Task.FromResult(true);
+ }
+
+ private static async Task HandleDocumentSymbolRequest(
+ TextDocumentIdentifier textDocumentIdentifier,
+ RequestContext requestContext)
+ {
+ Logger.Write(LogLevel.Verbose, "HandleDocumentSymbolRequest");
+ await Task.FromResult(true);
+ }
+
+ private static async Task HandleWorkspaceSymbolRequest(
+ WorkspaceSymbolParams workspaceSymbolParams,
+ RequestContext requestContext)
+ {
+ Logger.Write(LogLevel.Verbose, "HandleWorkspaceSymbolRequest");
+ await Task.FromResult(true);
+ }
+
+ #endregion
+
///
/// Gets a list of semantic diagnostic marks for the provided script file
///
diff --git a/src/ServiceHost/Program.cs b/src/ServiceHost/Program.cs
index 6bfd0f24..fda85c74 100644
--- a/src/ServiceHost/Program.cs
+++ b/src/ServiceHost/Program.cs
@@ -2,11 +2,10 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
-using Microsoft.SqlTools.EditorServices.Protocol.Server;
using Microsoft.SqlTools.EditorServices.Session;
using Microsoft.SqlTools.EditorServices.Utility;
-namespace Microsoft.SqlTools.ServiceHost
+namespace Microsoft.SqlTools.ServiceLayer
{
///
/// Main application class for SQL Tools API Service Host executable
@@ -31,10 +30,15 @@ namespace Microsoft.SqlTools.ServiceHost
var hostDetails = new HostDetails(hostName, hostProfileId, hostVersion);
var profilePaths = new ProfilePaths(hostProfileId, "baseAllUsersPath", "baseCurrentUserPath");
- // create and run the language server
- var languageServer = new LanguageServer(hostDetails, profilePaths);
- languageServer.Start().Wait();
- languageServer.WaitForExit();
+ // Create the service host
+ ServiceHost.ServiceHost serviceHost = ServiceHost.ServiceHost.Create(hostDetails, profilePaths);
+
+ // Initialize the services that will be hosted here
+ LanguageService.LanguageService.Instance.InitializeService(serviceHost);
+
+ // Start the service
+ serviceHost.Start().Wait();
+ serviceHost.WaitForExit();
}
}
}
diff --git a/src/ServiceHost/ServerService/Contracts/ClientCapabilities.cs b/src/ServiceHost/ServiceHost/Contracts/ClientCapabilities.cs
similarity index 85%
rename from src/ServiceHost/ServerService/Contracts/ClientCapabilities.cs
rename to src/ServiceHost/ServiceHost/Contracts/ClientCapabilities.cs
index 70e2d068..e8b084e7 100644
--- a/src/ServiceHost/ServerService/Contracts/ClientCapabilities.cs
+++ b/src/ServiceHost/ServiceHost/Contracts/ClientCapabilities.cs
@@ -4,7 +4,7 @@
//
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Contracts
{
///
/// Defines a class that describes the capabilities of a language
diff --git a/src/ServiceHost/ServerService/Contracts/Initialize.cs b/src/ServiceHost/ServiceHost/Contracts/Initialize.cs
similarity index 91%
rename from src/ServiceHost/ServerService/Contracts/Initialize.cs
rename to src/ServiceHost/ServiceHost/Contracts/Initialize.cs
index 7551835e..a5dc1eff 100644
--- a/src/ServiceHost/ServerService/Contracts/Initialize.cs
+++ b/src/ServiceHost/ServiceHost/Contracts/Initialize.cs
@@ -3,9 +3,9 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Contracts
{
public class InitializeRequest
{
diff --git a/src/ServiceHost/ServerService/Contracts/ServerCapabilities.cs b/src/ServiceHost/ServiceHost/Contracts/ServerCapabilities.cs
similarity index 96%
rename from src/ServiceHost/ServerService/Contracts/ServerCapabilities.cs
rename to src/ServiceHost/ServiceHost/Contracts/ServerCapabilities.cs
index 2f7404d9..f378aa9e 100644
--- a/src/ServiceHost/ServerService/Contracts/ServerCapabilities.cs
+++ b/src/ServiceHost/ServiceHost/Contracts/ServerCapabilities.cs
@@ -3,7 +3,7 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Contracts
{
public class ServerCapabilities
{
diff --git a/src/ServiceHost/ServerService/Contracts/Shutdown.cs b/src/ServiceHost/ServiceHost/Contracts/Shutdown.cs
similarity index 85%
rename from src/ServiceHost/ServerService/Contracts/Shutdown.cs
rename to src/ServiceHost/ServiceHost/Contracts/Shutdown.cs
index f0a7bbd2..395aaef0 100644
--- a/src/ServiceHost/ServerService/Contracts/Shutdown.cs
+++ b/src/ServiceHost/ServiceHost/Contracts/Shutdown.cs
@@ -3,9 +3,9 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
-namespace Microsoft.SqlTools.EditorServices.Protocol.LanguageServer
+namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Contracts
{
///
/// Defines a message that is sent from the client to request
diff --git a/src/ServiceHost/ServiceHost/Protocol/Channel/ChannelBase.cs b/src/ServiceHost/ServiceHost/Protocol/Channel/ChannelBase.cs
index 622e5826..3d55ace4 100644
--- a/src/ServiceHost/ServiceHost/Protocol/Channel/ChannelBase.cs
+++ b/src/ServiceHost/ServiceHost/Protocol/Channel/ChannelBase.cs
@@ -3,8 +3,8 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
-using Microsoft.SqlTools.EditorServices.Protocol.MessageProtocol.Serializers;
using System.Threading.Tasks;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Serializers;
namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Channel
{
diff --git a/src/ServiceHost/ServiceHost/Protocol/Channel/StdioClientChannel.cs b/src/ServiceHost/ServiceHost/Protocol/Channel/StdioClientChannel.cs
index e8645d38..83bf5c38 100644
--- a/src/ServiceHost/ServiceHost/Protocol/Channel/StdioClientChannel.cs
+++ b/src/ServiceHost/ServiceHost/Protocol/Channel/StdioClientChannel.cs
@@ -7,6 +7,7 @@ using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading.Tasks;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Serializers;
namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Channel
{
diff --git a/src/ServiceHost/ServiceHost/Protocol/Channel/StdioServerChannel.cs b/src/ServiceHost/ServiceHost/Protocol/Channel/StdioServerChannel.cs
index 46fd5d0f..9aa164e2 100644
--- a/src/ServiceHost/ServiceHost/Protocol/Channel/StdioServerChannel.cs
+++ b/src/ServiceHost/ServiceHost/Protocol/Channel/StdioServerChannel.cs
@@ -6,6 +6,7 @@
using System.IO;
using System.Text;
using System.Threading.Tasks;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Serializers;
namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Channel
{
diff --git a/src/ServiceHost/ServiceHost/Protocol/MessageDispatcher.cs b/src/ServiceHost/ServiceHost/Protocol/MessageDispatcher.cs
index 58f541d2..fe4ccdff 100644
--- a/src/ServiceHost/ServiceHost/Protocol/MessageDispatcher.cs
+++ b/src/ServiceHost/ServiceHost/Protocol/MessageDispatcher.cs
@@ -10,6 +10,7 @@ using System.Threading;
using System.Threading.Tasks;
using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Channel;
using Microsoft.SqlTools.EditorServices.Utility;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol
{
diff --git a/src/ServiceHost/ServiceHost/Protocol/Serializers/IMessageSerializer.cs b/src/ServiceHost/ServiceHost/Protocol/Serializers/IMessageSerializer.cs
index 318955fd..de537b1d 100644
--- a/src/ServiceHost/ServiceHost/Protocol/Serializers/IMessageSerializer.cs
+++ b/src/ServiceHost/ServiceHost/Protocol/Serializers/IMessageSerializer.cs
@@ -3,6 +3,7 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
using Newtonsoft.Json.Linq;
namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Serializers
diff --git a/src/ServiceHost/ServiceHost/Protocol/Serializers/JsonRpcMessageSerializer.cs b/src/ServiceHost/ServiceHost/Protocol/Serializers/JsonRpcMessageSerializer.cs
index 194f270d..bf29a530 100644
--- a/src/ServiceHost/ServiceHost/Protocol/Serializers/JsonRpcMessageSerializer.cs
+++ b/src/ServiceHost/ServiceHost/Protocol/Serializers/JsonRpcMessageSerializer.cs
@@ -3,6 +3,7 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
using Newtonsoft.Json.Linq;
namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Serializers
diff --git a/src/ServiceHost/ServiceHost/Protocol/Serializers/V8MessageSerializer.cs b/src/ServiceHost/ServiceHost/Protocol/Serializers/V8MessageSerializer.cs
index 81af48f5..7ac68143 100644
--- a/src/ServiceHost/ServiceHost/Protocol/Serializers/V8MessageSerializer.cs
+++ b/src/ServiceHost/ServiceHost/Protocol/Serializers/V8MessageSerializer.cs
@@ -5,6 +5,7 @@
using Newtonsoft.Json.Linq;
using System;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Contracts;
namespace Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Serializers
{
diff --git a/src/ServiceHost/ServiceHost/ServiceHost.cs b/src/ServiceHost/ServiceHost/ServiceHost.cs
index 53337392..0b393e3f 100644
--- a/src/ServiceHost/ServiceHost/ServiceHost.cs
+++ b/src/ServiceHost/ServiceHost/ServiceHost.cs
@@ -10,11 +10,13 @@ using System.Threading;
using System.Linq;
using System;
using Microsoft.SqlTools.EditorServices;
-using Microsoft.SqlTools.EditorServices.Protocol.LanguageServer;
using Microsoft.SqlTools.EditorServices.Session;
using Microsoft.SqlTools.EditorServices.Utility;
+using Microsoft.SqlTools.ServiceLayer.LanguageService.Contracts;
+using Microsoft.SqlTools.ServiceLayer.ServiceHost.Contracts;
using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol;
using Microsoft.SqlTools.ServiceLayer.ServiceHost.Protocol.Channel;
+using Microsoft.SqlTools.ServiceLayer.WorkspaceService.Contracts;
namespace Microsoft.SqlTools.ServiceLayer.ServiceHost
{
@@ -23,59 +25,115 @@ namespace Microsoft.SqlTools.ServiceLayer.ServiceHost
///
public class ServiceHost : ServiceHostBase
{
+ #region Singleton Instance Code
+
+ ///
+ /// Singleton instance of the instance
+ ///
+ private static ServiceHost instance;
+
+ ///
+ /// Creates or retrieves the current instance of the ServiceHost
+ ///
+ /// Details about the host application
+ /// Details about the profile
+ /// Instance of the service host
+ public static ServiceHost Create(HostDetails hostDetails, ProfilePaths profilePaths)
+ {
+ if (instance == null)
+ {
+ instance = new ServiceHost(hostDetails, profilePaths);
+ }
+ // TODO: hostDetails and profilePaths are thrown out in SqlDataToolsContext,
+ // so we don't need to keep track of whether these have changed for now.
+
+ return instance;
+ }
+
+ ///
+ /// Constructs new instance of ServiceHost using the host and profile details provided.
+ /// Access is private to ensure only one instance exists at a time.
+ ///
+ /// Details about the host application
+ /// Details about the profile
+ private ServiceHost(HostDetails hostDetails, ProfilePaths profilePaths)
+ : base(new StdioServerChannel())
+ {
+ // Initialize the shutdown activities
+ shutdownActivities = new List();
+
+ // Create an editor session that we'll use for keeping track of state
+ this.editorSession = new EditorSession();
+ this.editorSession.StartSession(hostDetails, profilePaths);
+
+ // Register the requests that this service host will handle
+ this.SetRequestHandler(InitializeRequest.Type, this.HandleInitializeRequest);
+ this.SetRequestHandler(ShutdownRequest.Type, this.HandleShutdownRequest);
+ }
+
+ #endregion
+
+ #region Member Variables
+
private static CancellationTokenSource existingRequestCancellation;
private ServiceHostSettings currentSettings = new ServiceHostSettings();
private EditorSession editorSession;
- ///
- /// Provides details about the host application.
- ///
- public ServiceHost(HostDetails hostDetails, ProfilePaths profilePaths)
- : base(new StdioServerChannel())
+ public delegate Task ShutdownHandler(object shutdownParams, RequestContext