From addd44d6b845348bfa7d65106b40f5692bb7b3fa Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 26 Mar 2018 12:43:10 +0200 Subject: [PATCH] simplified resolve rename location proposal, #7340 --- src/vs/editor/common/modes.ts | 8 +--- src/vs/editor/contrib/rename/rename.ts | 42 +++++++++---------- src/vs/monaco.d.ts | 8 +--- src/vs/vscode.proposed.d.ts | 10 +---- .../mainThreadLanguageFeatures.ts | 4 +- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- .../api/node/extHostLanguageFeatures.ts | 16 +++---- 7 files changed, 32 insertions(+), 58 deletions(-) diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 6d7f7468e84..64bac6dd228 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -924,15 +924,9 @@ export interface WorkspaceEdit { rejectReason?: string; // TODO@joh, move to rename } -export interface RenameContext { - range: IRange; - text: string; - message?: string; -} - export interface RenameProvider { provideRenameEdits(model: model.ITextModel, position: Position, newName: string, token: CancellationToken): WorkspaceEdit | Thenable; - resolveRenameLocation?(model: model.ITextModel, position: Position, token: CancellationToken): RenameContext | Thenable; + resolveRenameLocation?(model: model.ITextModel, position: Position, token: CancellationToken): IRange | Thenable; } diff --git a/src/vs/editor/contrib/rename/rename.ts b/src/vs/editor/contrib/rename/rename.ts index 70341d1b55e..9cbe4844aa5 100644 --- a/src/vs/editor/contrib/rename/rename.ts +++ b/src/vs/editor/contrib/rename/rename.ts @@ -23,10 +23,10 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { optional } from 'vs/platform/instantiation/common/instantiation'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { asWinJsPromise } from 'vs/base/common/async'; -import { WorkspaceEdit, RenameProviderRegistry, RenameContext, RenameProvider } from 'vs/editor/common/modes'; +import { WorkspaceEdit, RenameProviderRegistry, RenameProvider } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; import { alert } from 'vs/base/browser/ui/aria/aria'; -import { Range } from 'vs/editor/common/core/range'; +import { Range, IRange } from 'vs/editor/common/core/range'; import { MessageController } from 'vs/editor/contrib/message/messageController'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/browser/core/editorState'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -47,26 +47,23 @@ class RenameSkeleton { return this._provider.length > 0; } - async resolveRenameInformation(): TPromise { + async resolveRenameLocation(): TPromise { let [provider] = this._provider; - let information: RenameContext; + let range: IRange; if (provider.resolveRenameLocation) { - information = await asWinJsPromise(token => provider.resolveRenameLocation(this.model, this.position, token)); + range = await asWinJsPromise(token => provider.resolveRenameLocation(this.model, this.position, token)); } - if (!information) { + if (!range) { let word = this.model.getWordAtPosition(this.position); if (word) { - information = { - range: new Range(this.position.lineNumber, word.startColumn, this.position.lineNumber, word.endColumn), - text: word.word - }; + range = new Range(this.position.lineNumber, word.startColumn, this.position.lineNumber, word.endColumn); } } - return information; + return range; } async provideRenameEdits(newName: string, i: number = 0, rejects: string[] = []): TPromise { @@ -134,27 +131,26 @@ class RenameController implements IEditorContribution { const position = this.editor.getPosition(); const skeleton = new RenameSkeleton(this.editor.getModel(), position); - let context = await skeleton.resolveRenameInformation(); - if (!context) { - return undefined; - } - - if (context.message) { - MessageController.get(this.editor).showMessage(context.message, position); + let range: IRange; + try { + range = await skeleton.resolveRenameLocation(); + } catch (e) { + MessageController.get(this.editor).showMessage(e, position); return undefined; } + let text = this.editor.getModel().getValueInRange(range); let selection = this.editor.getSelection(); let selectionStart = 0; - let selectionEnd = context.text.length; + let selectionEnd = text.length; if (!selection.isEmpty() && selection.startLineNumber === selection.endLineNumber) { - selectionStart = Math.max(0, selection.startColumn - context.range.startColumn); - selectionEnd = Math.min(context.range.endColumn, selection.endColumn) - context.range.startColumn; + selectionStart = Math.max(0, selection.startColumn - range.startColumn); + selectionEnd = Math.min(range.endColumn, selection.endColumn) - range.startColumn; } this._renameInputVisible.set(true); - return this._renameInputField.getInput(Range.lift(context.range), context.text, selectionStart, selectionEnd).then(newNameOrFocusFlag => { + return this._renameInputField.getInput(Range.lift(range), text, selectionStart, selectionEnd).then(newNameOrFocusFlag => { this._renameInputVisible.reset(); if (typeof newNameOrFocusFlag === 'boolean') { @@ -185,7 +181,7 @@ class RenameController implements IEditorContribution { this.editor.setSelection(selection); } // alert - alert(nls.localize('aria', "Successfully renamed '{0}' to '{1}'. Summary: {2}", context.text, newNameOrFocusFlag, edit.ariaMessage())); + alert(nls.localize('aria', "Successfully renamed '{0}' to '{1}'. Summary: {2}", text, newNameOrFocusFlag, edit.ariaMessage())); }); }, err => { diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index e153cfedbaa..dd91585c691 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -4986,15 +4986,9 @@ declare namespace monaco.languages { rejectReason?: string; } - export interface RenameContext { - range: IRange; - text: string; - message?: string; - } - export interface RenameProvider { provideRenameEdits(model: editor.ITextModel, position: Position, newName: string, token: CancellationToken): WorkspaceEdit | Thenable; - resolveRenameLocation?(model: editor.ITextModel, position: Position, token: CancellationToken): RenameContext | Thenable; + resolveRenameLocation?(model: editor.ITextModel, position: Position, token: CancellationToken): IRange | Thenable; } export interface Command { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 28b6923f3fa..88e7c568499 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -439,12 +439,6 @@ declare module 'vscode' { //#region Joh: rename context - export interface RenameContext { - range?: Range; - newName?: string; - message?: string; - } - export interface RenameProvider2 extends RenameProvider { /** @@ -454,9 +448,9 @@ declare module 'vscode' { * @param document The document in which rename will be invoked. * @param position The position at which rename will be invoked. * @param token A cancellation token. - * @return A `RenameContext` with more information. The lack of a result can signaled by returning `undefined` or `null`. + * @return The range of the identifier that is to be renamed. The lack of a result can signaled by returning `undefined` or `null`. */ - resolveRenameLocation?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; + resolveRenameLocation?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; } diff --git a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts index c4c01b90d41..35563ae6dbc 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts @@ -13,7 +13,7 @@ import { WorkspaceSymbolProviderRegistry, IWorkspaceSymbolProvider } from 'vs/wo import { wireCancellationToken } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Position as EditorPosition } from 'vs/editor/common/core/position'; -import { Range as EditorRange } from 'vs/editor/common/core/range'; +import { Range as EditorRange, IRange } from 'vs/editor/common/core/range'; import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, MainContext, IExtHostContext, ISerializedLanguageConfiguration, ISerializedRegExp, ISerializedIndentationRule, ISerializedOnEnterRule, LocationDto, SymbolInformationDto, CodeActionDto, reviveWorkspaceEditDto, ISerializedDocumentFilter } from '../node/extHost.protocol'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { LanguageConfiguration, IndentationRule, OnEnterRule } from 'vs/editor/common/modes/languageConfiguration'; @@ -257,7 +257,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha return wireCancellationToken(token, this._proxy.$provideRenameEdits(handle, model.uri, position, newName)).then(reviveWorkspaceEditDto); }, resolveRenameLocation: supportResolveLocation - ? (model: ITextModel, position: EditorPosition, token: CancellationToken): Thenable => wireCancellationToken(token, this._proxy.$resolveRenameLocation(handle, model.uri, position)) + ? (model: ITextModel, position: EditorPosition, token: CancellationToken): Thenable => wireCancellationToken(token, this._proxy.$resolveRenameLocation(handle, model.uri, position)) : undefined }); } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 6e33c3e8955..80cf86ea2e9 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -700,7 +700,7 @@ export interface ExtHostLanguageFeaturesShape { $resolveWorkspaceSymbol(handle: number, symbol: SymbolInformationDto): TPromise; $releaseWorkspaceSymbols(handle: number, id: number): void; $provideRenameEdits(handle: number, resource: UriComponents, position: IPosition, newName: string): TPromise; - $resolveRenameLocation(handle: number, resource: UriComponents, position: IPosition): TPromise; + $resolveRenameLocation(handle: number, resource: UriComponents, position: IPosition): TPromise; $provideCompletionItems(handle: number, resource: UriComponents, position: IPosition, context: modes.SuggestContext): TPromise; $resolveCompletionItem(handle: number, resource: UriComponents, position: IPosition, suggestion: modes.ISuggestion): TPromise; $releaseCompletionItems(handle: number, id: number): void; diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 25ae4ba089a..cb69eb21452 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -506,7 +506,7 @@ class RenameAdapter { }); } - resolveRenameLocation(resource: URI, position: IPosition): TPromise { + resolveRenameLocation(resource: URI, position: IPosition): TPromise { if (typeof this._provider.resolveRenameLocation !== 'function') { return TPromise.as(undefined); } @@ -514,23 +514,19 @@ class RenameAdapter { let doc = this._documents.getDocumentData(resource).document; let pos = TypeConverters.toPosition(position); - return asWinJsPromise(token => this._provider.resolveRenameLocation(doc, pos, token)).then(context => { - if (!context) { + return asWinJsPromise(token => this._provider.resolveRenameLocation(doc, pos, token)).then(range => { + if (!range) { return undefined; } - if (context.range && (!context.range.isSingleLine || context.range.start.line !== pos.line)) { + if (range && (!range.isSingleLine || range.start.line !== pos.line)) { console.warn('INVALID rename context, range must be single line and on the same line'); return undefined; } - return { - range: TypeConverters.fromRange(context.range), - text: context.newName || doc.getText(context.range) - }; + return TypeConverters.fromRange(range); }); } } - class SuggestAdapter { static supportsResolving(provider: vscode.CompletionItemProvider): boolean { @@ -1092,7 +1088,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, RenameAdapter, adapter => adapter.provideRenameEdits(URI.revive(resource), position, newName)); } - $resolveRenameLocation(handle: number, resource: URI, position: IPosition): TPromise { + $resolveRenameLocation(handle: number, resource: URI, position: IPosition): TPromise { return this._withAdapter(handle, RenameAdapter, adapter => adapter.resolveRenameLocation(resource, position)); }