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

fix #19562

上级 df9d8e28
...@@ -20,14 +20,11 @@ ...@@ -20,14 +20,11 @@
cursor: pointer; cursor: pointer;
} }
.monaco-editor.vs .lightbulb-glyph, .monaco-editor.vs .lightbulb-glyph {
.monaco-editor.vs .lightbulb-glyph[data-severity="high"] {
background: url('lightbulb.svg') center center no-repeat; background: url('lightbulb.svg') center center no-repeat;
} }
.monaco-editor.vs-dark .lightbulb-glyph, .monaco-editor.vs-dark .lightbulb-glyph,
.monaco-editor.hc-black .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"] {
background: url('lightbulb-dark.svg') center center no-repeat; background: url('lightbulb-dark.svg') center center no-repeat;
} }
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
import 'vs/css!./lightBulbWidget'; import 'vs/css!./lightBulbWidget';
import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import Event, { Emitter, any } from 'vs/base/common/event'; 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 * as dom from 'vs/base/browser/dom';
import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser';
import { QuickFixComputeEvent } from 'vs/editor/contrib/quickFix/common/quickFixModel'; import { QuickFixComputeEvent } from 'vs/editor/contrib/quickFix/common/quickFixModel';
...@@ -109,7 +108,6 @@ export class LightBulbWidget implements IOverlayWidget, IDisposable { ...@@ -109,7 +108,6 @@ export class LightBulbWidget implements IOverlayWidget, IDisposable {
this._line = line; this._line = line;
this._visible = true; this._visible = true;
this._layout(); this._layout();
this._domNode.dataset['severity'] = e.severity >= Severity.Warning ? 'high' : '';
} }
} }
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
import * as arrays from 'vs/base/common/arrays'; import * as arrays from 'vs/base/common/arrays';
import Event, { Emitter } from 'vs/base/common/event'; import Event, { Emitter } from 'vs/base/common/event';
import Severity from 'vs/base/common/severity';
import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import URI from 'vs/base/common/uri'; import URI from 'vs/base/common/uri';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
...@@ -35,13 +34,12 @@ export class QuickFixOracle { ...@@ -35,13 +34,12 @@ export class QuickFixOracle {
} }
trigger(): void { trigger(): void {
let {range, severity} = this._rangeAtPosition(); let range = this._rangeAtPosition();
if (!range) { if (!range) {
range = this._editor.getSelection(); range = this._editor.getSelection();
} }
this._signalChange({ this._signalChange({
type: 'manual', type: 'manual',
severity,
range, range,
position: this._editor.getPosition(), position: this._editor.getPosition(),
fixes: range && getCodeActions(this._editor.getModel(), this._editor.getModel().validateRange(range)) fixes: range && getCodeActions(this._editor.getModel(), this._editor.getModel().validateRange(range))
...@@ -60,12 +58,11 @@ export class QuickFixOracle { ...@@ -60,12 +58,11 @@ export class QuickFixOracle {
} }
private _onCursorChange(): void { private _onCursorChange(): void {
const {range, severity} = this._rangeAtPosition(); const range = this._rangeAtPosition();
if (!Range.equalsRange(this._currentRange, range)) { if (!Range.equalsRange(this._currentRange, range)) {
this._currentRange = range; this._currentRange = range;
this._signalChange({ this._signalChange({
type: 'auto', type: 'auto',
severity,
range, range,
position: this._editor.getPosition(), position: this._editor.getPosition(),
fixes: range && getCodeActions(this._editor.getModel(), this._editor.getModel().validateRange(range)) fixes: range && getCodeActions(this._editor.getModel(), this._editor.getModel().validateRange(range))
...@@ -73,18 +70,22 @@ export class QuickFixOracle { ...@@ -73,18 +70,22 @@ export class QuickFixOracle {
} }
} }
private _rangeAtPosition(): { range: IRange, severity: Severity; } { private _rangeAtPosition(): IRange {
let range: IRange;
let severity: Severity; // (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(); const marker = this._markerAtPosition();
if (marker) { if (marker) {
range = Range.lift(marker); return Range.lift(marker);
severity = marker.severity;
} else {
range = this._wordAtPosition();
severity = Severity.Info;
} }
return { range, severity };
// (3) check with word
return this._wordAtPosition();
} }
private _markerAtPosition(): IMarker { private _markerAtPosition(): IMarker {
...@@ -105,14 +106,14 @@ export class QuickFixOracle { ...@@ -105,14 +106,14 @@ export class QuickFixOracle {
} }
private _wordAtPosition(): IRange { private _wordAtPosition(): IRange {
const {positionLineNumber, positionColumn} = this._editor.getSelection(); const pos = this._editor.getPosition();
const model = this._editor.getModel(); const model = this._editor.getModel();
const info = model.getWordAtPosition({ lineNumber: positionLineNumber, column: positionColumn }); const info = model.getWordAtPosition(pos);
if (info) { if (info) {
return { return {
startLineNumber: positionLineNumber, startLineNumber: pos.lineNumber,
startColumn: info.startColumn, startColumn: info.startColumn,
endLineNumber: positionLineNumber, endLineNumber: pos.lineNumber,
endColumn: info.endColumn endColumn: info.endColumn
}; };
} }
...@@ -122,7 +123,6 @@ export class QuickFixOracle { ...@@ -122,7 +123,6 @@ export class QuickFixOracle {
export interface QuickFixComputeEvent { export interface QuickFixComputeEvent {
type: 'auto' | 'manual'; type: 'auto' | 'manual';
severity: Severity;
range: IRange; range: IRange;
position: IPosition; position: IPosition;
fixes: TPromise<CodeAction[]>; fixes: TPromise<CodeAction[]>;
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
'use strict'; 'use strict';
import * as assert from 'assert'; 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 URI from 'vs/base/common/uri';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
import { Model } from 'vs/editor/common/model/model'; import { Model } from 'vs/editor/common/model/model';
...@@ -127,4 +127,47 @@ suite('QuickFix', () => { ...@@ -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.
先完成此消息的编辑!
想要评论请 注册