mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-24 12:19:20 +00:00
Move smart select and folding to md language server (#154334)
* Move smart select and folding to md language server Also fixes a few minor issues: - Don't log to web console - Remove convert code since it is no longer needed - Use correct extension id * bump cache * Bump package version Co-authored-by: João Moreno <joao.moreno@microsoft.com>
This commit is contained in:
@@ -5,14 +5,7 @@
|
||||
|
||||
import { ILogger } from 'vscode-markdown-languageservice';
|
||||
|
||||
class ConsoleLogger implements ILogger {
|
||||
|
||||
public verbose(title: string, message: string, data?: any): void {
|
||||
this.appendLine(`[Verbose ${ConsoleLogger.now()}] ${title}: ${message}`);
|
||||
if (data) {
|
||||
this.appendLine(ConsoleLogger.data2String(data));
|
||||
}
|
||||
}
|
||||
export class LogFunctionLogger implements ILogger {
|
||||
|
||||
private static now(): string {
|
||||
const now = new Date();
|
||||
@@ -21,10 +14,6 @@ class ConsoleLogger implements ILogger {
|
||||
+ ':' + String(now.getUTCSeconds()).padStart(2, '0') + '.' + String(now.getMilliseconds()).padStart(3, '0');
|
||||
}
|
||||
|
||||
private appendLine(value: string): void {
|
||||
console.log(value);
|
||||
}
|
||||
|
||||
private static data2String(data: any): string {
|
||||
if (data instanceof Error) {
|
||||
if (typeof data.stack === 'string') {
|
||||
@@ -37,6 +26,21 @@ class ConsoleLogger implements ILogger {
|
||||
}
|
||||
return JSON.stringify(data, undefined, 2);
|
||||
}
|
||||
|
||||
constructor(
|
||||
private readonly _logFn: typeof console.log
|
||||
) { }
|
||||
|
||||
public verbose(title: string, message: string, data?: any): void {
|
||||
this.appendLine(`[Verbose ${LogFunctionLogger.now()}] ${title}: ${message}`);
|
||||
if (data) {
|
||||
this.appendLine(LogFunctionLogger.data2String(data));
|
||||
}
|
||||
}
|
||||
|
||||
private appendLine(value: string): void {
|
||||
this._logFn(value);
|
||||
}
|
||||
}
|
||||
|
||||
export const consoleLogger = new ConsoleLogger();
|
||||
export const consoleLogger = new LogFunctionLogger(console.log);
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
|
||||
import { Connection, Emitter, Event, InitializeParams, InitializeResult, RequestType, TextDocuments } from 'vscode-languageserver';
|
||||
import { TextDocument } from 'vscode-languageserver-textdocument';
|
||||
import { DocumentSymbol, Position, Range } from 'vscode-languageserver-types';
|
||||
import * as lsp from 'vscode-languageserver-types';
|
||||
import * as md from 'vscode-markdown-languageservice';
|
||||
import { URI } from 'vscode-uri';
|
||||
import { consoleLogger } from './logging';
|
||||
import { LogFunctionLogger } from './logging';
|
||||
|
||||
|
||||
const parseRequestType: RequestType<{ uri: string }, md.Token[], any> = new RequestType('markdown/parse');
|
||||
@@ -31,8 +31,7 @@ class TextDocumentToITextDocumentAdapter implements md.ITextDocument {
|
||||
}
|
||||
|
||||
positionAt(offset: number): md.IPosition {
|
||||
const pos = this._doc.positionAt(offset);
|
||||
return md.makePosition(pos.line, pos.character);
|
||||
return this._doc.positionAt(offset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,6 +43,8 @@ export function startServer(connection: Connection) {
|
||||
return {
|
||||
capabilities: {
|
||||
documentSymbolProvider: true,
|
||||
foldingRangeProvider: true,
|
||||
selectionRangeProvider: true,
|
||||
}
|
||||
};
|
||||
});
|
||||
@@ -85,15 +86,38 @@ export function startServer(connection: Connection) {
|
||||
}
|
||||
};
|
||||
|
||||
const provider = md.createLanguageService(workspace, parser, consoleLogger);
|
||||
const logger = new LogFunctionLogger(connection.console.log.bind(connection.console));
|
||||
const provider = md.createLanguageService(workspace, parser, logger);
|
||||
|
||||
connection.onDocumentSymbol(async (documentSymbolParams, _token): Promise<DocumentSymbol[]> => {
|
||||
connection.onDocumentSymbol(async (params, token): Promise<lsp.DocumentSymbol[]> => {
|
||||
try {
|
||||
const document = documents.get(documentSymbolParams.textDocument.uri) as TextDocument | undefined;
|
||||
const document = documents.get(params.textDocument.uri);
|
||||
if (document) {
|
||||
const response = await provider.provideDocumentSymbols(new TextDocumentToITextDocumentAdapter(document));
|
||||
// TODO: only required because extra methods returned on positions/ranges
|
||||
return response.map(symbol => convertDocumentSymbol(symbol));
|
||||
return await provider.provideDocumentSymbols(new TextDocumentToITextDocumentAdapter(document), token);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e.stack);
|
||||
}
|
||||
return [];
|
||||
});
|
||||
|
||||
connection.onFoldingRanges(async (params, token): Promise<lsp.FoldingRange[]> => {
|
||||
try {
|
||||
const document = documents.get(params.textDocument.uri);
|
||||
if (document) {
|
||||
return await provider.provideFoldingRanges(new TextDocumentToITextDocumentAdapter(document), token);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e.stack);
|
||||
}
|
||||
return [];
|
||||
});
|
||||
|
||||
connection.onSelectionRanges(async (params, token): Promise<lsp.SelectionRange[] | undefined> => {
|
||||
try {
|
||||
const document = documents.get(params.textDocument.uri);
|
||||
if (document) {
|
||||
return await provider.provideSelectionRanges(new TextDocumentToITextDocumentAdapter(document), params.positions, token);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e.stack);
|
||||
@@ -103,30 +127,3 @@ export function startServer(connection: Connection) {
|
||||
|
||||
connection.listen();
|
||||
}
|
||||
|
||||
|
||||
function convertDocumentSymbol(sym: DocumentSymbol): DocumentSymbol {
|
||||
return {
|
||||
kind: sym.kind,
|
||||
name: sym.name,
|
||||
range: convertRange(sym.range),
|
||||
selectionRange: convertRange(sym.selectionRange),
|
||||
children: sym.children?.map(convertDocumentSymbol),
|
||||
detail: sym.detail,
|
||||
tags: sym.tags,
|
||||
};
|
||||
}
|
||||
|
||||
function convertRange(range: Range): Range {
|
||||
return {
|
||||
start: convertPosition(range.start),
|
||||
end: convertPosition(range.end),
|
||||
};
|
||||
}
|
||||
|
||||
function convertPosition(start: Position): Position {
|
||||
return {
|
||||
character: start.character,
|
||||
line: start.line,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -43,8 +43,8 @@ vscode-languageserver@^8.0.2-next.4:
|
||||
vscode-languageserver-protocol "3.17.2-next.6"
|
||||
|
||||
vscode-markdown-languageservice@mjbvz/vscode-markdown-languageservice:
|
||||
version "1.0.0"
|
||||
resolved "https://codeload.github.com/mjbvz/vscode-markdown-languageservice/tar.gz/e410b5df64659fbc186cf0a7a7c882c451e07b8b"
|
||||
version "0.0.0-alpha.1"
|
||||
resolved "https://codeload.github.com/mjbvz/vscode-markdown-languageservice/tar.gz/e1a0e00bf6a99cc543da64964cc0995537647d15"
|
||||
dependencies:
|
||||
vscode-languageserver-types "^3.17.1"
|
||||
vscode-uri "^3.0.3"
|
||||
|
||||
Reference in New Issue
Block a user