[refactor]
This commit is contained in:
@@ -1,26 +1,30 @@
|
||||
import { CompletionItem, CompletionItemKind, Connection, DidChangeConfigurationNotification, DidChangeConfigurationParams, InitializeParams, InitializeResult, TextDocumentPositionParams, TextDocumentSyncKind } from 'vscode-languageserver';
|
||||
import { CompletionItem, CompletionItemKind, Connection, DidChangeConfigurationNotification, DidChangeConfigurationParams, InitializeParams, InitializeResult, TextDocumentPositionParams, TextDocuments, TextDocumentSyncKind } from 'vscode-languageserver';
|
||||
import { validateTextDocument } from './validation';
|
||||
import { TextDocument } from 'vscode-languageserver-textdocument';
|
||||
import { BranFlakesSettings, defaultSettings, SettingsManager } from './settings';
|
||||
|
||||
export class BranFlakesConnectionManager {
|
||||
hasConfigurationCapability: boolean = false;
|
||||
hasWorkspaceFolderCapability: boolean = false;
|
||||
hasDiagnosticRelatedInformationCapability: boolean = false;
|
||||
|
||||
|
||||
constructor(protected connection: Connection) {
|
||||
constructor(protected connection: Connection, private validator:typeof validateTextDocument, private documents:TextDocuments<TextDocument>, private settingsManager:SettingsManager) {
|
||||
connection.onInitialize(this.initConnection);
|
||||
connection.onDidChangeConfiguration(this.onDidChangeConfiguration);
|
||||
}
|
||||
|
||||
|
||||
|
||||
initConnection(params: InitializeParams) {
|
||||
let capabilities = params.capabilities;
|
||||
|
||||
// Does the client support the `workspace/configuration` request?
|
||||
// If not, we will fall back using global settings
|
||||
this.hasConfigurationCapability = !!(
|
||||
this.settingsManager.hasConfigurationCapability = !!(
|
||||
capabilities.workspace && !!capabilities.workspace.configuration
|
||||
);
|
||||
this.hasWorkspaceFolderCapability = !!(
|
||||
this.settingsManager.hasWorkspaceFolderCapability = !!(
|
||||
capabilities.workspace && !!capabilities.workspace.workspaceFolders
|
||||
);
|
||||
this.hasDiagnosticRelatedInformationCapability = !!(
|
||||
this.settingsManager.hasDiagnosticRelatedInformationCapability = !!(
|
||||
capabilities.textDocument &&
|
||||
capabilities.textDocument.publishDiagnostics &&
|
||||
capabilities.textDocument.publishDiagnostics.relatedInformation
|
||||
@@ -36,7 +40,7 @@ export class BranFlakesConnectionManager {
|
||||
},
|
||||
},
|
||||
};
|
||||
if (this.hasWorkspaceFolderCapability) {
|
||||
if (this.settingsManager.hasWorkspaceFolderCapability) {
|
||||
result.capabilities.workspace = {
|
||||
workspaceFolders: {
|
||||
supported: true,
|
||||
@@ -45,15 +49,31 @@ export class BranFlakesConnectionManager {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
onDidChangeConfiguration(change:DidChangeConfigurationParams){
|
||||
if (this.settingsManager.hasConfigurationCapability) {
|
||||
// Reset all cached document settings
|
||||
this.settingsManager.clearDocumentSettings();
|
||||
} else {
|
||||
this.settingsManager.updateSettings(
|
||||
(change.settings.languageServerExample || defaultSettings)
|
||||
);
|
||||
}
|
||||
|
||||
// Revalidate all open text documents
|
||||
Promise.all(this.documents.all().map(validateTextDocument)).catch(e => {
|
||||
this.connection.console.log('Failed to validate text documents');
|
||||
});
|
||||
}
|
||||
onInit() {
|
||||
if (this.hasConfigurationCapability) {
|
||||
if (this.settingsManager.hasConfigurationCapability) {
|
||||
// Register for all configuration changes.
|
||||
this.connection.client.register(
|
||||
DidChangeConfigurationNotification.type,
|
||||
undefined
|
||||
);
|
||||
}
|
||||
if (this.hasWorkspaceFolderCapability) {
|
||||
if (this.settingsManager.hasWorkspaceFolderCapability) {
|
||||
this.connection.workspace.onDidChangeWorkspaceFolders(_event => {
|
||||
// connection.console.log('Workspace folder change event received.');
|
||||
});
|
||||
|
@@ -9,7 +9,7 @@ import {
|
||||
} from 'vscode-languageserver';
|
||||
|
||||
import { TextDocument } from 'vscode-languageserver-textdocument';
|
||||
import { BranFlakesSettings, defaultSettings } from './settings';
|
||||
import { BranFlakesSettings, defaultSettings, SettingsManager } from './settings';
|
||||
import { BranFlakesConnectionManager } from './connection';
|
||||
import { validateTextDocument } from './validation';
|
||||
|
||||
@@ -23,29 +23,15 @@ let documents: TextDocuments<TextDocument> = new TextDocuments(TextDocument);
|
||||
|
||||
let hasConfigurationCapability: boolean = false;
|
||||
|
||||
let cm = new BranFlakesConnectionManager(connection);
|
||||
|
||||
|
||||
let globalSettings: BranFlakesSettings = defaultSettings;
|
||||
|
||||
// Cache the settings of all open documents
|
||||
let documentSettings: Map<string, Thenable<BranFlakesSettings>> = new Map();
|
||||
let settingsManager = new SettingsManager();
|
||||
let cm = new BranFlakesConnectionManager(connection, validateTextDocument,documents,settingsManager);
|
||||
|
||||
connection.onDidChangeConfiguration(change => {
|
||||
if (hasConfigurationCapability) {
|
||||
// Reset all cached document settings
|
||||
documentSettings.clear();
|
||||
} else {
|
||||
globalSettings = <BranFlakesSettings>(
|
||||
(change.settings.languageServerExample || defaultSettings)
|
||||
);
|
||||
}
|
||||
|
||||
// Revalidate all open text documents
|
||||
Promise.all(documents.all().map(validateTextDocument)).catch(e => {
|
||||
connection.console.log('Failed to validate text documents');
|
||||
});
|
||||
});
|
||||
|
||||
export function getDocumentSettings(resource: string): Thenable<BranFlakesSettings> {
|
||||
if (!hasConfigurationCapability) {
|
||||
@@ -64,7 +50,7 @@ export function getDocumentSettings(resource: string): Thenable<BranFlakesSettin
|
||||
|
||||
// Only keep settings for open documents
|
||||
documents.onDidClose(e => {
|
||||
documentSettings.delete(e.document.uri);
|
||||
settingsManager.closeDocument(e.document.uri);
|
||||
});
|
||||
|
||||
// The content of a text document has changed. This event is emitted
|
||||
|
@@ -7,7 +7,29 @@ export interface BranFlakesSettings {
|
||||
// The global settings, used when the `workspace/configuration` request is not supported by the client.
|
||||
// Please note that this is not the case when using this server with the client provided in this example
|
||||
// but could happen with other clients.
|
||||
export const defaultSettings: BranFlakesSettings = {
|
||||
maxNumberOfProblems: 5
|
||||
export const defaultSettings: BranFlakesSettings = {
|
||||
maxNumberOfProblems: 5
|
||||
};
|
||||
|
||||
|
||||
export class SettingsManager {
|
||||
hasConfigurationCapability: boolean = false;
|
||||
hasWorkspaceFolderCapability: boolean = false;
|
||||
hasDiagnosticRelatedInformationCapability: boolean = false;
|
||||
|
||||
documentSettings: Map<string, Thenable<BranFlakesSettings>> = new Map();
|
||||
|
||||
#settings = defaultSettings;
|
||||
|
||||
updateSettings(newSettings: BranFlakesSettings) {
|
||||
this.#settings = newSettings;
|
||||
}
|
||||
|
||||
closeDocument(doc: string) {
|
||||
this.documentSettings.delete(doc);
|
||||
|
||||
}
|
||||
clearDocumentSettings(){
|
||||
this.documentSettings.clear();
|
||||
}
|
||||
}
|
@@ -24,6 +24,8 @@ export const validateBrackets = (text: string) => {
|
||||
return [...lp, ...issues];
|
||||
};
|
||||
|
||||
|
||||
|
||||
export async function validateTextDocument(textDocument: TextDocument): Promise<void> {
|
||||
// In this simple example we get the settings for every validate run.
|
||||
let settings = await getDocumentSettings(textDocument.uri);
|
||||
|
Reference in New Issue
Block a user