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

Strict null check quickOpenController

上级 24a42d3a
...@@ -462,6 +462,8 @@ ...@@ -462,6 +462,8 @@
"./vs/workbench/browser/parts/quickinput/quickInputBox.ts", "./vs/workbench/browser/parts/quickinput/quickInputBox.ts",
"./vs/workbench/browser/parts/quickinput/quickInputList.ts", "./vs/workbench/browser/parts/quickinput/quickInputList.ts",
"./vs/workbench/browser/parts/quickinput/quickInputUtils.ts", "./vs/workbench/browser/parts/quickinput/quickInputUtils.ts",
"./vs/workbench/browser/parts/quickopen/quickOpenActions.ts",
"./vs/workbench/browser/parts/quickopen/quickOpenController.ts",
"./vs/workbench/browser/parts/quickopen/quickopen.ts", "./vs/workbench/browser/parts/quickopen/quickopen.ts",
"./vs/workbench/browser/parts/sidebar/sidebarPart.ts", "./vs/workbench/browser/parts/sidebar/sidebarPart.ts",
"./vs/workbench/browser/parts/statusbar/statusbar.ts", "./vs/workbench/browser/parts/statusbar/statusbar.ts",
......
...@@ -639,7 +639,7 @@ export class QuickOpenWidget extends Disposable implements IModelProvider { ...@@ -639,7 +639,7 @@ export class QuickOpenWidget extends Disposable implements IModelProvider {
this.setInput(input, autoFocus); this.setInput(input, autoFocus);
} }
private setInputAndLayout(input: IModel<any>, autoFocus: IAutoFocus): void { private setInputAndLayout(input: IModel<any>, autoFocus?: IAutoFocus): void {
this.treeContainer.style.height = `${this.getHeight(input)}px`; this.treeContainer.style.height = `${this.getHeight(input)}px`;
this.tree.setInput(null).then(() => { this.tree.setInput(null).then(() => {
...@@ -873,7 +873,7 @@ export class QuickOpenWidget extends Disposable implements IModelProvider { ...@@ -873,7 +873,7 @@ export class QuickOpenWidget extends Disposable implements IModelProvider {
} }
} }
setInput(input: IModel<any>, autoFocus: IAutoFocus, ariaLabel?: string): void { setInput(input: IModel<any>, autoFocus?: IAutoFocus, ariaLabel?: string): void {
if (!this.isVisible()) { if (!this.isVisible()) {
return; return;
} }
...@@ -945,7 +945,7 @@ export class QuickOpenWidget extends Disposable implements IModelProvider { ...@@ -945,7 +945,7 @@ export class QuickOpenWidget extends Disposable implements IModelProvider {
return this.inputBox; return this.inputBox;
} }
setExtraClass(clazz: string): void { setExtraClass(clazz: string | null): void {
const previousClass = this.element.getAttribute('quick-open-extra-class'); const previousClass = this.element.getAttribute('quick-open-extra-class');
if (previousClass) { if (previousClass) {
DOM.removeClasses(this.element, previousClass); DOM.removeClasses(this.element, previousClass);
......
...@@ -78,12 +78,12 @@ export class QuickOpenController extends Component implements IQuickOpenService ...@@ -78,12 +78,12 @@ export class QuickOpenController extends Component implements IQuickOpenService
private mapContextKeyToContext: { [id: string]: IContextKey<boolean>; } = Object.create(null); private mapContextKeyToContext: { [id: string]: IContextKey<boolean>; } = Object.create(null);
private handlerOnOpenCalled: { [prefix: string]: boolean; } = Object.create(null); private handlerOnOpenCalled: { [prefix: string]: boolean; } = Object.create(null);
private promisesToCompleteOnHide: ValueCallback[] = []; private promisesToCompleteOnHide: ValueCallback[] = [];
private previousActiveHandlerDescriptor: QuickOpenHandlerDescriptor; private previousActiveHandlerDescriptor: QuickOpenHandlerDescriptor | null;
private actionProvider = new ContributableActionProvider(); private actionProvider = new ContributableActionProvider();
private closeOnFocusLost: boolean; private closeOnFocusLost: boolean;
private searchInEditorHistory: boolean; private searchInEditorHistory: boolean;
private editorHistoryHandler: EditorHistoryHandler; private editorHistoryHandler: EditorHistoryHandler;
private pendingGetResultsInvocation: CancellationTokenSource; private pendingGetResultsInvocation: CancellationTokenSource | null;
constructor( constructor(
@IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService,
...@@ -165,7 +165,7 @@ export class QuickOpenController extends Component implements IQuickOpenService ...@@ -165,7 +165,7 @@ export class QuickOpenController extends Component implements IQuickOpenService
// Telemetry: log that quick open is shown and log the mode // Telemetry: log that quick open is shown and log the mode
const registry = Registry.as<IQuickOpenRegistry>(Extensions.Quickopen); const registry = Registry.as<IQuickOpenRegistry>(Extensions.Quickopen);
const handlerDescriptor = registry.getQuickOpenHandler(prefix) || registry.getDefaultQuickOpenHandler(); const handlerDescriptor = (prefix ? registry.getQuickOpenHandler(prefix) : undefined) || registry.getDefaultQuickOpenHandler();
// Trigger onOpen // Trigger onOpen
this.resolveHandler(handlerDescriptor); this.resolveHandler(handlerDescriptor);
...@@ -206,7 +206,7 @@ export class QuickOpenController extends Component implements IQuickOpenService ...@@ -206,7 +206,7 @@ export class QuickOpenController extends Component implements IQuickOpenService
} else { } else {
const editorHistory = this.getEditorHistoryWithGroupLabel(); const editorHistory = this.getEditorHistoryWithGroupLabel();
if (editorHistory.getEntries().length < 2) { if (editorHistory.getEntries().length < 2) {
quickNavigateConfiguration = null; // If no entries can be shown, default to normal quick open mode quickNavigateConfiguration = undefined; // If no entries can be shown, default to normal quick open mode
} }
// Compute auto focus // Compute auto focus
...@@ -270,7 +270,10 @@ export class QuickOpenController extends Component implements IQuickOpenService ...@@ -270,7 +270,10 @@ export class QuickOpenController extends Component implements IQuickOpenService
// Complete promises that are waiting // Complete promises that are waiting
while (this.promisesToCompleteOnHide.length) { while (this.promisesToCompleteOnHide.length) {
this.promisesToCompleteOnHide.pop()(true); const callback = this.promisesToCompleteOnHide.pop();
if (callback) {
callback(true);
}
} }
if (reason !== HideReason.FOCUS_LOST) { if (reason !== HideReason.FOCUS_LOST) {
...@@ -297,7 +300,7 @@ export class QuickOpenController extends Component implements IQuickOpenService ...@@ -297,7 +300,7 @@ export class QuickOpenController extends Component implements IQuickOpenService
} }
private setQuickOpenContextKey(id?: string): void { private setQuickOpenContextKey(id?: string): void {
let key: IContextKey<boolean>; let key: IContextKey<boolean> | undefined;
if (id) { if (id) {
key = this.mapContextKeyToContext[id]; key = this.mapContextKeyToContext[id];
if (!key) { if (!key) {
...@@ -479,13 +482,13 @@ export class QuickOpenController extends Component implements IQuickOpenService ...@@ -479,13 +482,13 @@ export class QuickOpenController extends Component implements IQuickOpenService
// merge history and default handler results // merge history and default handler results
const handlerResults = (result && result.entries) || []; const handlerResults = (result && result.entries) || [];
this.mergeResults(quickOpenModel, handlerResults, resolvedHandler.getGroupLabel()); this.mergeResults(quickOpenModel, handlerResults, resolvedHandler.getGroupLabel() || undefined);
} }
}); });
}); });
} }
private mergeResults(quickOpenModel: QuickOpenModel, handlerResults: QuickOpenEntry[], groupLabel: string): void { private mergeResults(quickOpenModel: QuickOpenModel, handlerResults: QuickOpenEntry[], groupLabel: string | undefined): void {
// Remove results already showing by checking for a "resource" property // Remove results already showing by checking for a "resource" property
const mapEntryToResource = this.mapEntriesToResource(quickOpenModel); const mapEntryToResource = this.mapEntriesToResource(quickOpenModel);
...@@ -526,7 +529,7 @@ export class QuickOpenController extends Component implements IQuickOpenService ...@@ -526,7 +529,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 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); const model = new QuickOpenModel([new PlaceholderQuickOpenEntry(placeHolderLabel)], this.actionProvider);
this.showModel(model, resolvedHandler.getAutoFocus(value, { model, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), resolvedHandler.getAriaLabel()); this.showModel(model, resolvedHandler.getAutoFocus(value, { model, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), resolvedHandler.getAriaLabel() || undefined);
return Promise.resolve(undefined); return Promise.resolve(undefined);
} }
...@@ -547,9 +550,9 @@ export class QuickOpenController extends Component implements IQuickOpenService ...@@ -547,9 +550,9 @@ export class QuickOpenController extends Component implements IQuickOpenService
if (!token.isCancellationRequested) { if (!token.isCancellationRequested) {
if (!result || !result.entries.length) { if (!result || !result.entries.length) {
const model = new QuickOpenModel([new PlaceholderQuickOpenEntry(resolvedHandler.getEmptyLabel(value))]); const model = new QuickOpenModel([new PlaceholderQuickOpenEntry(resolvedHandler.getEmptyLabel(value))]);
this.showModel(model, resolvedHandler.getAutoFocus(value, { model, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), resolvedHandler.getAriaLabel()); this.showModel(model, resolvedHandler.getAutoFocus(value, { model, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), resolvedHandler.getAriaLabel() || undefined);
} else { } else {
this.showModel(result, resolvedHandler.getAutoFocus(value, { model: result, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), resolvedHandler.getAriaLabel()); this.showModel(result, resolvedHandler.getAutoFocus(value, { model: result, quickNavigateConfiguration: this.quickOpenWidget.getQuickNavigateConfiguration() }), resolvedHandler.getAriaLabel() || undefined);
} }
} }
}); });
...@@ -570,15 +573,16 @@ export class QuickOpenController extends Component implements IQuickOpenService ...@@ -570,15 +573,16 @@ export class QuickOpenController extends Component implements IQuickOpenService
} }
private clearModel(): void { private clearModel(): void {
this.showModel(new QuickOpenModel(), null); this.showModel(new QuickOpenModel(), undefined);
} }
private mapEntriesToResource(model: QuickOpenModel): { [resource: string]: QuickOpenEntry; } { private mapEntriesToResource(model: QuickOpenModel): { [resource: string]: QuickOpenEntry; } {
const entries = model.getEntries(); const entries = model.getEntries();
const mapEntryToPath: { [path: string]: QuickOpenEntry; } = {}; const mapEntryToPath: { [path: string]: QuickOpenEntry; } = {};
entries.forEach((entry: QuickOpenEntry) => { entries.forEach((entry: QuickOpenEntry) => {
if (entry.getResource()) { const resource = entry.getResource();
mapEntryToPath[entry.getResource().toString()] = entry; if (resource) {
mapEntryToPath[resource.toString()] = entry;
} }
}); });
...@@ -655,7 +659,7 @@ class EditorHistoryHandler { ...@@ -655,7 +659,7 @@ class EditorHistoryHandler {
getResults(searchValue?: string, token?: CancellationToken): QuickOpenEntry[] { getResults(searchValue?: string, token?: CancellationToken): QuickOpenEntry[] {
// Massage search for scoring // Massage search for scoring
const query = prepareQuery(searchValue); const query = prepareQuery(searchValue || '');
// Just return all if we are not searching // Just return all if we are not searching
const history = this.historyService.getHistory(); const history = this.historyService.getHistory();
...@@ -670,7 +674,7 @@ class EditorHistoryHandler { ...@@ -670,7 +674,7 @@ class EditorHistoryHandler {
// For now, only support to match on inputs that provide resource information // For now, only support to match on inputs that provide resource information
.filter(input => { .filter(input => {
let resource: URI; let resource: URI | undefined;
if (input instanceof EditorInput) { if (input instanceof EditorInput) {
resource = resourceForEditorHistory(input, this.fileService); resource = resourceForEditorHistory(input, this.fileService);
} else { } else {
...@@ -690,7 +694,7 @@ class EditorHistoryHandler { ...@@ -690,7 +694,7 @@ class EditorHistoryHandler {
return false; return false;
} }
e.setHighlights(itemScore.labelMatch, itemScore.descriptionMatch); e.setHighlights(itemScore.labelMatch || [], itemScore.descriptionMatch);
return true; return true;
}) })
...@@ -707,8 +711,8 @@ class EditorHistoryItemAccessorClass extends QuickOpenItemAccessorClass { ...@@ -707,8 +711,8 @@ class EditorHistoryItemAccessorClass extends QuickOpenItemAccessorClass {
super(); super();
} }
getItemDescription(entry: QuickOpenEntry): string { getItemDescription(entry: QuickOpenEntry): string | null {
return this.allowMatchOnDescription ? entry.getDescription() : undefined; return this.allowMatchOnDescription ? entry.getDescription() : null;
} }
} }
...@@ -721,9 +725,9 @@ export class EditorHistoryEntryGroup extends QuickOpenEntryGroup { ...@@ -721,9 +725,9 @@ export class EditorHistoryEntryGroup extends QuickOpenEntryGroup {
export class EditorHistoryEntry extends EditorQuickOpenEntry { export class EditorHistoryEntry extends EditorQuickOpenEntry {
private input: IEditorInput | IResourceInput; private input: IEditorInput | IResourceInput;
private resource: URI; private resource: URI | undefined;
private label: string; private label: string | null;
private description: string; private description: string | null;
private dirty: boolean; private dirty: boolean;
constructor( constructor(
...@@ -749,7 +753,7 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry { ...@@ -749,7 +753,7 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry {
const resourceInput = input as IResourceInput; const resourceInput = input as IResourceInput;
this.resource = resourceInput.resource; this.resource = resourceInput.resource;
this.label = resources.basenameOrAuthority(resourceInput.resource); this.label = resources.basenameOrAuthority(resourceInput.resource);
this.description = labelService.getUriLabel(resources.dirname(this.resource), { relative: true }); this.description = labelService.getUriLabel(resources.dirname(this.resource)!, { relative: true });
this.dirty = this.resource && this.textFileService.isDirty(this.resource); this.dirty = this.resource && this.textFileService.isDirty(this.resource);
if (this.dirty && this.textFileService.getAutoSaveMode() === AutoSaveMode.AFTER_SHORT_DELAY) { if (this.dirty && this.textFileService.getAutoSaveMode() === AutoSaveMode.AFTER_SHORT_DELAY) {
...@@ -762,7 +766,7 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry { ...@@ -762,7 +766,7 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry {
return this.dirty ? 'dirty' : ''; return this.dirty ? 'dirty' : '';
} }
getLabel(): string { getLabel(): string | null {
return this.label; return this.label;
} }
...@@ -776,12 +780,12 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry { ...@@ -776,12 +780,12 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry {
return nls.localize('entryAriaLabel', "{0}, recently opened", this.getLabel()); return nls.localize('entryAriaLabel', "{0}, recently opened", this.getLabel());
} }
getDescription(): string { getDescription(): string | null {
return this.description; return this.description;
} }
getResource(): URI { getResource(): URI | null {
return this.resource; return this.resource || null;
} }
getInput(): IEditorInput | IResourceInput { getInput(): IEditorInput | IResourceInput {
...@@ -806,7 +810,7 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry { ...@@ -806,7 +810,7 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry {
} }
} }
function resourceForEditorHistory(input: EditorInput, fileService: IFileService): URI { function resourceForEditorHistory(input: EditorInput, fileService: IFileService): URI | undefined {
const resource = input ? input.getResource() : undefined; const resource = input ? input.getResource() : undefined;
// For the editor history we only prefer resources that are either untitled or // For the editor history we only prefer resources that are either untitled or
...@@ -846,7 +850,7 @@ export class RemoveFromEditorHistoryAction extends Action { ...@@ -846,7 +850,7 @@ export class RemoveFromEditorHistoryAction extends Action {
return <IHistoryPickEntry>{ return <IHistoryPickEntry>{
input: h, input: h,
iconClasses: getIconClasses(this.modelService, this.modeService, entry.getResource()), iconClasses: getIconClasses(this.modelService, this.modeService, entry.getResource() || undefined),
label: entry.getLabel(), label: entry.getLabel(),
description: entry.getDescription() description: entry.getDescription()
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册