diff --git a/extensions/css/server/src/cssLanguageService.ts b/extensions/css/server/src/cssLanguageService.ts index 138d24916af..2901f52b261 100644 --- a/extensions/css/server/src/cssLanguageService.ts +++ b/extensions/css/server/src/cssLanguageService.ts @@ -5,7 +5,7 @@ 'use strict'; import {TextDocument, Position, CompletionList, Hover, Range, SymbolInformation, Diagnostic, - Location, DocumentHighlight, CodeActionContext, Command} from 'vscode-languageserver'; + Location, DocumentHighlight, CodeActionContext, Command, WorkspaceEdit} from 'vscode-languageserver'; import {Stylesheet} from './parser/cssNodes'; import {Parser} from './parser/cssParser'; @@ -32,6 +32,7 @@ export interface LanguageService { findDocumentSymbols(document: TextDocument, stylesheet: Stylesheet): Thenable; doCodeActions(document: TextDocument, range: Range, context: CodeActionContext, stylesheet: Stylesheet): Thenable; findColorSymbols(document: TextDocument, stylesheet: Stylesheet): Thenable; + doRename(document: TextDocument, position: Position, newName: string, stylesheet: Stylesheet): Thenable; } export interface LanguageSettings { @@ -58,7 +59,8 @@ export function getCSSLanguageService() : LanguageService { findDocumentHighlights: cssNavigation.findDocumentHighlights.bind(cssNavigation), findDocumentSymbols: cssNavigation.findDocumentSymbols.bind(cssNavigation), doCodeActions: cssCodeActions.doCodeActions.bind(cssCodeActions), - findColorSymbols: cssNavigation.findColorSymbols.bind(cssNavigation) + findColorSymbols: cssNavigation.findColorSymbols.bind(cssNavigation), + doRename: cssNavigation.doRename.bind(cssNavigation), }; } diff --git a/extensions/css/server/src/cssServerMain.ts b/extensions/css/server/src/cssServerMain.ts index 43f928180f5..d651efddd26 100644 --- a/extensions/css/server/src/cssServerMain.ts +++ b/extensions/css/server/src/cssServerMain.ts @@ -60,7 +60,8 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { referencesProvider: true, definitionProvider: true, documentHighlightProvider: true, - codeActionProvider: true + codeActionProvider: true, + renameProvider: true } }; }); @@ -176,5 +177,11 @@ connection.onRequest(ColorSymbolRequest.type, uri => { return getLanguageService(document).findColorSymbols(document, stylesheet); }); +connection.onRenameRequest(renameParameters => { + let document = documents.get(renameParameters.textDocument.uri); + let stylesheet = stylesheets.getStylesheet(document); + return getLanguageService(document).doRename(document, renameParameters.position, renameParameters.newName, stylesheet); +}); + // Listen on the connection connection.listen(); \ No newline at end of file diff --git a/extensions/css/server/src/services/cssNavigation.ts b/extensions/css/server/src/services/cssNavigation.ts index 97569cebb44..b4666711a2e 100644 --- a/extensions/css/server/src/services/cssNavigation.ts +++ b/extensions/css/server/src/services/cssNavigation.ts @@ -5,7 +5,8 @@ 'use strict'; import * as nodes from '../parser/cssNodes'; -import {TextDocument, Range, Position, Location, DocumentHighlightKind, DocumentHighlight, SymbolInformation, SymbolKind} from 'vscode-languageserver'; +import {TextDocument, Range, Position, Location, DocumentHighlightKind, DocumentHighlight, + SymbolInformation, SymbolKind, WorkspaceEdit, TextEdit} from 'vscode-languageserver'; import {Symbols} from '../parser/cssSymbolScope'; import {isColorValue} from '../services/languageFacts'; @@ -137,6 +138,18 @@ export class CSSNavigation { }); return Promise.resolve(result); } + + public doRename(document: TextDocument, position: Position, newName: string, stylesheet: nodes.Stylesheet): Thenable { + return this.findDocumentHighlights(document, position, stylesheet).then(highlights => { + let edits = highlights.map(h => TextEdit.replace(h.range, newName)); + return { + changes: { + [document.uri]: edits + } + }; + }); + } + } function getRange(node: nodes.Node, document: TextDocument) : Range {