提交 81c028ea 编写于 作者: J Johannes Rieken

fix #19562

上级 df9d8e28
......@@ -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;
}
......@@ -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' : '';
}
}
......
......@@ -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<CodeAction[]>;
......
......@@ -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<any>[] = [];
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 });
});
});
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册