typescript-language-server
Version:
Language Server Protocol (LSP) implementation for TypeScript using tsserver
106 lines • 3.25 kB
JavaScript
/*
* Copyright (C) 2017, 2018 TypeFox and others.
*
* 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
*/
import * as lsp from 'vscode-languageserver';
import { TextDocument } from 'vscode-languageserver-textdocument';
export class LspDocument {
constructor(doc) {
const { uri, languageId, version, text } = doc;
this.document = TextDocument.create(uri, languageId, version, text);
}
get uri() {
return this.document.uri;
}
get languageId() {
return this.document.languageId;
}
get version() {
return this.document.version;
}
getText(range) {
return this.document.getText(range);
}
positionAt(offset) {
return this.document.positionAt(offset);
}
offsetAt(position) {
return this.document.offsetAt(position);
}
get lineCount() {
return this.document.lineCount;
}
getLine(line) {
const lineRange = this.getLineRange(line);
return this.getText(lineRange);
}
getLineRange(line) {
const lineStart = this.getLineStart(line);
const lineEnd = this.getLineEnd(line);
return lsp.Range.create(lineStart, lineEnd);
}
getLineEnd(line) {
const nextLineOffset = this.getLineOffset(line + 1);
return this.positionAt(nextLineOffset - 1);
}
getLineOffset(line) {
const lineStart = this.getLineStart(line);
return this.offsetAt(lineStart);
}
getLineStart(line) {
return lsp.Position.create(line, 0);
}
applyEdit(version, change) {
const content = this.getText();
let newContent = change.text;
if (lsp.TextDocumentContentChangeEvent.isIncremental(change)) {
const start = this.offsetAt(change.range.start);
const end = this.offsetAt(change.range.end);
newContent = content.substr(0, start) + change.text + content.substr(end);
}
this.document = TextDocument.create(this.uri, this.languageId, version, newContent);
}
}
export class LspDocuments {
constructor() {
this._files = [];
this.documents = new Map();
}
/**
* Sorted by last access.
*/
get files() {
return this._files;
}
get(file) {
const document = this.documents.get(file);
if (!document) {
return undefined;
}
if (this.files[0] !== file) {
this._files.splice(this._files.indexOf(file), 1);
this._files.unshift(file);
}
return document;
}
open(file, doc) {
if (this.documents.has(file)) {
return false;
}
this.documents.set(file, new LspDocument(doc));
this._files.unshift(file);
return true;
}
close(file) {
const document = this.documents.get(file);
if (!document) {
return undefined;
}
this.documents.delete(file);
this._files.splice(this._files.indexOf(file), 1);
return document;
}
}
//# sourceMappingURL=document.js.map