Connect to a custom language server - Moonshine-IDE/Moonshine-IDE GitHub Wiki
This documentation is intended for contributors to Moonshine IDE. It explains different methods for connecting to a custom language server using the LanguageClient
class.
Connecting with native process standard I/O
Create variables to store the native process and the language client.
private var _nativeProcess:NativeProcess;
private var _languageClient:LanguageClient;
Create a LanguageClient
using the standardOutput
and standardInput
from the NativeProcess
.
var languageID:String = "java"; // an ID for the new language
var project:JavaProjectVO; // needs a subclass of ProjectVO
var debugMode:Boolean = false; // set to true to see all protocol messages
var initOptions:Object = {}; // the language server may require some custom values
_languageClient = new LanguageClient(
languageID,
projectVO,
debugMode,
initOptions,
GlobalEventDispatcher.getInstance(),
_nativeProcess.standardOutput,
_nativeProcess,
ProgressEvent.STANDARD_OUTPUT_DATA,
_nativeProcess.standardInput);
_languageClient.addEventListener(Event.CLOSE, languageClient_closeHandler);
Cleanup the LanguageClient
when it stops.
private function languageClient_closeHandler(event:Event):void
{
_languageClient.removeEventListener(Event.CLOSE, languageClient_closeHandler);
_languageClient = null;
}
Connecting with a Socket
Create variables to store the server and client sockets and the language client.
private var _serverSocket:ServerSocket;
private var _clientSocket:Socket;
private var _languageClient:LanguageClient;
Start a server socket.
_serverSocket = new ServerSocket();
_serverSocket.bind(port);
_serverSocket.addEventListener(Event.CONNECT, serverSocket_connectHandler);
_serverSocket.listen();
When connected, listen for event and create a LanguageClient
.
private function serverSocket_connectHandler(event:ServerSocketConnectEvent):void
{
_clientSocket = event.socket;
_clientSocket.addEventListener(IOErrorEvent.IO_ERROR, clientSocket_ioErrorHandler);
_clientSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, clientSocket_securityErrorHandler);
_clientSocket.addEventListener(Event.CLOSE, clientSocket_closeHandler);
var languageID:String = "java"; // an ID for the new language
var project:JavaProjectVO; // a subclass of ProjectVO
var debugMode:Boolean = false; // set to true to see all protocol messages
var initOptions:Object = {}; // the language server may require some custom values
_languageClient = new LanguageClient(
languageID,
projectVO,
debugMode,
initOptions,
GlobalEventDispatcher.getInstance(),
_clientSocket,
_clientSocket,
ProgressEvent.SOCKET_DATA,
_clientSocket,
flushSocket);
_languageClient.addEventListener(Event.CLOSE, languageClient_closeHandler);
}
Ensure that the socket is flushed when data is written by LanguageClient
.
private function flushSocket():void
{
_clientSocket.flush();
}
Cleanup the LanguageClient
when it stops.
private function languageClient_closeHandler(event:Event):void
{
_languageClient.removeEventListener(Event.CLOSE, languageClient_closeHandler);
_languageClient = null;
}