Skip to content

Commit 1894509

Browse files
committed
es6 - replace custom LinkedList#iterator with Symbol.iterator
1 parent 80c67a3 commit 1894509

8 files changed

Lines changed: 41 additions & 44 deletions

File tree

src/vs/base/common/event.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -576,8 +576,8 @@ export class Emitter<T> {
576576
this._deliveryQueue = new LinkedList();
577577
}
578578

579-
for (let iter = this._listeners.iterator(), e = iter.next(); !e.done; e = iter.next()) {
580-
this._deliveryQueue.push([e.value, event]);
579+
for (let listener of this._listeners) {
580+
this._deliveryQueue.push([listener, event]);
581581
}
582582

583583
while (this._deliveryQueue.size > 0) {
@@ -671,8 +671,8 @@ export class AsyncEmitter<T extends IWaitUntil> extends Emitter<T> {
671671
this._asyncDeliveryQueue = new LinkedList();
672672
}
673673

674-
for (let iter = this._listeners.iterator(), e = iter.next(); !e.done; e = iter.next()) {
675-
this._asyncDeliveryQueue.push([e.value, data]);
674+
for (const listener of this._listeners) {
675+
this._asyncDeliveryQueue.push([listener, data]);
676676
}
677677

678678
while (this._asyncDeliveryQueue.size > 0 && !token.isCancellationRequested) {

src/vs/base/common/iterator.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@ export interface NativeIterator<T> {
3636

3737
export namespace Iterable {
3838

39-
export function some<T>(iterable: IterableIterator<T>, predicate: (t: T) => boolean): boolean {
39+
export function first<T>(iterable: Iterable<T>): T | undefined {
40+
return iterable[Symbol.iterator]().next().value;
41+
}
42+
43+
export function some<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): boolean {
4044
for (const element of iterable) {
4145
if (predicate(element)) {
4246
return true;
@@ -45,7 +49,7 @@ export namespace Iterable {
4549
return false;
4650
}
4751

48-
export function* map<T, R>(iterable: IterableIterator<T>, fn: (t: T) => R): IterableIterator<R> {
52+
export function* map<T, R>(iterable: Iterable<T>, fn: (t: T) => R): IterableIterator<R> {
4953
for (const element of iterable) {
5054
return yield fn(element);
5155
}

src/vs/base/common/linkedList.ts

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import * as iterator from 'vs/base/common/iterator';
7-
86
class Node<E> {
97

108
static readonly Undefined = new Node<any>(undefined);
@@ -126,26 +124,6 @@ export class LinkedList<E> {
126124
this._size -= 1;
127125
}
128126

129-
iterator(): iterator.Iterator<E> {
130-
let element: { done: false; value: E; };
131-
let node = this._first;
132-
return {
133-
next(): iterator.IteratorResult<E> {
134-
if (node === Node.Undefined) {
135-
return iterator.FIN;
136-
}
137-
138-
if (!element) {
139-
element = { done: false, value: node.element };
140-
} else {
141-
element.value = node.element;
142-
}
143-
node = node.next;
144-
return element;
145-
}
146-
};
147-
}
148-
149127
*[Symbol.iterator](): Iterator<E> {
150128
let node = this._first;
151129
while (node !== Node.Undefined) {

src/vs/base/test/common/iterator.test.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as assert from 'assert';
7-
import { Iterator } from 'vs/base/common/iterator';
7+
import { Iterator, Iterable } from 'vs/base/common/iterator';
88

99
suite('Iterator', () => {
1010
test('concat', () => {
@@ -16,4 +16,25 @@ suite('Iterator', () => {
1616

1717
assert.deepEqual(actual, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
1818
});
19-
});
19+
});
20+
21+
suite('Iterable', function () {
22+
23+
const customIterable = new class {
24+
25+
*[Symbol.iterator]() {
26+
yield 'one';
27+
yield 'two';
28+
yield 'three';
29+
}
30+
};
31+
32+
test('first', function () {
33+
34+
assert.equal(Iterable.first([]), undefined);
35+
assert.equal(Iterable.first([1]), 1);
36+
assert.equal(Iterable.first(customIterable), 'one');
37+
assert.equal(Iterable.first(customIterable), 'one'); // fresh
38+
});
39+
40+
});

src/vs/base/test/common/linkedList.test.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,8 @@ suite('LinkedList', function () {
2020
assert.deepEqual([...list], elements);
2121

2222
// assert Symbol.iterator (2)
23-
let i = 0;
2423
for (const item of list) {
25-
assert.equal(item, elements[i++]);
26-
}
27-
28-
// assert iterator
29-
for (let iter = list.iterator(), element = iter.next(); !element.done; element = iter.next()) {
30-
assert.equal(elements.shift(), element.value);
24+
assert.equal(item, elements.shift());
3125
}
3226
assert.equal(elements.length, 0);
3327
}

src/vs/editor/contrib/format/format.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { LinkedList } from 'vs/base/common/linkedList';
2828
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
2929
import { assertType } from 'vs/base/common/types';
3030
import { IProgress } from 'vs/platform/progress/common/progress';
31+
import { Iterable } from 'vs/base/common/iterator';
3132

3233
export function alertFormattingEdits(edits: ISingleEditOperation[]): void {
3334

@@ -111,7 +112,7 @@ export abstract class FormattingConflicts {
111112
if (formatter.length === 0) {
112113
return undefined;
113114
}
114-
const { value: selector } = FormattingConflicts._selectors.iterator().next();
115+
const selector = Iterable.first(FormattingConflicts._selectors);
115116
if (selector) {
116117
return await selector(formatter, document, mode);
117118
}

src/vs/platform/commands/common/commands.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Event, Emitter } from 'vs/base/common/event';
1010
import { LinkedList } from 'vs/base/common/linkedList';
1111
import { IJSONSchema } from 'vs/base/common/jsonSchema';
1212
import { keys } from 'vs/base/common/map';
13+
import { Iterable } from 'vs/base/common/iterator';
1314

1415
export const ICommandService = createDecorator<ICommandService>('commandService');
1516

@@ -119,7 +120,7 @@ export const CommandsRegistry: ICommandRegistry = new class implements ICommandR
119120
if (!list || list.isEmpty()) {
120121
return undefined;
121122
}
122-
return list.iterator().next().value;
123+
return Iterable.first(list);
123124
}
124125

125126
getCommands(): ICommandsMap {

src/vs/workbench/services/decorations/browser/decorationsService.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -364,17 +364,15 @@ export class DecorationsService implements IDecorationsService {
364364
getDecoration(uri: URI, includeChildren: boolean): IDecoration | undefined {
365365
let data: IDecorationData[] = [];
366366
let containsChildren: boolean = false;
367-
for (let iter = this._data.iterator(), next = iter.next(); !next.done; next = iter.next()) {
368-
const { label } = next.value.provider;
369-
next.value.getOrRetrieve(uri, includeChildren, (deco, isChild) => {
367+
for (let wrapper of this._data) {
368+
wrapper.getOrRetrieve(uri, includeChildren, (deco, isChild) => {
370369
if (!isChild || deco.bubble) {
371370
data.push(deco);
372371
containsChildren = isChild || containsChildren;
373-
this._logService.trace('DecorationsService#getDecoration#getOrRetrieve', label, deco, isChild, uri);
372+
this._logService.trace('DecorationsService#getDecoration#getOrRetrieve', wrapper.provider.label, deco, isChild, uri);
374373
}
375374
});
376375
}
377-
378376
return data.length === 0
379377
? undefined
380378
: this._decorationStyles.asDecoration(data, containsChildren);

0 commit comments

Comments
 (0)