提交 891ff5f7 编写于 作者: M Matt Bierner

Strict null checks

fixing simple cases of any[]
上级 9c3627d1
......@@ -22,11 +22,18 @@
"./vs/base/browser/mouseEvent.ts",
"./vs/base/browser/touch.ts",
"./vs/base/browser/ui/aria/aria.ts",
"./vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts",
"./vs/base/browser/ui/button/button.ts",
"./vs/base/browser/ui/centered/centeredViewLayout.ts",
"./vs/base/browser/ui/contextview/contextview.ts",
"./vs/base/browser/ui/countBadge/countBadge.ts",
"./vs/base/browser/ui/grid/gridview.ts",
"./vs/base/browser/ui/highlightedlabel/highlightedLabel.ts",
"./vs/base/browser/ui/iconLabel/iconLabel.ts",
"./vs/base/browser/ui/keybindingLabel/keybindingLabel.ts",
"./vs/base/browser/ui/list/list.ts",
"./vs/base/browser/ui/list/rangeMap.ts",
"./vs/base/browser/ui/list/rowCache.ts",
"./vs/base/browser/ui/list/splice.ts",
"./vs/base/browser/ui/octiconLabel/octiconLabel.mock.ts",
"./vs/base/browser/ui/octiconLabel/octiconLabel.ts",
......@@ -40,6 +47,7 @@
"./vs/base/browser/ui/scrollbar/scrollbarState.ts",
"./vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts",
"./vs/base/browser/ui/scrollbar/verticalScrollbar.ts",
"./vs/base/browser/ui/splitview/panelview.ts",
"./vs/base/browser/ui/splitview/splitview.ts",
"./vs/base/browser/ui/tree/tree.ts",
"./vs/base/browser/ui/widget.ts",
......@@ -65,6 +73,7 @@
"./vs/base/parts/ipc/node/ipc.ts",
"./vs/base/parts/ipc/test/node/testService.ts",
"./vs/base/parts/quickopen/common/quickOpen.ts",
"./vs/base/test/browser/ui/grid/util.ts",
"./vs/base/test/common/json.test.ts",
"./vs/base/test/common/jsonEdit.test.ts",
"./vs/base/test/common/jsonFormatter.test.ts",
......@@ -244,6 +253,7 @@
"./vs/editor/contrib/codeAction/codeAction.ts",
"./vs/editor/contrib/codeAction/codeActionTrigger.ts",
"./vs/editor/contrib/colorPicker/color.ts",
"./vs/editor/contrib/colorPicker/colorDetector.ts",
"./vs/editor/contrib/colorPicker/colorPickerModel.ts",
"./vs/editor/contrib/comment/blockCommentCommand.ts",
"./vs/editor/contrib/comment/comment.ts",
......@@ -399,7 +409,9 @@
"./vs/platform/quickOpen/common/quickOpen.ts",
"./vs/platform/quickinput/common/quickInput.ts",
"./vs/platform/registry/common/platform.ts",
"./vs/platform/request/electron-main/requestService.ts",
"./vs/platform/request/node/request.ts",
"./vs/platform/request/node/requestService.ts",
"./vs/platform/search/common/search.ts",
"./vs/platform/state/common/state.ts",
"./vs/platform/statusbar/common/statusbar.ts",
......
......@@ -560,7 +560,7 @@ export class Dimension {
this.height = height;
}
static equals(a: Dimension, b: Dimension): boolean {
static equals(a: Dimension | undefined, b: Dimension | undefined): boolean {
if (a === b) {
return true;
}
......
......@@ -118,7 +118,7 @@ export class BreadcrumbsWidget {
this._freeNodes.length = 0;
}
layout(dim: dom.Dimension): void {
layout(dim: dom.Dimension | undefined): void {
if (dom.Dimension.equals(dim, this._dimension)) {
return;
}
......@@ -277,8 +277,8 @@ export class BreadcrumbsWidget {
}
setItems(items: BreadcrumbsItem[]): void {
let prefix: number;
let removed: BreadcrumbsItem[];
let prefix: number | undefined;
let removed: BreadcrumbsItem[] = [];
try {
prefix = commonPrefixLength(this._items, items, (a, b) => a.equals(b));
removed = this._items.splice(prefix, this._items.length - prefix, ...items.slice(prefix));
......@@ -302,17 +302,21 @@ export class BreadcrumbsWidget {
// case a: more nodes -> remove them
while (start < this._nodes.length) {
const free = this._nodes.pop();
this._freeNodes.push(free);
free.remove();
if (free) {
this._freeNodes.push(free);
free.remove();
}
}
// case b: more items -> render them
for (; start < this._items.length; start++) {
let item = this._items[start];
let node = this._freeNodes.length > 0 ? this._freeNodes.pop() : document.createElement('div');
this._renderItem(item, node);
this._domNode.appendChild(node);
this._nodes.push(node);
if (node) {
this._renderItem(item, node);
this._domNode.appendChild(node);
this._nodes.push(node);
}
}
this.layout(undefined);
}
......@@ -327,7 +331,7 @@ export class BreadcrumbsWidget {
}
private _onClick(event: IMouseEvent): void {
for (let el = event.target; el; el = el.parentElement) {
for (let el: HTMLElement | null = event.target; el; el = el.parentElement) {
let idx = this._nodes.indexOf(el as any);
if (idx >= 0) {
this._focus(idx, event);
......
......@@ -50,12 +50,12 @@ export interface ICenteredViewStyles extends ISplitViewStyles {
export class CenteredViewLayout {
private splitView: SplitView;
private splitView?: SplitView;
private width: number = 0;
private height: number = 0;
private style: ICenteredViewStyles;
private didLayout = false;
private emptyViews: ISplitViewView[];
private emptyViews: ISplitViewView[] | undefined;
private splitViewDisposables: IDisposable[] = [];
constructor(private container: HTMLElement, private view: IView, public readonly state: CenteredViewState = GOLDEN_RATIO) {
......@@ -84,6 +84,9 @@ export class CenteredViewLayout {
}
private resizeMargins(): void {
if (!this.splitView) {
return;
}
this.splitView.resizeView(0, this.state.leftMarginRatio * this.width);
this.splitView.resizeView(2, this.state.rightMarginRatio * this.width);
}
......@@ -94,7 +97,7 @@ export class CenteredViewLayout {
styles(style: ICenteredViewStyles): void {
this.style = style;
if (this.splitView) {
if (this.splitView && this.emptyViews) {
this.splitView.style(this.style);
this.emptyViews[0].element.style.backgroundColor = this.style.background.toString();
this.emptyViews[1].element.style.backgroundColor = this.style.background.toString();
......@@ -115,8 +118,10 @@ export class CenteredViewLayout {
});
this.splitViewDisposables.push(this.splitView.onDidSashChange(() => {
this.state.leftMarginRatio = this.splitView.getViewSize(0) / this.width;
this.state.rightMarginRatio = this.splitView.getViewSize(2) / this.width;
if (this.splitView) {
this.state.leftMarginRatio = this.splitView.getViewSize(0) / this.width;
this.state.rightMarginRatio = this.splitView.getViewSize(2) / this.width;
}
}));
this.splitViewDisposables.push(this.splitView.onDidSashReset(() => {
this.state.leftMarginRatio = GOLDEN_RATIO.leftMarginRatio;
......@@ -130,9 +135,13 @@ export class CenteredViewLayout {
this.splitView.addView(this.emptyViews[0], this.state.leftMarginRatio * this.width, 0);
this.splitView.addView(this.emptyViews[1], this.state.rightMarginRatio * this.width, 2);
} else {
this.container.removeChild(this.splitView.el);
if (this.splitView) {
this.container.removeChild(this.splitView.el);
}
this.splitViewDisposables = dispose(this.splitViewDisposables);
this.splitView.dispose();
if (this.splitView) {
this.splitView.dispose();
}
this.splitView = undefined;
this.emptyViews = undefined;
this.container.appendChild(this.view.element);
......
......@@ -560,7 +560,7 @@ export class GridView implements IDisposable {
get maximumWidth(): number { return this.root.maximumHeight; }
get maximumHeight(): number { return this.root.maximumHeight; }
private _onDidChange = new Relay<{ width: number; height: number; }>();
private _onDidChange = new Relay<{ width: number; height: number; } | undefined>();
readonly onDidChange = this._onDidChange.event;
constructor(options: IGridViewOptions = {}) {
......
......@@ -90,8 +90,8 @@ export class HighlightedLabel implements IDisposable {
}
dispose() {
this.text = null;
this.highlights = null;
this.text = null!; // StrictNullOverride: nulling out ok in dispose
this.highlights = null!; // StrictNullOverride: nulling out ok in dispose
}
static escapeNewLines(text: string, highlights: IHighlight[]): string {
......
......@@ -751,7 +751,7 @@ function getContiguousRangeContaining(range: number[], value: number): number[]
return [];
}
const result = [];
const result: number[] = [];
let i = index - 1;
while (i >= 0 && range[i] === value - (index - i)) {
result.push(range[i--]);
......@@ -771,7 +771,7 @@ function getContiguousRangeContaining(range: number[], value: number): number[]
* betweem them (OR).
*/
function disjunction(one: number[], other: number[]): number[] {
const result = [];
const result: number[] = [];
let i = 0, j = 0;
while (i < one.length || j < other.length) {
......@@ -799,7 +799,7 @@ function disjunction(one: number[], other: number[]): number[] {
* complement between them (XOR).
*/
function relativeComplement(one: number[], other: number[]): number[] {
const result = [];
const result: number[] = [];
let i = 0, j = 0;
while (i < one.length || j < other.length) {
......
......@@ -188,6 +188,6 @@ export class RangeMap {
}
dispose() {
this.groups = null;
this.groups = null!; // StrictNullOverride: nulling out ok in dispose
}
}
\ No newline at end of file
......@@ -8,14 +8,16 @@ import { IDisposable } from 'vs/base/common/lifecycle';
import { $, removeClass } from 'vs/base/browser/dom';
export interface IRow {
domNode: HTMLElement;
domNode: HTMLElement | null;
templateId: string;
templateData: any;
}
function removeFromParent(element: HTMLElement): void {
try {
element.parentElement.removeChild(element);
if (element.parentElement) {
element.parentElement.removeChild(element);
}
} catch (e) {
// this will throw if this happens due to a blur event, nasty business
}
......@@ -57,8 +59,10 @@ export class RowCache<T> implements IDisposable {
private releaseRow(row: IRow): void {
const { domNode, templateId } = row;
removeClass(domNode, 'scrolling');
removeFromParent(domNode);
if (domNode) {
removeClass(domNode, 'scrolling');
removeFromParent(domNode);
}
const cache = this.getTemplateCache(templateId);
cache.push(row);
......@@ -95,6 +99,6 @@ export class RowCache<T> implements IDisposable {
dispose(): void {
this.garbageCollect();
this.cache.clear();
this.renderers = null;
this.renderers = null!; // StrictNullOverride: nulling out ok in dispose
}
}
\ No newline at end of file
......@@ -264,7 +264,7 @@ class PanelDraggable extends Disposable {
}
private onDragStart(e: DragEvent): void {
if (!this.dnd.canDrag(this.panel)) {
if (!this.dnd.canDrag(this.panel) || !e.dataTransfer) {
e.preventDefault();
e.stopPropagation();
return;
......@@ -272,7 +272,7 @@ class PanelDraggable extends Disposable {
e.dataTransfer.effectAllowed = 'move';
const dragImage = append(document.body, $('.monaco-panel-drag-image', {}, this.panel.draggableElement.textContent));
const dragImage = append(document.body, $('.monaco-panel-drag-image', {}, this.panel.draggableElement.textContent || ''));
e.dataTransfer.setDragImage(dragImage, -10, -10);
setTimeout(() => document.body.removeChild(dragImage), 0);
......@@ -371,7 +371,7 @@ interface IPanelItem {
export class PanelView extends Disposable {
private dnd: IPanelDndController | null;
private dnd: IPanelDndController | undefined;
private dndContext: IDndContext = { draggable: null };
private el: HTMLElement;
private panelItems: IPanelItem[] = [];
......
......@@ -406,7 +406,7 @@ export class IndexTreeModel<T, TFilterData = void> implements ITreeModel<T, TFil
// TODO@joao perf!
getNodeLocation(node: ITreeNode<T, TFilterData>): number[] {
const location = [];
const location: number[] = [];
while (node.parent) {
location.push(node.parent.children.indexOf(node));
......
......@@ -194,7 +194,7 @@ export function listProcesses(rootPid: number): Promise<ProcessItem> {
if (process.platform === 'linux') {
// Flatten rootItem to get a list of all VSCode processes
let processes = [rootItem];
const pids = [];
const pids: number[] = [];
while (processes.length) {
const process = processes.shift();
pids.push(process.pid);
......
......@@ -5,7 +5,7 @@
import { readdir, stat, exists, readFile } from 'fs';
import { join } from 'path';
import { parse } from 'vs/base/common/json';
import { parse, ParseError } from 'vs/base/common/json';
export interface WorkspaceStatItem {
name: string;
......@@ -37,7 +37,7 @@ export function collectLaunchConfigs(folder: string): Promise<WorkspaceStatItem[
return resolve([]);
}
const errors = [];
const errors: ParseError[] = [];
const json = parse(contents.toString(), errors);
if (errors.length) {
console.log(`Unable to parse ${launchConfig}`);
......
......@@ -279,7 +279,7 @@ suite('Base IPC', function () {
});
test('listen to events', async function () {
const messages = [];
const messages: string[] = [];
ipcService.pong(msg => messages.push(msg));
await timeout(0);
......
......@@ -61,8 +61,8 @@ export function score(target: string, query: string, queryLower: string, fuzzy:
}
function doScore(query: string, queryLower: string, queryLength: number, target: string, targetLower: string, targetLength: number): [number, number[]] {
const scores = [];
const matches = [];
const scores: number[] = [];
const matches: number[] = [];
//
// Build Scorer Matrix:
......@@ -121,7 +121,7 @@ function doScore(query: string, queryLower: string, queryLength: number, target:
}
// Restore Positions (starting from bottom right of matrix)
const positions = [];
const positions: number[] = [];
let queryIndex = queryLength - 1;
let targetIndex = targetLength - 1;
while (queryIndex >= 0 && targetIndex >= 0) {
......
......@@ -24,14 +24,14 @@ function toArray<T>(list: ITreeNode<T>[]): T[] {
suite('IndexTreeModel', function () {
test('ctor', () => {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
assert(model);
assert.equal(list.length, 0);
});
test('insert', () => {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -53,7 +53,7 @@ suite('IndexTreeModel', function () {
});
test('deep insert', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -90,7 +90,7 @@ suite('IndexTreeModel', function () {
});
test('deep insert collapsed', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -118,7 +118,7 @@ suite('IndexTreeModel', function () {
});
test('delete', () => {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -143,7 +143,7 @@ suite('IndexTreeModel', function () {
});
test('nested delete', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -177,7 +177,7 @@ suite('IndexTreeModel', function () {
});
test('deep delete', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -205,7 +205,7 @@ suite('IndexTreeModel', function () {
});
test('hidden delete', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -230,7 +230,7 @@ suite('IndexTreeModel', function () {
});
test('collapse', () => {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -261,7 +261,7 @@ suite('IndexTreeModel', function () {
});
test('expand', () => {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -301,7 +301,7 @@ suite('IndexTreeModel', function () {
});
test('collapse should recursively adjust visible count', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -334,7 +334,7 @@ suite('IndexTreeModel', function () {
});
test('simple filter', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const filter = new class implements ITreeFilter<number> {
filter(element: number): TreeVisibility {
return element % 2 === 0 ? TreeVisibility.Visible : TreeVisibility.Hidden;
......@@ -368,7 +368,7 @@ suite('IndexTreeModel', function () {
});
test('recursive filter on initial model', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const filter = new class implements ITreeFilter<number> {
filter(element: number): TreeVisibility {
return element === 0 ? TreeVisibility.Recurse : TreeVisibility.Hidden;
......@@ -390,7 +390,7 @@ suite('IndexTreeModel', function () {
});
test('refilter', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
let shouldFilter = false;
const filter = new class implements ITreeFilter<number> {
filter(element: number): TreeVisibility {
......@@ -429,7 +429,7 @@ suite('IndexTreeModel', function () {
});
test('recursive filter', function () {
const list = [] as ITreeNode<string>[];
const list: ITreeNode<string>[] = [];
let query = new RegExp('');
const filter = new class implements ITreeFilter<string> {
filter(element: string): TreeVisibility {
......@@ -475,7 +475,7 @@ suite('IndexTreeModel', function () {
});
test('recursive filter with collapse', function () {
const list = [] as ITreeNode<string>[];
const list: ITreeNode<string>[] = [];
let query = new RegExp('');
const filter = new class implements ITreeFilter<string> {
filter(element: string): TreeVisibility {
......@@ -521,7 +521,7 @@ suite('IndexTreeModel', function () {
});
test('recursive filter while collapsed', function () {
const list = [] as ITreeNode<string>[];
const list: ITreeNode<string>[] = [];
let query = new RegExp('');
const filter = new class implements ITreeFilter<string> {
filter(element: string): TreeVisibility {
......@@ -576,7 +576,7 @@ suite('IndexTreeModel', function () {
suite('getNodeLocation', function () {
test('simple', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
model.splice([0], 0, Iterator.fromArray([
......@@ -600,7 +600,7 @@ suite('IndexTreeModel', function () {
});
test('with filter', function () {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const filter = new class implements ITreeFilter<number> {
filter(element: number): TreeVisibility {
return element % 2 === 0 ? TreeVisibility.Visible : TreeVisibility.Hidden;
......
......@@ -24,7 +24,7 @@ function toArray<T>(list: ITreeNode<T>[]): T[] {
suite('ObjectTreeModel', function () {
test('ctor', () => {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list));
assert(model);
assert.equal(list.length, 0);
......@@ -32,7 +32,7 @@ suite('ObjectTreeModel', function () {
});
test('flat', () => {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list));
model.setChildren(null, Iterator.fromArray([
......@@ -59,7 +59,7 @@ suite('ObjectTreeModel', function () {
});
test('nested', () => {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list));
model.setChildren(null, Iterator.fromArray([
......@@ -95,7 +95,7 @@ suite('ObjectTreeModel', function () {
});
test('setChildren on collapsed node', () => {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list));
model.setChildren(null, Iterator.fromArray([
......@@ -116,7 +116,7 @@ suite('ObjectTreeModel', function () {
});
test('setChildren on expanded, unrevealed node', () => {
const list = [] as ITreeNode<number>[];
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list));
model.setChildren(null, [
......
......@@ -53,7 +53,7 @@ suite('Async', () => {
// Cancelling a sync cancelable promise will fire the cancelled token.
// Also, every `then` callback runs in another execution frame.
test('CancelablePromise execution order (sync)', function () {
const order = [];
const order: string[] = [];
const cancellablePromise = async.createCancelablePromise(token => {
order.push('in callback');
......@@ -75,7 +75,7 @@ suite('Async', () => {
// Cancelling an async cancelable promise is just the same as a sync cancellable promise.
test('CancelablePromise execution order (async)', function () {
const order = [];
const order: string[] = [];
const cancellablePromise = async.createCancelablePromise(token => {
order.push('in callback');
......
......@@ -830,7 +830,7 @@ export class WindowsManager implements IWindowsMainService {
}
private doExtractPathsFromAPI(openConfig: IOpenConfiguration): IPathToOpen[] {
const pathsToOpen = [];
const pathsToOpen: IPathToOpen[] = [];
const cli = openConfig.cli;
let parseOptions: IPathParseOptions = { gotoLineMode: cli && cli.goto, forceOpenWorkspaceAsFile: openConfig.forceOpenWorkspaceAsFile };
for (const pathToOpen of openConfig.urisToOpen) {
......@@ -868,7 +868,7 @@ export class WindowsManager implements IWindowsMainService {
}
private doExtractPathsFromCLI(cli: ParsedArgs): IPath[] {
const pathsToOpen = [];
const pathsToOpen: IPathToOpen[] = [];
const parseOptions: IPathParseOptions = { ignoreFileNotFound: true, gotoLineMode: cli.goto };
// folder uris
......
......@@ -30,8 +30,8 @@ export class ColorDetector implements IEditorContribution {
private _globalToDispose: IDisposable[] = [];
private _localToDispose: IDisposable[] = [];
private _computePromise: CancelablePromise<IColorData[]>;
private _timeoutTimer: TimeoutTimer;
private _computePromise: CancelablePromise<IColorData[]> | null;
private _timeoutTimer: TimeoutTimer | null;
private _decorationsIds: string[] = [];
private _colorDatas = new Map<string, IColorData>();
......@@ -108,11 +108,8 @@ export class ColorDetector implements IEditorContribution {
return;
}
const model = this._editor.getModel();
// if (!model) {
// return;
// }
if (!ColorProviderRegistry.has(model)) {
if (!model || !ColorProviderRegistry.has(model)) {
return;
}
......@@ -129,7 +126,13 @@ export class ColorDetector implements IEditorContribution {
}
private beginCompute(): void {
this._computePromise = createCancelablePromise(token => getColors(this._editor.getModel(), token));
this._computePromise = createCancelablePromise(token => {
const model = this._editor.getModel();
if (!model) {
return Promise.resolve([]);
}
return getColors(model, token);
});
this._computePromise.then((colorInfos) => {
this.updateDecorations(colorInfos);
this.updateColorDecorators(colorInfos);
......@@ -226,7 +229,12 @@ export class ColorDetector implements IEditorContribution {
}
getColorData(position: Position): IColorData | null {
const decorations = this._editor.getModel()
const model = this._editor.getModel();
if (!model) {
return null;
}
const decorations = model
.getDecorationsInRange(Range.fromPositions(position, position))
.filter(d => this._colorDatas.has(d.id));
......
......@@ -23,7 +23,7 @@ import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegist
import { EditorState, CodeEditorStateFlag } from 'vs/editor/browser/core/editorState';
import { DefinitionAction, DefinitionActionConfig } from './goToDefinitionCommands';
import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from 'vs/editor/contrib/goToDefinition/clickLinkGesture';
import { IWordAtPosition, IModelDeltaDecoration, ITextModel } from 'vs/editor/common/model';
import { IWordAtPosition, IModelDeltaDecoration, ITextModel, IFoundBracket } from 'vs/editor/common/model';
import { Position } from 'vs/editor/common/core/position';
class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution {
......@@ -205,7 +205,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC
private getPreviewRangeBasedOnBrackets(textEditorModel: ITextModel, startLineNumber: number) {
const maxLineNumber = Math.min(textEditorModel.getLineCount(), startLineNumber + GotoDefinitionWithMouseEditorContribution.MAX_SOURCE_PREVIEW_LINES);
const brackets = [];
const brackets: IFoundBracket[] = [];
let ignoreFirstEmpty = true;
let currentBracket = textEditorModel.findNextBracket(new Position(startLineNumber, 1));
......
......@@ -85,10 +85,10 @@ export class DiagnosticsService implements IDiagnosticsService {
getPerformanceInfo(info: IMainProcessInfo): Promise<PerformanceInfo> {
return listProcesses(info.mainPID).then(rootProcess => {
const workspaceInfoMessages = [];
const workspaceInfoMessages: string[] = [];
// Workspace Stats
const workspaceStatPromises = [];
const workspaceStatPromises: Promise<void>[] = [];
if (info.windows.some(window => window.folderURIs && window.folderURIs.length > 0)) {
info.windows.forEach(window => {
if (window.folderURIs.length === 0) {
......@@ -173,7 +173,7 @@ export class DiagnosticsService implements IDiagnosticsService {
console.log(this.formatProcessList(info, rootProcess));
// Workspace Stats
const workspaceStatPromises = [];
const workspaceStatPromises: Promise<void>[] = [];
if (info.windows.some(window => window.folderURIs && window.folderURIs.length > 0)) {
console.log('');
console.log('Workspace Stats: ');
......
......@@ -22,7 +22,7 @@ function serializeElement(element: Element, recursive: boolean): IElement {
attributes[attr.name] = attr.value;
}
const children = [];
const children: IElement[] = [];
if (recursive) {
for (let i = 0; i < element.children.length; i++) {
......@@ -119,7 +119,7 @@ class WindowDriver implements IWindowDriver {
const element = document.querySelector(selector);
if (element !== document.activeElement) {
const chain = [];
const chain: string[] = [];
let el = document.activeElement;
while (el) {
......
......@@ -109,7 +109,7 @@ export class Driver implements IDriver, IWindowDriverRegistry {
const resolvedKeybinding = new USLayoutResolvedKeybinding(noModifiedKeybinding, OS);
const keyCode = resolvedKeybinding.getElectronAccelerator();
const modifiers = [];
const modifiers: string[] = [];
if (keybinding.ctrlKey) {
modifiers.push('ctrl');
......
......@@ -628,8 +628,8 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
.withFilter(FilterType.ExtensionName, ...extensionNames);
return this.queryGallery(query, token).then(result => {
const dependencies = [];
const ids = [];
const dependencies: IGalleryExtension[] = [];
const ids: string[] = [];
for (let index = 0; index < result.galleryExtensions.length; index++) {
const rawExtension = result.galleryExtensions[index];
......
......@@ -655,7 +655,7 @@ export class ExtensionManagementService extends Disposable implements IExtension
return [];
}
const packedExtensions = installed.filter(i => extension.manifest.extensionPack.some(id => areSameExtensions({ id }, i.galleryIdentifier)));
const packOfPackedExtensions = [];
const packOfPackedExtensions: ILocalExtension[] = [];
for (const packedExtension of packedExtensions) {
packOfPackedExtensions.push(...this.getAllPackExtensionsToUninstall(packedExtension, installed, checked));
}
......@@ -827,7 +827,7 @@ export class ExtensionManagementService extends Disposable implements IExtension
private filterUninstalled(...ids: string[]): Promise<string[]> {
return this.withUninstalledExtensions(allUninstalled => {
const uninstalled = [];
const uninstalled: string[] = [];
for (const id of ids) {
if (!!allUninstalled[id]) {
uninstalled.push(id);
......
......@@ -20,9 +20,9 @@ export class RequestService implements IRequestService {
_serviceBrand: any;
private proxyUrl: string;
private proxyUrl?: string;
private strictSSL: boolean;
private authorization: string;
private authorization?: string;
private disposables: IDisposable[] = [];
constructor(
......@@ -35,7 +35,7 @@ export class RequestService implements IRequestService {
private configure(config: IHTTPConfiguration) {
this.proxyUrl = config.http && config.http.proxy;
this.strictSSL = config.http && config.http.proxyStrictSSL;
this.strictSSL = !!(config.http && config.http.proxyStrictSSL);
this.authorization = config.http && config.http.proxyAuthorization;
}
......@@ -43,7 +43,7 @@ export class RequestService implements IRequestService {
this.logService.trace('RequestService#request', options.url);
const { proxyUrl, strictSSL } = this;
const agentPromise = options.agent ? Promise.resolve(options.agent) : Promise.resolve(getProxyAgent(options.url, { proxyUrl, strictSSL }));
const agentPromise = options.agent ? Promise.resolve(options.agent) : Promise.resolve(getProxyAgent(options.url || '', { proxyUrl, strictSSL }));
return agentPromise.then(agent => {
options.agent = agent;
......
......@@ -35,7 +35,7 @@ interface DescriptionDiff {
export const forceColorLoad = [editorMarkerNavigationError, overviewRulerModifiedForeground, STATUS_BAR_DEBUGGING_BACKGROUND,
debugExceptionWidgetBackground, debugToolBarBackground, buttonBackground, embeddedEditorBackground];
export const experimental = []; // 'settings.modifiedItemForeground', 'editorUnnecessary.foreground' ];
export const experimental: string[] = []; // 'settings.modifiedItemForeground', 'editorUnnecessary.foreground' ];
suite('Color Registry', function () {
......
......@@ -111,7 +111,7 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution {
container = this.viewContainersRegistry.get(EXPLORER);
}
const registeredViews = ViewsRegistry.getViews(container);
const viewIds = [];
const viewIds: string[] = [];
const viewDescriptors = coalesce(entry.value.map((item, index) => {
// validate
if (viewIds.indexOf(item.id) !== -1) {
......
......@@ -133,7 +133,7 @@ class TreeViewDataProvider implements ITreeViewDataProvider {
}
private postGetChildren(elements: ITreeItem[]): ITreeItem[] {
const result = [];
const result: ITreeItem[] = [];
if (elements) {
for (const element of elements) {
this.itemsMap.set(element.handle, element);
......
......@@ -694,7 +694,7 @@ export class MenubarControl extends Disposable {
this.insertActionsBefore(action, target);
if (action instanceof SubmenuItemAction) {
const submenu = this.menuService.createMenu(action.item.submenu, this.contextKeyService);
const submenuActions = [];
const submenuActions: SubmenuAction[] = [];
updateActions(submenu, submenuActions);
target.push(new SubmenuAction(action.label, submenuActions));
} else {
......
......@@ -351,7 +351,7 @@ export class CustomTreeViewer extends Disposable implements ITreeViewer {
getOptimalWidth(): number {
if (this.tree) {
const parentNode = this.tree.getHTMLElement();
const childNodes = [].slice.call(parentNode.querySelectorAll('.outline-item-label > a'));
const childNodes = ([] as Element[]).slice.call(parentNode.querySelectorAll('.outline-item-label > a'));
return DOM.getLargestChildWidth(parentNode, childNodes);
}
return 0;
......
......@@ -127,7 +127,7 @@ export class CommentsModel {
}
private groupByResource(commentThreads: CommentThread[]): ResourceWithCommentThreads[] {
const resourceCommentThreads = [] as ResourceWithCommentThreads[];
const resourceCommentThreads: ResourceWithCommentThreads[] = [];
const commentThreadsByResource = new Map<string, ResourceWithCommentThreads>();
for (const group of groupBy(commentThreads, CommentsModel._compareURIs)) {
commentThreadsByResource.set(group[0].resource, new ResourceWithCommentThreads(URI.parse(group[0].resource), group));
......
......@@ -135,7 +135,7 @@ export class CommentService extends Disposable implements ICommentService {
}
getComments(resource: URI): Promise<CommentInfo[]> {
const result = [];
const result: Promise<CommentInfo>[] = [];
for (const handle of keys(this._commentProviders)) {
const provider = this._commentProviders.get(handle);
if ((<DocumentCommentProvider>provider).provideDocumentComments) {
......
......@@ -512,7 +512,7 @@ export class ReviewController implements IEditorContribution {
});
});
const commentingRanges = [];
const commentingRanges: IRange[] = [];
this._commentInfos.forEach(info => {
commentingRanges.push(...info.commentingRanges);
});
......
......@@ -619,7 +619,7 @@ export function getBreakpointMessageAndClassName(debugService: IDebugService, br
}
if (breakpoint.logMessage || breakpoint.condition || breakpoint.hitCondition) {
const messages = [];
const messages: string[] = [];
if (breakpoint.logMessage) {
if (session && !session.capabilities.supportsLogPoints) {
return {
......
......@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { ExperimentService, ExperimentActionType, ExperimentState } from 'vs/workbench/parts/experiments/node/experimentService';
import { ExperimentService, ExperimentActionType, ExperimentState, IExperiment } from 'vs/workbench/parts/experiments/node/experimentService';
import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { TestLifecycleService } from 'vs/workbench/test/workbenchTestServices';
......@@ -122,7 +122,7 @@ suite('Experiment Service', () => {
};
testObject = instantiationService.createInstance(TestExperimentService);
const tests = [];
const tests: TPromise<IExperiment>[] = [];
tests.push(testObject.getExperimentById('experiment1'));
tests.push(testObject.getExperimentById('experiment2'));
tests.push(testObject.getExperimentById('experiment3'));
......@@ -546,7 +546,7 @@ suite('Experiment Service', () => {
testObject = instantiationService.createInstance(TestExperimentService);
const tests = [];
const tests: TPromise<IExperiment>[] = [];
tests.push(testObject.getExperimentById('experiment1'));
tests.push(testObject.getExperimentById('experiment2'));
tests.push(testObject.getExperimentById('experiment3'));
......
......@@ -319,7 +319,7 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe
const regEx = new RegExp(EXTENSION_IDENTIFIER_PATTERN);
const invalidExtensions = [];
const invalidExtensions: string[] = [];
let message = '';
const regexFilter = (ids: string[]) => {
......
......@@ -615,7 +615,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
}
private syncWithGallery(): Promise<void> {
const ids = [], names = [];
const ids: string[] = [], names: string[] = [];
for (const installed of this.installed) {
if (installed.type === LocalExtensionType.User) {
if (installed.uuid) {
......@@ -626,7 +626,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
}
}
const promises = [];
const promises: Promise<IPager<IExtension>>[] = [];
if (ids.length) {
promises.push(this.queryGallery({ ids, pageSize: ids.length }));
}
......
......@@ -473,7 +473,7 @@ export class ExplorerView extends TreeViewsViewletPanel implements IExplorerView
public getOptimalWidth(): number {
const parentNode = this.explorerViewer.getHTMLElement();
const childNodes = [].slice.call(parentNode.querySelectorAll('.explorer-item .label-name')); // select all file labels
const childNodes = ([] as Element[]).slice.call(parentNode.querySelectorAll('.explorer-item .label-name')); // select all file labels
return DOM.getLargestChildWidth(parentNode, childNodes);
}
......
......@@ -787,7 +787,7 @@ class ActionsColumn extends Column {
render(keybindingItemEntry: IKeybindingItemEntry): void {
this.actionBar.clear();
const actions = [];
const actions: IAction[] = [];
if (keybindingItemEntry.keybindingItem.keybinding) {
actions.push(this.createEditAction(keybindingItemEntry));
} else {
......
......@@ -598,7 +598,7 @@ export class SettingsRenderer implements ITreeRenderer {
private renderGroupTitleTemplate(container: HTMLElement): IGroupTitleTemplate {
DOM.addClass(container, 'group-title');
const toDispose = [];
const toDispose: IDisposable[] = [];
const template: IGroupTitleTemplate = {
parent: container,
toDispose
......@@ -624,7 +624,7 @@ export class SettingsRenderer implements ITreeRenderer {
const deprecationWarningElement = DOM.append(container, $('.setting-item-deprecation-message'));
const toDispose = [];
const toDispose: IDisposable[] = [];
const toolbarContainer = DOM.append(container, $('.setting-toolbar-container'));
const toolbar = this.renderSettingToolbar(toolbarContainer);
......@@ -775,7 +775,7 @@ export class SettingsRenderer implements ITreeRenderer {
const deprecationWarningElement = DOM.append(container, $('.setting-item-deprecation-message'));
const toDispose = [];
const toDispose: IDisposable[] = [];
const checkbox = new Checkbox({ actionClassName: 'setting-value-checkbox', isChecked: true, title: '', inputActiveOptionBorder: null });
controlElement.appendChild(checkbox.domNode);
toDispose.push(checkbox);
......@@ -966,7 +966,7 @@ export class SettingsRenderer implements ITreeRenderer {
}
private renderNewExtensionsTemplate(container: HTMLElement): ISettingNewExtensionsTemplate {
const toDispose = [];
const toDispose: IDisposable[] = [];
container.classList.add('setting-item-new-extensions');
......
......@@ -137,7 +137,7 @@ export class SettingsTreeSettingElement extends SettingsTreeElement {
const { isConfigured, inspected, targetSelector } = inspectResult;
const displayValue = isConfigured ? inspected[targetSelector] : inspected.default;
const overriddenScopeList = [];
const overriddenScopeList: string[] = [];
if (targetSelector === 'user' && typeof inspected.workspace !== 'undefined') {
overriddenScopeList.push(localize('workspace', "Workspace"));
}
......@@ -281,7 +281,7 @@ export class SettingsTreeModel {
element.parent = parent;
element.level = this.getDepth(element);
const children = [];
const children: SettingsTreeGroupChild[] = [];
if (tocEntry.settings) {
const settingChildren = tocEntry.settings.map(s => this.createSettingsTreeSettingElement(<ISetting>s, element))
.filter(el => el.setting.deprecationMessage ? el.isConfigured : true);
......
......@@ -898,7 +898,7 @@ export class SettingsEditor2 extends BaseEditor {
// Warn for settings not included in layout
if (settingsResult.leftoverSettings.size && !this.hasWarnedMissingSettings) {
const settingKeyList = [];
const settingKeyList: string[] = [];
settingsResult.leftoverSettings.forEach(s => {
settingKeyList.push(s.key);
});
......
......@@ -121,7 +121,7 @@ export class OpenAnythingHandler extends QuickOpenHandler {
}
// Combine results.
const mergedResults = [].concat(...results.map(r => r.entries));
const mergedResults: QuickOpenEntry[] = [].concat(...results.map(r => r.entries));
// Sort
const compare = (elementA: QuickOpenEntry, elementB: QuickOpenEntry) => compareItemsByScore(elementA, elementB, query, true, QuickOpenItemAccessor, this.scorerCache);
......
......@@ -18,7 +18,7 @@ import { IProgressRunner } from 'vs/platform/progress/common/progress';
import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService';
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
import { ScrollType } from 'vs/editor/common/editorCommon';
import { ITextModel } from 'vs/editor/common/model';
import { ITextModel, IIdentifiedSingleEditOperation } from 'vs/editor/common/model';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { ResourceTextEdit } from 'vs/editor/common/modes';
import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel';
......@@ -164,7 +164,7 @@ export class ReplaceService implements IReplaceService {
private applyEditsToPreview(fileMatch: FileMatch, replaceModel: ITextModel): void {
const resourceEdits = this.createEdits(fileMatch, replaceModel.uri);
const modelEdits = [];
const modelEdits: IIdentifiedSingleEditOperation[] = [];
for (const resourceEdit of resourceEdits) {
for (const edit of resourceEdit.edits) {
const range = Range.lift(edit.range);
......
......@@ -61,7 +61,7 @@ class SplitPaneContainer {
}
// Get sizes
const sizes = [];
const sizes: number[] = [];
for (let i = 0; i < this._splitView.length; i++) {
sizes.push(this._splitView.getViewSize(i));
}
......
......@@ -208,7 +208,7 @@ export class Configuration extends BaseConfiguration {
}
compare(other: Configuration): string[] {
const result = [];
const result: string[] = [];
for (const key of this.allKeys()) {
if (!equals(this.getValue(key), other.getValue(key))
|| (this._workspace && this._workspace.folders.some(folder => !equals(this.getValue(key, { resource: folder.uri }), other.getValue(key, { resource: folder.uri }))))) {
......
......@@ -68,7 +68,7 @@ export class ChokidarWatcherService implements IWatcherService {
public setRoots(requests: IWatcherRequest[]): TPromise<void> {
const watchers = Object.create(null);
const newRequests = [];
const newRequests: string[] = [];
const requestsByBasePath = normalizeRoots(requests);
......
......@@ -169,7 +169,7 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding
}
private findUnassignedDefaultKeybindingEntryIndex(keybindingItem: ResolvedKeybindingItem, userKeybindingEntries: IUserFriendlyKeybinding[]): number[] {
const indices = [];
const indices: number[] = [];
for (let index = 0; index < userKeybindingEntries.length; index++) {
if (userKeybindingEntries[index].command === `-${keybindingItem.command}`) {
indices.push(index);
......
......@@ -157,7 +157,7 @@ export class KeybindingsEditorModel extends EditorModel {
}
private splitKeybindingWords(wordsSeparatedBySpaces: string[]): string[] {
const result = [];
const result: string[] = [];
for (const word of wordsSeparatedBySpaces) {
result.push(...word.split('+').filter(w => !!w));
}
......@@ -314,7 +314,7 @@ class KeybindingItemMatches {
let firstPartMatch: KeybindingMatch = {};
let chordPartMatch: KeybindingMatch = {};
const matchedWords = [];
const matchedWords: number[] = [];
let firstPartMatchedWords: number[] = [];
let chordPartMatchedWords: number[] = [];
let matchFirstPart = true;
......
......@@ -587,7 +587,7 @@ export class DefaultSettings extends Disposable {
}
private removeEmptySettingsGroups(settingsGroups: ISettingsGroup[]): ISettingsGroup[] {
const result = [];
const result: ISettingsGroup[] = [];
for (const settingsGroup of settingsGroups) {
settingsGroup.sections = settingsGroup.sections.filter(section => section.settings.length > 0);
if (settingsGroup.sections.length) {
......
......@@ -741,7 +741,7 @@ class AbsoluteAndRelativeParsedExpression {
}
public getPathTerms(): string[] {
const pathTerms = [];
const pathTerms: string[] = [];
if (this.absoluteParsedExpr) {
pathTerms.push(...glob.getPathTerms(this.absoluteParsedExpr));
}
......
......@@ -78,7 +78,7 @@ export class TextSearchManager {
private searchInFolder(folderQuery: IFolderQuery<URI>, onResult: (result: vscode.TextSearchResult) => void, token: CancellationToken): TPromise<vscode.TextSearchComplete> {
const queryTester = new QueryGlobTester(this.config, folderQuery);
const testingPs = [];
const testingPs: TPromise<void>[] = [];
const progress = {
report: (result: vscode.TextSearchResult) => {
const hasSibling = folderQuery.folder.scheme === 'file' && glob.hasSiblingPromiseFn(() => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册