From 81c028ea3de4cdff593da5e3ae0a6c1c46fdd5f6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 9 Feb 2017 13:05:01 +0100 Subject: [PATCH] fix #19562 --- .../quickFix/browser/lightBulbWidget.css | 7 +-- .../quickFix/browser/lightBulbWidget.ts | 2 - .../contrib/quickFix/common/quickFixModel.ts | 38 ++++++++-------- .../test/common/quickFixModel.test.ts | 45 ++++++++++++++++++- 4 files changed, 65 insertions(+), 27 deletions(-) diff --git a/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.css b/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.css index 024496578ad..e7f140a1af1 100644 --- a/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.css +++ b/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.css @@ -20,14 +20,11 @@ cursor: pointer; } -.monaco-editor.vs .lightbulb-glyph, -.monaco-editor.vs .lightbulb-glyph[data-severity="high"] { +.monaco-editor.vs .lightbulb-glyph { background: url('lightbulb.svg') center center no-repeat; } .monaco-editor.vs-dark .lightbulb-glyph, -.monaco-editor.hc-black .lightbulb-glyph, -.monaco-editor.vs-dark .lightbulb-glyph[data-severity="high"], -.monaco-editor.hc-black .lightbulb-glyph[data-severity="high"] { +.monaco-editor.hc-black .lightbulb-glyph { background: url('lightbulb-dark.svg') center center no-repeat; } diff --git a/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.ts b/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.ts index 0b46d182719..5bf5b9d9ca5 100644 --- a/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.ts +++ b/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.ts @@ -7,7 +7,6 @@ import 'vs/css!./lightBulbWidget'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import Event, { Emitter, any } from 'vs/base/common/event'; -import Severity from 'vs/base/common/severity'; import * as dom from 'vs/base/browser/dom'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { QuickFixComputeEvent } from 'vs/editor/contrib/quickFix/common/quickFixModel'; @@ -109,7 +108,6 @@ export class LightBulbWidget implements IOverlayWidget, IDisposable { this._line = line; this._visible = true; this._layout(); - this._domNode.dataset['severity'] = e.severity >= Severity.Warning ? 'high' : ''; } } diff --git a/src/vs/editor/contrib/quickFix/common/quickFixModel.ts b/src/vs/editor/contrib/quickFix/common/quickFixModel.ts index b11e3dfd362..ffe80af3091 100644 --- a/src/vs/editor/contrib/quickFix/common/quickFixModel.ts +++ b/src/vs/editor/contrib/quickFix/common/quickFixModel.ts @@ -6,7 +6,6 @@ import * as arrays from 'vs/base/common/arrays'; import Event, { Emitter } from 'vs/base/common/event'; -import Severity from 'vs/base/common/severity'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -35,13 +34,12 @@ export class QuickFixOracle { } trigger(): void { - let {range, severity} = this._rangeAtPosition(); + let range = this._rangeAtPosition(); if (!range) { range = this._editor.getSelection(); } this._signalChange({ type: 'manual', - severity, range, position: this._editor.getPosition(), fixes: range && getCodeActions(this._editor.getModel(), this._editor.getModel().validateRange(range)) @@ -60,12 +58,11 @@ export class QuickFixOracle { } private _onCursorChange(): void { - const {range, severity} = this._rangeAtPosition(); + const range = this._rangeAtPosition(); if (!Range.equalsRange(this._currentRange, range)) { this._currentRange = range; this._signalChange({ type: 'auto', - severity, range, position: this._editor.getPosition(), fixes: range && getCodeActions(this._editor.getModel(), this._editor.getModel().validateRange(range)) @@ -73,18 +70,22 @@ export class QuickFixOracle { } } - private _rangeAtPosition(): { range: IRange, severity: Severity; } { - let range: IRange; - let severity: Severity; + private _rangeAtPosition(): IRange { + + // (1) check with non empty selection + const selection = this._editor.getSelection(); + if (!selection.isEmpty()) { + return selection; + } + + // (2) check with diagnostics markers const marker = this._markerAtPosition(); if (marker) { - range = Range.lift(marker); - severity = marker.severity; - } else { - range = this._wordAtPosition(); - severity = Severity.Info; + return Range.lift(marker); } - return { range, severity }; + + // (3) check with word + return this._wordAtPosition(); } private _markerAtPosition(): IMarker { @@ -105,14 +106,14 @@ export class QuickFixOracle { } private _wordAtPosition(): IRange { - const {positionLineNumber, positionColumn} = this._editor.getSelection(); + const pos = this._editor.getPosition(); const model = this._editor.getModel(); - const info = model.getWordAtPosition({ lineNumber: positionLineNumber, column: positionColumn }); + const info = model.getWordAtPosition(pos); if (info) { return { - startLineNumber: positionLineNumber, + startLineNumber: pos.lineNumber, startColumn: info.startColumn, - endLineNumber: positionLineNumber, + endLineNumber: pos.lineNumber, endColumn: info.endColumn }; } @@ -122,7 +123,6 @@ export class QuickFixOracle { export interface QuickFixComputeEvent { type: 'auto' | 'manual'; - severity: Severity; range: IRange; position: IPosition; fixes: TPromise; diff --git a/src/vs/editor/contrib/quickFix/test/common/quickFixModel.test.ts b/src/vs/editor/contrib/quickFix/test/common/quickFixModel.test.ts index ef93ae2fb2d..18d8e0e3928 100644 --- a/src/vs/editor/contrib/quickFix/test/common/quickFixModel.test.ts +++ b/src/vs/editor/contrib/quickFix/test/common/quickFixModel.test.ts @@ -5,7 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; +import { ICommonCodeEditor, IRange } from 'vs/editor/common/editorCommon'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { Model } from 'vs/editor/common/model/model'; @@ -127,4 +127,47 @@ suite('QuickFix', () => { }); }); + test('Oracle -> selection wins over marker', () => { + + let range: IRange; + let reg = CodeActionProviderRegistry.register(languageIdentifier.language, { + provideCodeActions(doc, _range) { + range = _range; + return []; + } + }); + + markerService.changeOne('fake', uri, [{ + startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 6, + message: 'error', + severity: 1, + code: '', + source: '' + }]); + + let fixes: TPromise[] = []; + let oracle = new QuickFixOracle(editor, markerService, e => { + fixes.push(e.fixes); + }); + + editor.setSelection({ startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 13 }); + + return TPromise.join(fixes).then(_ => { + + // assert selection + assert.deepEqual(range, { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 13 }); + + range = undefined; + editor.setSelection({ startLineNumber: 1, startColumn: 2, endLineNumber: 1, endColumn: 2 }); + + return TPromise.join(fixes).then(_ => { + reg.dispose(); + oracle.dispose(); + + // assert marker + assert.deepEqual(range, { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 6 }); + }); + }); + }); + }); -- GitLab