UNPKG

dot-language-server

Version:
183 lines 7.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.runServer = runServer; const dot_language_support_1 = require("dot-language-support"); const rpc = require("vscode-jsonrpc"); const lsp = require("vscode-languageserver"); const vscode_languageserver_1 = require("vscode-languageserver"); const vscode_languageserver_textdocument_1 = require("vscode-languageserver-textdocument"); const defaultSettings = { maxNumberOfProblems: 100 }; function runServer(connection) { if (!connection) throw "connection is missing"; const languageService = (0, dot_language_support_1.createService)(); const documents = new lsp.TextDocuments(vscode_languageserver_textdocument_1.TextDocument); const astOfFile = new Map(); documents.listen(connection); let shouldSendDiagnosticRelatedInformation = false; connection.onInitialize((_params) => { var _a, _b, _c; const a = (_c = (_b = (_a = _params.capabilities) === null || _a === void 0 ? void 0 : _a.textDocument) === null || _b === void 0 ? void 0 : _b.publishDiagnostics) === null || _c === void 0 ? void 0 : _c.relatedInformation; shouldSendDiagnosticRelatedInformation = !!a; return { capabilities: { textDocumentSync: vscode_languageserver_1.TextDocumentSyncKind.Full, completionProvider: { triggerCharacters: ["="], resolveProvider: false, }, hoverProvider: true, referencesProvider: true, definitionProvider: true, renameProvider: true, codeActionProvider: true, executeCommandProvider: { commands: languageService.getAvailableCommands(), }, colorProvider: true, }, }; }); function rebuildAll() { for (const uri of astOfFile.keys()) updateAst(uri); } function updateAst(uri, doc) { const d = doc === undefined ? documents.get(uri) : doc; if (!d) { return undefined; } const ast = languageService.parseDocument(d); astOfFile.set(uri, ast); return ast; } function ensureAst(uri, doc) { let ast = astOfFile.get(uri); if (ast === undefined) ast = updateAst(uri, doc); return ast; } connection.onHover(req => { const uri = req.textDocument.uri; const doc = documents.get(uri); const ast = ensureAst(uri, doc); return doc && ast ? languageService.hover(doc, ast, req.position) : invalidRequest(); }); connection.onReferences(req => { const uri = req.textDocument.uri; const doc = documents.get(uri); const ast = ensureAst(uri, doc); return doc && ast ? languageService.findReferences(doc, ast, req.position, req.context) : invalidRequest(); }); connection.onDefinition(req => { const uri = req.textDocument.uri; const doc = documents.get(uri); const ast = ensureAst(uri, doc); return doc && ast ? languageService.findDefinition(doc, ast, req.position) : invalidRequest(); }); connection.onDocumentColor(req => { const uri = req.textDocument.uri; const doc = documents.get(uri); const ast = ensureAst(uri, doc); return doc && ast ? languageService.getDocumentColors(doc, ast) : invalidRequest(); }); connection.onColorPresentation(req => { const uri = req.textDocument.uri; const doc = documents.get(uri); const ast = ensureAst(uri, doc); return doc && ast ? languageService.getColorRepresentations(doc, ast, req.color, req.range) : invalidRequest(); }); connection.onCodeAction(req => { const uri = req.textDocument.uri; const doc = documents.get(uri); const ast = ensureAst(uri, doc); if (doc && ast) { const r = languageService.getCodeActions(doc, ast, req.range, req.context); if (r) { for (const command of r) { if (command.arguments) command.arguments.push(uri); else command.arguments = [uri]; } } return r; } return invalidRequest(); }); connection.onExecuteCommand(req => { const args = req.arguments; if (!args || args.length < 1) return; const uri = args.pop(); const doc = documents.get(uri); const ast = ensureAst(uri, doc); if (doc && ast) { req.arguments = args.length === 0 ? undefined : args; const edit = languageService.executeCommand(doc, ast, req); if (edit) connection.workspace.applyEdit(edit); } }); connection.onRenameRequest(req => { const uri = req.textDocument.uri; const doc = documents.get(uri); const ast = ensureAst(uri, doc); if (doc && ast) { const r = languageService.renameSymbol(doc, ast, req.position, req.newName); return r ? r : invalidRequest(); } return invalidRequest(); }); documents.onDidChangeContent(change => { const doc = change.document; const ast = updateAst(doc.uri, doc); if (ast === undefined) throw "This cannot happen"; return validateDocument(doc, ast); }); let currentSettings = Object.assign({}, defaultSettings); connection.onDidChangeConfiguration(change => { const newSettings = change.settings.dotLanguageServer; if (newSettings) currentSettings = newSettings; rebuildAll(); validateAll(); }); function validateAll() { for (const uri of astOfFile.keys()) { const doc = documents.get(uri); if (doc) { const ast = ensureAst(uri, doc); if (ast) validateDocument(doc, ast); } } } function validateDocument(doc, sf) { const diagnostics = languageService.validateDocument(doc, sf); connection.sendDiagnostics({ uri: doc.uri, diagnostics }); } connection.onDidChangeWatchedFiles(_change => { connection.console.log("We received an file change event"); }); connection.onCompletion(req => { const uri = req.textDocument.uri; const doc = documents.get(uri); const ast = ensureAst(uri, doc); return doc && ast ? languageService.getCompletions(doc, ast, req.position) : invalidRequest(); }); documents.onDidOpen(params => updateAst(params.document.uri, params.document)); const invalidRequest = () => new rpc.ResponseError(rpc.ErrorCodes.InvalidRequest, "Invalid request"); connection.listen(); } //# sourceMappingURL=server.js.map