/*
 * Copyright (C) 2019 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

var path = require('path');
var vscode = require('vscode');
var langClient = require('vscode-languageclient');

var LanguageClient = langClient.LanguageClient;

// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
function activate(context) {
	let serverModule = path.join(context.extensionPath, 'langsvr');
	let debugOptions = {};

	// If the extension is launched in debug mode then the debug server options are used
	// Otherwise the run options are used
	let serverOptions = {
		run: { command: serverModule, transport: langClient.stdio },
		debug: { command: serverModule, transport: langClient.stdio, options: debugOptions }
	}

	// Options to control the language client
	let clientOptions = {
		documentSelector: ['spirv'],
		synchronize: {
			// Synchronize the setting section 'spirv' to the server
			configurationSection: 'spirv',
			// Notify the server about file changes to .spvasm files contained in the workspace
			fileEvents: vscode.workspace.createFileSystemWatcher('**/*.spvasm')
		}
	}

	// Create the language client and start the client.
	let disposable = new LanguageClient('spirv', serverOptions, clientOptions).start();

	// Push the disposable to the context's subscriptions so that the
	// client can be deactivated on extension deactivation
	context.subscriptions.push(disposable);

	// Set the language configuration here instead of a language configuration
	// file to work around https://github.com/microsoft/vscode/issues/42649.
	vscode.languages.setLanguageConfiguration("spirv", {
		comments: { "lineComment": ";" },
		wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\#\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,
	});
}
exports.activate = activate;

// this method is called when your extension is deactivated
function deactivate() {
}
exports.deactivate = deactivate;