提交 ae7d6b7c 编写于 作者: M Matt Bierner

Working on strict null checking contentHover

上级 0928a6d3
...@@ -23,6 +23,8 @@ import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contri ...@@ -23,6 +23,8 @@ import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contri
import { ContentHoverWidget } from 'vs/editor/contrib/hover/hoverWidgets'; import { ContentHoverWidget } from 'vs/editor/contrib/hover/hoverWidgets';
import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer'; import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer';
import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IThemeService } from 'vs/platform/theme/common/themeService';
import { coalesce } from 'vs/base/common/arrays';
const $ = dom.$; const $ = dom.$;
class ColorHover { class ColorHover {
...@@ -90,15 +92,16 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> { ...@@ -90,15 +92,16 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> {
const lineDecorations = this._editor.getLineDecorations(lineNumber); const lineDecorations = this._editor.getLineDecorations(lineNumber);
let didFindColor = false; let didFindColor = false;
const result = lineDecorations.map(d => { const hoverRange = this._range;
const result = lineDecorations.map((d): HoverPart | null => {
const startColumn = (d.range.startLineNumber === lineNumber) ? d.range.startColumn : 1; const startColumn = (d.range.startLineNumber === lineNumber) ? d.range.startColumn : 1;
const endColumn = (d.range.endLineNumber === lineNumber) ? d.range.endColumn : maxColumn; const endColumn = (d.range.endLineNumber === lineNumber) ? d.range.endColumn : maxColumn;
if (startColumn > this._range.startColumn || this._range.endColumn > endColumn) { if (startColumn > hoverRange.startColumn || hoverRange.endColumn > endColumn) {
return null; return null;
} }
const range = new Range(this._range.startLineNumber, startColumn, this._range.startLineNumber, endColumn); const range = new Range(hoverRange.startLineNumber, startColumn, hoverRange.startLineNumber, endColumn);
const colorData = colorDetector.getColorData(d.range.getStartPosition()); const colorData = colorDetector.getColorData(d.range.getStartPosition());
if (!didFindColor && colorData) { if (!didFindColor && colorData) {
...@@ -111,7 +114,7 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> { ...@@ -111,7 +114,7 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> {
return null; return null;
} }
let contents: IMarkdownString[]; let contents: IMarkdownString[] = [];
if (d.options.hoverMessage) { if (d.options.hoverMessage) {
if (Array.isArray(d.options.hoverMessage)) { if (Array.isArray(d.options.hoverMessage)) {
...@@ -125,7 +128,7 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> { ...@@ -125,7 +128,7 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> {
} }
}); });
return result.filter(d => !!d); return coalesce(result);
} }
onResult(result: HoverPart[], isFromSynchronousComputation: boolean): void { onResult(result: HoverPart[], isFromSynchronousComputation: boolean): void {
...@@ -154,7 +157,7 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> { ...@@ -154,7 +157,7 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> {
private _getLoadingMessage(): HoverPart { private _getLoadingMessage(): HoverPart {
return { return {
range: this._range, range: this._range || undefined,
contents: [new MarkdownString().appendText(nls.localize('modesContentHover.loading', "Loading..."))] contents: [new MarkdownString().appendText(nls.localize('modesContentHover.loading', "Loading..."))]
}; };
} }
...@@ -248,14 +251,14 @@ export class ModesContentHoverWidget extends ContentHoverWidget { ...@@ -248,14 +251,14 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
// The range might have changed, but the hover is visible // The range might have changed, but the hover is visible
// Instead of hiding it completely, filter out messages that are still in the new range and // Instead of hiding it completely, filter out messages that are still in the new range and
// kick off a new computation // kick off a new computation
if (this._showAtPosition.lineNumber !== range.startLineNumber) { if (!this._showAtPosition || this._showAtPosition.lineNumber !== range.startLineNumber) {
this.hide(); this.hide();
} else { } else {
let filteredMessages: HoverPart[] = []; let filteredMessages: HoverPart[] = [];
for (let i = 0, len = this._messages.length; i < len; i++) { for (let i = 0, len = this._messages.length; i < len; i++) {
const msg = this._messages[i]; const msg = this._messages[i];
const rng = msg.range; const rng = msg.range;
if (rng.startColumn <= range.startColumn && rng.endColumn >= range.endColumn) { if (rng && rng.startColumn <= range.startColumn && rng.endColumn >= range.endColumn) {
filteredMessages.push(msg); filteredMessages.push(msg);
} }
} }
...@@ -331,7 +334,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget { ...@@ -331,7 +334,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
.forEach(contents => { .forEach(contents => {
const renderedContents = this._markdownRenderer.render(contents); const renderedContents = this._markdownRenderer.render(contents);
markdownDisposeable = renderedContents; markdownDisposeable = renderedContents;
fragment.appendChild($('div.hover-row', null, renderedContents.element)); fragment.appendChild($('div.hover-row', undefined, renderedContents.element));
isEmptyHoverContent = false; isEmptyHoverContent = false;
}); });
} else { } else {
...@@ -341,6 +344,10 @@ export class ModesContentHoverWidget extends ContentHoverWidget { ...@@ -341,6 +344,10 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
const rgba = new RGBA(red * 255, green * 255, blue * 255, alpha); const rgba = new RGBA(red * 255, green * 255, blue * 255, alpha);
const color = new Color(rgba); const color = new Color(rgba);
if (!this._editor.hasModel()) {
return;
}
const editorModel = this._editor.getModel(); const editorModel = this._editor.getModel();
let range = new Range(msg.range.startLineNumber, msg.range.startColumn, msg.range.endLineNumber, msg.range.endColumn); let range = new Range(msg.range.startLineNumber, msg.range.startColumn, msg.range.endLineNumber, msg.range.endColumn);
let colorInfo = { range: msg.range, color: msg.color }; let colorInfo = { range: msg.range, color: msg.color };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册