diff --git a/src/vs/base/browser/ui/toolbar/toolbar.ts b/src/vs/base/browser/ui/toolbar/toolbar.ts index f359e0dbea1..00a8b5872c7 100644 --- a/src/vs/base/browser/ui/toolbar/toolbar.ts +++ b/src/vs/base/browser/ui/toolbar/toolbar.ts @@ -11,6 +11,7 @@ import { IContextMenuProvider, DropdownMenuActionItem } from 'vs/base/browser/ui import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { Disposable } from 'vs/base/common/lifecycle'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; +import { withNullAsUndefined } from 'vs/base/common/types'; export const CONTEXT = 'context.toolbar'; @@ -135,7 +136,7 @@ export class ToolBar extends Disposable { private getKeybindingLabel(action: IAction): string | undefined { const key = this.lookupKeybindings && this.options.getKeyBinding ? this.options.getKeyBinding(action) : undefined; - return (key && key.getLabel()) || undefined; + return withNullAsUndefined(key && key.getLabel()); } addPrimaryAction(primaryAction: IAction): () => void { diff --git a/src/vs/base/common/types.ts b/src/vs/base/common/types.ts index 26c669339d3..091e50b95f6 100644 --- a/src/vs/base/common/types.ts +++ b/src/vs/base/common/types.ts @@ -194,6 +194,6 @@ export function getAllPropertyNames(obj: object): string[] { /** * Converts null undefined, passes all other values through. */ -export function nullToUndefined(x: T | null): T | undefined { +export function withNullAsUndefined(x: T | null): T | undefined { return x === null ? undefined : x; } \ No newline at end of file diff --git a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts index 29e92069522..853d28ee8d4 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts @@ -471,13 +471,13 @@ class Renderer implements IRenderer { // Label const options: IIconLabelValueOptions = entry.getLabelOptions() || Object.create(null); options.matches = labelHighlights || []; - options.title = entry.getTooltip() || undefined; - options.descriptionTitle = entry.getDescriptionTooltip() || entry.getDescription() || undefined; // tooltip over description because it could overflow + options.title = types.withNullAsUndefined(entry.getTooltip()); + options.descriptionTitle = entry.getDescriptionTooltip() || types.withNullAsUndefined(entry.getDescription()); // tooltip over description because it could overflow options.descriptionMatches = descriptionHighlights || []; - data.label.setLabel(entry.getLabel() || undefined, entry.getDescription() || undefined, options); + data.label.setLabel(types.withNullAsUndefined(entry.getLabel()), types.withNullAsUndefined(entry.getDescription()), options); // Meta - data.detail.set(entry.getDetail() || undefined, detailHighlights); + data.detail.set(types.withNullAsUndefined(entry.getDetail()), detailHighlights); // Keybinding data.keybinding.set(entry.getKeybinding()!); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index a59450a3083..d337de7a17b 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -25,6 +25,7 @@ import * as perf from 'vs/base/common/performance'; import { resolveMarketplaceHeaders } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { getBackgroundColor } from 'vs/code/electron-main/theme'; import { RunOnceScheduler } from 'vs/base/common/async'; +import { withNullAsUndefined } from 'vs/base/common/types'; export interface IWindowCreationOptions { state: IWindowState; @@ -699,7 +700,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { private restoreWindowState(state?: IWindowState): IWindowState { if (state) { try { - state = this.validateWindowState(state) || undefined; + state = withNullAsUndefined(this.validateWindowState(state)); } catch (err) { this.logService.warn(`Unexpected error validating window state: ${err}\n${err.stack}`); // somehow display API can be picky about the state to validate } diff --git a/src/vs/editor/contrib/contextmenu/contextmenu.ts b/src/vs/editor/contrib/contextmenu/contextmenu.ts index 8a27b553e5e..dde109aa26f 100644 --- a/src/vs/editor/contrib/contextmenu/contextmenu.ts +++ b/src/vs/editor/contrib/contextmenu/contextmenu.ts @@ -190,7 +190,7 @@ export class ContextMenuController implements IEditorContribution { }, getKeyBinding: (action): ResolvedKeybinding | undefined => { - return this._keybindingFor(action) || undefined; + return this._keybindingFor(action); }, onHide: (wasCancelled: boolean) => { diff --git a/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts b/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts index f62e4b125d4..737f6c9ebb9 100644 --- a/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts +++ b/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts @@ -25,6 +25,7 @@ import { DefinitionAction, DefinitionActionConfig } from './goToDefinitionComman import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from 'vs/editor/contrib/goToDefinition/clickLinkGesture'; import { IWordAtPosition, IModelDeltaDecoration, ITextModel, IFoundBracket } from 'vs/editor/common/model'; import { Position } from 'vs/editor/common/core/position'; +import { withNullAsUndefined } from 'vs/base/common/types'; class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { @@ -51,7 +52,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.toUnhook.push(linkGesture); this.toUnhook.push(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { - this.startFindDefinition(mouseEvent, keyboardEvent || undefined); + this.startFindDefinition(mouseEvent, withNullAsUndefined(keyboardEvent)); })); this.toUnhook.push(linkGesture.onExecute((mouseEvent: ClickLinkMouseEvent) => { diff --git a/src/vs/editor/contrib/hover/modesContentHover.ts b/src/vs/editor/contrib/hover/modesContentHover.ts index d0f32f542eb..6ad9a822043 100644 --- a/src/vs/editor/contrib/hover/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/modesContentHover.ts @@ -40,6 +40,7 @@ import { applyCodeAction, QuickFixAction } from 'vs/editor/contrib/codeAction/co import { Action } from 'vs/base/common/actions'; import { CodeActionKind } from 'vs/editor/contrib/codeAction/codeActionTrigger'; import { IModeService } from 'vs/editor/common/services/modeService'; +import { withNullAsUndefined } from 'vs/base/common/types'; const $ = dom.$; @@ -190,7 +191,7 @@ class ModesContentComputer implements IHoverComputer { private _getLoadingMessage(): HoverPart { return { - range: this._range || undefined, + range: withNullAsUndefined(this._range), contents: [new MarkdownString().appendText(nls.localize('modesContentHover.loading', "Loading..."))] }; } diff --git a/src/vs/platform/keybinding/common/abstractKeybindingService.ts b/src/vs/platform/keybinding/common/abstractKeybindingService.ts index ae27f4b0859..4e9f67f367b 100644 --- a/src/vs/platform/keybinding/common/abstractKeybindingService.ts +++ b/src/vs/platform/keybinding/common/abstractKeybindingService.ts @@ -17,6 +17,7 @@ import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKe import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { withNullAsUndefined } from 'vs/base/common/types'; interface CurrentChord { keypress: string; @@ -99,7 +100,7 @@ export abstract class AbstractKeybindingService extends Disposable implements IK if (!result) { return undefined; } - return result.resolvedKeybinding || undefined; + return withNullAsUndefined(result.resolvedKeybinding); } public dispatchEvent(e: IKeyboardEvent, target: IContextKeyServiceTarget): boolean { diff --git a/src/vs/platform/markers/common/markerService.ts b/src/vs/platform/markers/common/markerService.ts index cb6a011a0c2..57e55246949 100644 --- a/src/vs/platform/markers/common/markerService.ts +++ b/src/vs/platform/markers/common/markerService.ts @@ -201,7 +201,7 @@ export class MarkerService implements IMarkerService { return { resource, owner, - code: code || undefined, + code, severity, message, source, diff --git a/src/vs/workbench/api/electron-browser/mainThreadEditor.ts b/src/vs/workbench/api/electron-browser/mainThreadEditor.ts index 1ae5dcb8ee7..273c3fb671d 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadEditor.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadEditor.ts @@ -16,6 +16,7 @@ import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2 import { IApplyEditsOptions, IEditorPropertiesChangeData, IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate, IUndoStopOptions, TextEditorRevealType } from 'vs/workbench/api/node/extHost.protocol'; import { EndOfLine, TextEditorLineNumbersStyle } from 'vs/workbench/api/node/extHostTypes'; import { IEditor } from 'vs/workbench/common/editor'; +import { withNullAsUndefined } from 'vs/base/common/types'; export interface IFocusTracker { onGainedFocus(): void; @@ -114,7 +115,7 @@ export class MainThreadTextEditorProperties { if (!oldProps || !MainThreadTextEditorProperties._selectionsEqual(oldProps.selections, this.selections)) { delta.selections = { selections: this.selections, - source: selectionChangeSource || undefined + source: withNullAsUndefined(selectionChangeSource) }; } diff --git a/src/vs/workbench/api/electron-browser/mainThreadTask.ts b/src/vs/workbench/api/electron-browser/mainThreadTask.ts index 8f9279e0877..89d5c5778b1 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTask.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTask.ts @@ -290,7 +290,7 @@ namespace TaskSourceDTO { scope = value.scope; } else { scope = TaskScope.Folder; - workspaceFolder = workspace.getWorkspaceFolder(URI.revive(value.scope)) || undefined; + workspaceFolder = Types.withNullAsUndefined(workspace.getWorkspaceFolder(URI.revive(value.scope))); } const result: ExtensionTaskSource = { kind: TaskSourceKind.Extension, diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index f24e0dee22e..1aef6b77688 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -24,6 +24,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { getIconClasses, getConfiguredLangId } from 'vs/editor/common/services/getIconClasses'; import { Disposable, dispose, IDisposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { withNullAsUndefined } from 'vs/base/common/types'; export interface IResourceLabelProps { resource?: uri; @@ -331,9 +332,9 @@ class ResourceLabelWidget extends IconLabel { setEditor(editor: IEditorInput, options?: IResourceLabelOptions): void { this.setResource({ - resource: toResource(editor, { supportSideBySide: true }) || undefined, - name: editor.getName() || undefined, - description: editor.getDescription() || undefined + resource: withNullAsUndefined(toResource(editor, { supportSideBySide: true })), + name: withNullAsUndefined(editor.getName()), + description: withNullAsUndefined(editor.getDescription()) }, options); } @@ -386,10 +387,10 @@ class ResourceLabelWidget extends IconLabel { } if (this.label) { - const configuredLangId = this.label.resource ? getConfiguredLangId(this.modelService, this.modeService, this.label.resource) : null; + const configuredLangId = this.label.resource ? withNullAsUndefined(getConfiguredLangId(this.modelService, this.modeService, this.label.resource)) : undefined; if (this.lastKnownConfiguredLangId !== configuredLangId) { clearIconCache = true; - this.lastKnownConfiguredLangId = configuredLangId || undefined; + this.lastKnownConfiguredLangId = configuredLangId; } } diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 800dee14596..446fff73709 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -32,6 +32,7 @@ import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { Dimension, append, $, addClass, hide, show, addClasses } from 'vs/base/browser/dom'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; +import { withNullAsUndefined } from 'vs/base/common/types'; export interface ICompositeTitleLabel { @@ -245,7 +246,7 @@ export abstract class CompositePart extends Part { // Update title with composite title if it differs from descriptor const descriptor = this.registry.getComposite(composite.getId()); if (descriptor && descriptor.name !== composite.getTitle()) { - this.updateTitle(composite.getId(), composite.getTitle() || undefined); + this.updateTitle(composite.getId(), withNullAsUndefined(composite.getTitle())); } // Handle Composite Actions diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index 84acd81c48f..aea71c112e6 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -46,6 +46,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor'; import { onDidChangeZoomLevel } from 'vs/base/browser/browser'; +import { withNullAsUndefined } from 'vs/base/common/types'; class Item extends BreadcrumbsItem { @@ -348,7 +349,7 @@ export class BreadcrumbsControl { return; } if (!editorViewState) { - editorViewState = editor.saveViewState() || undefined; + editorViewState = withNullAsUndefined(editor.saveViewState()); } const { symbol } = data.target; editor.revealRangeInCenter(symbol.range, ScrollType.Smooth); diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts index 70dbea9d198..aaca0812351 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts @@ -21,6 +21,7 @@ import { Schemas } from 'vs/base/common/network'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { BreadcrumbsConfig } from 'vs/workbench/browser/parts/editor/breadcrumbs'; import { FileKind } from 'vs/platform/files/common/files'; +import { withNullAsUndefined } from 'vs/base/common/types'; export class FileElement { constructor( @@ -105,7 +106,7 @@ export class EditorBreadcrumbsModel { } let info: FileInfo = { - folder: workspaceService.getWorkspaceFolder(uri) || undefined, + folder: withNullAsUndefined(workspaceService.getWorkspaceFolder(uri)), path: [] }; diff --git a/src/vs/workbench/browser/parts/editor/editorCommands.ts b/src/vs/workbench/browser/parts/editor/editorCommands.ts index e1e12fc7790..a3543fee3e8 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommands.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommands.ts @@ -679,7 +679,7 @@ function resolveCommandsContext(editorGroupService: IEditorGroupsService, contex // Resolve from context let group = context && typeof context.groupId === 'number' ? editorGroupService.getGroup(context.groupId) : undefined; - let editor = group && context && typeof context.editorIndex === 'number' ? group.getEditor(context.editorIndex) : undefined; + let editor = group && context && typeof context.editorIndex === 'number' ? types.withNullAsUndefined(group.getEditor(context.editorIndex)) : undefined; let control = group ? group.activeControl : undefined; // Fallback to active group as needed @@ -689,7 +689,7 @@ function resolveCommandsContext(editorGroupService: IEditorGroupsService, contex control = group.activeControl; } - return { group, editor: editor || undefined, control: control || undefined }; + return { group, editor, control }; } export function getMultiSelectedEditorContexts(editorContext: IEditorCommandsContext | undefined, listService: IListService, editorGroupService: IEditorGroupsService): IEditorCommandsContext[] { diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 4d03a2d9ab5..abb1c5ab449 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -44,6 +44,7 @@ import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuItemAc import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { isErrorWithActions, IErrorWithActions } from 'vs/base/common/errorsWithActions'; import { IActiveEditor } from 'vs/workbench/services/editor/common/editorService'; +import { withNullAsUndefined } from 'vs/base/common/types'; export class EditorGroupView extends Themable implements IEditorGroupView { @@ -657,7 +658,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { } get activeControl(): IActiveEditor | undefined { - return this.editorControl ? this.editorControl.activeControl || undefined : undefined; + return this.editorControl ? withNullAsUndefined(this.editorControl.activeControl) : undefined; } get activeEditor(): EditorInput | null { diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index e059dadcd34..6d950db1223 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -546,7 +546,7 @@ export class EditorStatus implements IStatusbarItem { private updateStatusBar(): void { const activeControl = this.editorService.activeControl; - const activeCodeEditor = activeControl ? getCodeEditor(activeControl.getControl()) || undefined : undefined; + const activeCodeEditor = activeControl ? types.withNullAsUndefined(getCodeEditor(activeControl.getControl())) : undefined; // Update all states this.onScreenReaderModeChange(activeCodeEditor); diff --git a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts index cf3cea5a88e..fb10c81714c 100644 --- a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts @@ -14,6 +14,7 @@ import { EDITOR_TITLE_HEIGHT } from 'vs/workbench/browser/parts/editor/editor'; import { IAction } from 'vs/base/common/actions'; import { CLOSE_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; import { Color } from 'vs/base/common/color'; +import { withNullAsUndefined } from 'vs/base/common/types'; interface IRenderedEditorLabel { editor?: IEditorInput; @@ -205,12 +206,12 @@ export class NoTabsTitleControl extends TitleControl { } private redraw(): void { - const editor = this.group.activeEditor; + const editor = withNullAsUndefined(this.group.activeEditor); const isEditorPinned = this.group.activeEditor ? this.group.isPinned(this.group.activeEditor) : false; const isGroupActive = this.accessor.activeGroup === this.group; - this.activeLabel = { editor: editor || undefined, pinned: isEditorPinned }; + this.activeLabel = { editor, pinned: isEditorPinned }; // Update Breadcrumbs if (this.breadcrumbsControl) { diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index e3269ec46fa..9976a9be1aa 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -40,7 +40,7 @@ import { CloseOneEditorAction } from 'vs/workbench/browser/parts/editor/editorAc import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { BreadcrumbsControl } from 'vs/workbench/browser/parts/editor/breadcrumbsControl'; import { IFileService } from 'vs/platform/files/common/files'; -import { nullToUndefined } from 'vs/base/common/types'; +import { withNullAsUndefined } from 'vs/base/common/types'; interface IEditorInputLabel { name: string; @@ -717,8 +717,8 @@ export class TabsTitleControl extends TitleControl { const labels = this.group.editors.map(editor => ({ editor, name: editor.getName()!, - description: nullToUndefined(editor.getDescription(verbosity)), - title: nullToUndefined(editor.getTitle(Verbosity.LONG)) + description: withNullAsUndefined(editor.getDescription(verbosity)), + title: withNullAsUndefined(editor.getTitle(Verbosity.LONG)) })); // Shorten labels as needed @@ -770,7 +770,7 @@ export class TabsTitleControl extends TitleControl { if (useLongDescriptions) { mapDescriptionToDuplicates.clear(); duplicateTitles.forEach(label => { - label.description = nullToUndefined(label.editor.getDescription(Verbosity.LONG)); + label.description = withNullAsUndefined(label.editor.getDescription(Verbosity.LONG)); getOrSet(mapDescriptionToDuplicates, label.description, []).push(label); }); } diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index dfa63b40cb4..1cae3892523 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -481,7 +481,7 @@ export class QuickOpenController extends Component implements IQuickOpenService // merge history and default handler results const handlerResults = (result && result.entries) || []; - this.mergeResults(quickOpenModel, handlerResults, resolvedHandler.getGroupLabel() || undefined); + this.mergeResults(quickOpenModel, handlerResults, types.withNullAsUndefined(resolvedHandler.getGroupLabel())); } }); }); @@ -528,7 +528,7 @@ export class QuickOpenController extends Component implements IQuickOpenService const placeHolderLabel = (typeof canRun === 'string') ? canRun : nls.localize('canNotRunPlaceholder', "This quick open handler can not be used in the current context"); const model = new QuickOpenModel([new PlaceholderQuickOpenEntry(placeHolderLabel)], this.actionProvider); - this.showModel(model, resolvedHandler.getAutoFocus(value, { model, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), resolvedHandler.getAriaLabel() || undefined); + this.showModel(model, resolvedHandler.getAutoFocus(value, { model, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), types.withNullAsUndefined(resolvedHandler.getAriaLabel())); return Promise.resolve(undefined); } @@ -549,9 +549,9 @@ export class QuickOpenController extends Component implements IQuickOpenService if (!token.isCancellationRequested) { if (!result || !result.entries.length) { const model = new QuickOpenModel([new PlaceholderQuickOpenEntry(resolvedHandler.getEmptyLabel(value))]); - this.showModel(model, resolvedHandler.getAutoFocus(value, { model, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), resolvedHandler.getAriaLabel() || undefined); + this.showModel(model, resolvedHandler.getAutoFocus(value, { model, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), types.withNullAsUndefined(resolvedHandler.getAriaLabel())); } else { - this.showModel(result, resolvedHandler.getAutoFocus(value, { model: result, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), resolvedHandler.getAriaLabel() || undefined); + this.showModel(result, resolvedHandler.getAutoFocus(value, { model: result, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), types.withNullAsUndefined(resolvedHandler.getAriaLabel())); } } }); diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 0baf5abf27d..5a845a75a0f 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -33,6 +33,7 @@ import { attachMenuStyler } from 'vs/platform/theme/common/styler'; import { assign } from 'vs/base/common/objects'; import { mnemonicMenuLabel, unmnemonicLabel } from 'vs/base/common/labels'; import { IAccessibilityService, AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; +import { withNullAsUndefined } from 'vs/base/common/types'; export class MenubarControl extends Disposable { @@ -565,13 +566,13 @@ export class MenubarControl extends Disposable { // first try to resolve a native accelerator const electronAccelerator = binding.getElectronAccelerator(); if (electronAccelerator) { - return { label: electronAccelerator, userSettingsLabel: binding.getUserSettingsLabel() || undefined }; + return { label: electronAccelerator, userSettingsLabel: withNullAsUndefined(binding.getUserSettingsLabel()) }; } // we need this fallback to support keybindings that cannot show in electron menus (e.g. chords) const acceleratorLabel = binding.getLabel(); if (acceleratorLabel) { - return { label: acceleratorLabel, isNative: false, userSettingsLabel: binding.getUserSettingsLabel() || undefined }; + return { label: acceleratorLabel, isNative: false, userSettingsLabel: withNullAsUndefined(binding.getUserSettingsLabel()) }; } return undefined; diff --git a/src/vs/workbench/browser/parts/views/panelViewlet.ts b/src/vs/workbench/browser/parts/views/panelViewlet.ts index 39e11e4ab9b..deac45f20b0 100644 --- a/src/vs/workbench/browser/parts/views/panelViewlet.ts +++ b/src/vs/workbench/browser/parts/views/panelViewlet.ts @@ -28,6 +28,7 @@ import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/la import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { IView } from 'vs/workbench/common/views'; import { IStorageService } from 'vs/platform/storage/common/storage'; +import { withNullAsUndefined } from 'vs/base/common/types'; export interface IPanelColors extends IColorMapping { dropBackground?: ColorIdentifier; @@ -127,7 +128,7 @@ export abstract class ViewletPanel extends Panel implements IView { orientation: ActionsOrientation.HORIZONTAL, actionItemProvider: action => this.getActionItem(action), ariaLabel: nls.localize('viewToolbarAriaLabel', "{0} actions", this.title), - getKeyBinding: action => this.keybindingService.lookupKeybinding(action.id) || undefined, + getKeyBinding: action => withNullAsUndefined(this.keybindingService.lookupKeybinding(action.id)), actionRunner: this.actionRunner }); diff --git a/src/vs/workbench/common/resources.ts b/src/vs/workbench/common/resources.ts index 465a35f6ff5..a53ba308e78 100644 --- a/src/vs/workbench/common/resources.ts +++ b/src/vs/workbench/common/resources.ts @@ -14,6 +14,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { ParsedExpression, IExpression, parse } from 'vs/base/common/glob'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; +import { withNullAsUndefined } from 'vs/base/common/types'; export class ResourceContextKey extends Disposable implements IContextKey { @@ -82,7 +83,7 @@ export class ResourceContextKey extends Disposable implements IContextKey { } get(): URI | undefined { - return this._resourceKey.get() || undefined; + return withNullAsUndefined(this._resourceKey.get()); } private static _uriEquals(a: URI | undefined | null, b: URI | undefined | null): boolean { diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index 5986e3dd9d6..24c0c41d1de 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -27,6 +27,7 @@ import { isCodeEditor, isDiffEditor, ICodeEditor, IDiffEditor } from 'vs/editor/ import { IEditorGroupView, IEditorOpeningEvent, EditorServiceImpl } from 'vs/workbench/browser/parts/editor/editor'; import { ILabelService } from 'vs/platform/label/common/label'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { withNullAsUndefined } from 'vs/base/common/types'; type ICachedEditorInput = ResourceEditorInput | IFileEditorInput | DataUriEditorInput; @@ -183,7 +184,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { get activeEditor(): IEditorInput | undefined { const activeGroup = this.editorGroupService.activeGroup; - return activeGroup ? activeGroup.activeEditor || undefined : undefined; + return activeGroup ? withNullAsUndefined(activeGroup.activeEditor) : undefined; } get visibleControls(): IEditor[] { diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index 43324615a90..f38c951ae41 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -35,6 +35,7 @@ import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/ import { IInitData } from 'vs/workbench/api/node/extHost.protocol'; import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/node/extensionHostProtocol'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; +import { withNullAsUndefined } from 'vs/base/common/types'; export interface IExtensionHostStarter { readonly onCrashed: Event<[number, string]>; @@ -434,7 +435,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { globalStorageHome: URI.file(this._environmentService.globalStorageHome) }, workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? undefined : { - configuration: workspace.configuration || undefined, + configuration: withNullAsUndefined(workspace.configuration), id: workspace.id, name: this._labelService.getWorkspaceLabel(workspace) }, diff --git a/src/vs/workbench/services/history/browser/history.ts b/src/vs/workbench/services/history/browser/history.ts index e7c495a64a4..ad9d89db16c 100644 --- a/src/vs/workbench/services/history/browser/history.ts +++ b/src/vs/workbench/services/history/browser/history.ts @@ -31,6 +31,7 @@ import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/la import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { coalesce } from 'vs/base/common/arrays'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { withNullAsUndefined } from 'vs/base/common/types'; /** * Stores the selection & view state of an editor and allows to compare it to other selection states. @@ -900,7 +901,7 @@ export class HistoryService extends Disposable implements IHistoryService { this.onEditorDispose(input, () => this.removeFromHistory(input), this.editorHistoryListeners); } - return input || undefined; + return withNullAsUndefined(input); } } diff --git a/src/vs/workbench/services/preferences/common/preferencesModels.ts b/src/vs/workbench/services/preferences/common/preferencesModels.ts index f9b721bda5d..8a32f4fcd08 100644 --- a/src/vs/workbench/services/preferences/common/preferencesModels.ts +++ b/src/vs/workbench/services/preferences/common/preferencesModels.ts @@ -22,6 +22,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { Registry } from 'vs/platform/registry/common/platform'; import { EditorModel } from 'vs/workbench/common/editor'; import { IFilterMetadata, IFilterResult, IGroupFilter, IKeybindingsEditorModel, ISearchResultGroup, ISetting, ISettingMatch, ISettingMatcher, ISettingsEditorModel, ISettingsGroup } from 'vs/workbench/services/preferences/common/preferences'; +import { withNullAsUndefined } from 'vs/base/common/types'; export const nullRange: IRange = { startLineNumber: -1, startColumn: -1, endLineNumber: -1, endColumn: -1 }; export function isNullRange(range: IRange): boolean { return range.startLineNumber === -1 && range.startColumn === -1 && range.endLineNumber === -1 && range.endColumn === -1; } @@ -335,7 +336,7 @@ function parse(model: ITextModel, isSettingsProperty: (currentProperty: string, valueRange: nullRange, descriptionRanges: [], overrides: [], - overrideOf: overrideSetting || undefined + overrideOf: withNullAsUndefined(overrideSetting) }; if (previousParents.length === settingsPropertyIndex + 1) { settings.push(setting);