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;
}