cancelPreviousCalls.ts ×4

Frontier kind: Joint frontier

unlabeled · c_03217ec6cb05

3 tests · 4669 LOC · 23 files · introduces 1 test · 78 LOC · 1 file

Introduces — evidence that enters the hierarchy at this concept

Code
4 ranges78 lines · 1 files
Tests
1 test

Contains — complete concept membership

All code (extent)
670 ranges4669 lines · 23 files · Browse complete extent
All tests (intent)
3 testsBrowse complete intent

Neighbourhood graph

The orange circle is the focus. Violet and green circles are every ancestor and descendant, broader and narrower, at any distance; blue squares and pink diamonds are the introduced files and exact introduced tests of every visible concept, not only the focus's. Arrows point from broader to narrower concepts and bridge only concepts omitted from this view. Undirected links show source or test introduction. Concept and file size follows LOC; exact test nodes use test-count units.

Introduced files, introduced tests, and structurally relevant concept specialization

In the embedded map, ordinary wheel input scrolls the page; use the visible controls to zoom and drag to pan. Open the full-screen map for canvas navigation: wheel pans, Ctrl/Command plus wheel zooms, and arrow keys pan when this region is focused. On touch screens, open the full-screen map to pan or pinch. If JavaScript or WebGL is unavailable, use the native relationship evidence on this page.

Introduced files, introduced tests, and structurally relevant concept specializationcancelPreviousCalls.test|title=cancelPreviousCalls decorator different method calls must not interfere with each other|occurrence=1, cancelPreviousCalls.test|title=cancelPreviousCalls decorator cancel token of the previous call when method is called again|occurrence=1 · 0 introduced LOCcancelPreviousCalls.test…cancellation.ts ×1 · 2 introduced LOCcancellation.ts ×1cancellation.ts ×1 · 2 introduced LOCcancellation.ts ×1lifecycle.ts ×1 · 2 introduced LOClifecycle.ts ×1cancellation.ts ×1 · 1 introduced LOCcancellation.ts ×1cancellation.ts ×3 · 3 introduced LOCcancellation.ts ×3lifecycle.ts ×1 · 6 introduced LOClifecycle.ts ×1cancellation.ts ×1 · 3 introduced LOCcancellation.ts ×1cancellation.ts ×2 · 2 introduced LOCcancellation.ts ×2lifecycle.ts ×2 · 9 introduced LOClifecycle.ts ×2cancellation.ts ×1 · 2 introduced LOCcancellation.ts ×1cancellation.ts ×2 · 8 introduced LOCcancellation.ts ×2cancellation.ts ×4 · 5 introduced LOCcancellation.ts ×4lifecycle.ts ×4 · 9 introduced LOClifecycle.ts ×4cancellation.ts ×2 · 3 introduced LOCcancellation.ts ×2cancellation.ts ×1 · 2 introduced LOCcancellation.ts ×1cancelPreviousCalls.ts ×1 · 87 introduced LOCcancelPreviousCalls.ts ×…cancellation.ts ×18 · 90 introduced LOCcancellation.ts ×18lifecycle.ts ×2 · 3 introduced LOClifecycle.ts ×2lifecycle.test|title=Lifecycle dispose disposable array|occurrence=1, lifecycle.test|title=Lifecycle Action bar has broken accessibility #100273|occurrence=1 · 0 introduced LOClifecycle.test|title=Lif…event.ts ×93 · 864 introduced LOCevent.ts ×93lifecycle.ts ×1 · 6 introduced LOClifecycle.ts ×1utils.ts ×1 · 2 introduced LOCutils.ts ×1types.ts ×2 · 2 introduced LOCtypes.ts ×2utils.ts ×3 · 9 introduced LOCutils.ts ×3lifecycle.ts ×1 · 3 introduced LOClifecycle.ts ×1linkedList.ts ×13 · 44 introduced LOClinkedList.ts ×13lifecycle.ts ×1 · 4 introduced LOClifecycle.ts ×1lifecycle.ts ×2 · 6 introduced LOClifecycle.ts ×2lifecycle.ts ×2 · 4 introduced LOClifecycle.ts ×2lifecycle.ts ×1 · 6 introduced LOClifecycle.ts ×1lifecycle.ts ×1 · 1 introduced LOClifecycle.ts ×1lifecycle.ts ×1 · 3 introduced LOClifecycle.ts ×1lifecycle.ts ×3 · 9 introduced LOClifecycle.ts ×3lifecycle.ts ×1 · 7 introduced LOClifecycle.ts ×1lifecycle.ts ×4 · 7 introduced LOClifecycle.ts ×4lifecycle.ts ×4 · 8 introduced LOClifecycle.ts ×4lifecycle.ts ×6 · 16 introduced LOClifecycle.ts ×6lifecycle.ts ×2 · 2 introduced LOClifecycle.ts ×2lifecycle.ts ×1 · 3 introduced LOClifecycle.ts ×1lifecycle.ts ×3 · 3 introduced LOClifecycle.ts ×3lifecycle.ts ×1 · 2 introduced LOClifecycle.ts ×1lifecycle.ts ×1 · 2 introduced LOClifecycle.ts ×1iterator.ts ×1 · 2 introduced LOCiterator.ts ×1lifecycle.ts ×1 · 3 introduced LOClifecycle.ts ×1map.ts ×97 · 3334 introduced LOCmap.ts ×97src/vs/base/common/arrays.ts · 949 LOCcommon/arrays.tssrc/vs/base/common/arraysFind.ts · 226 LOCcommon/arraysFind.tssrc/vs/base/common/assert.ts · 91 LOCcommon/assert.tssrc/vs/base/common/cancellation.ts · 206 LOCcommon/cancellation.tssrc/vs/base/common/charCode.ts · 450 LOCcommon/charCode.tssrc/vs/base/common/collections.ts · 176 LOCcommon/collections.tssrc/vs/base/common/decorators/cancelPreviousCalls.ts · 168 LOCdecorators/cancelPreviou…src/vs/base/common/errors.ts · 357 LOCcommon/errors.tssrc/vs/base/common/event.ts · 1964 LOCcommon/event.tssrc/vs/base/common/functional.ts · 32 LOCcommon/functional.tssrc/vs/base/common/iterator.ts · 194 LOCcommon/iterator.tssrc/vs/base/common/lifecycle.ts · 974 LOCcommon/lifecycle.tssrc/vs/base/common/linkedList.ts · 151 LOCcommon/linkedList.tssrc/vs/base/common/map.ts · 1016 LOCcommon/map.tssrc/vs/base/common/marshallingIds.ts · 33 LOCcommon/marshallingIds.tssrc/vs/base/common/path.ts · 1589 LOCcommon/path.tssrc/vs/base/common/platform.ts · 281 LOCcommon/platform.tssrc/vs/base/common/process.ts · 76 LOCcommon/process.tssrc/vs/base/common/stopwatch.ts · 41 LOCcommon/stopwatch.tssrc/vs/base/common/types.ts · 410 LOCcommon/types.tssrc/vs/base/common/uri.ts · 754 LOCcommon/uri.tssrc/vs/base/test/common/utils.ts · 107 LOCcommon/utils.tssrc/vs/nls.ts · 244 LOCvs/nls.tscancelPreviousCalls.test|title=cancelPreviousCalls decorator cancel token of the previous call when method is called again|occurrence=1 · introduced test · mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/base/test/common/cancelPreviousCalls.test|title=cancelPreviousCalls decorator cancel token of the previous call when method is called again|occurrence=1cancelPreviousCalls.test…cancelPreviousCalls.test|title=cancelPreviousCalls decorator different method calls must not interfere with each other|occurrence=1 · introduced test · mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/base/test/common/cancelPreviousCalls.test|title=cancelPreviousCalls decorator different method calls must not interfere with each other|occurrence=1cancelPreviousCalls.test…cancelPreviousCalls.test|title=cancelPreviousCalls decorator should call method with CancellationToken|occurrence=1 · introduced test · mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/base/test/common/cancelPreviousCalls.test|title=cancelPreviousCalls decorator should call method with CancellationToken|occurrence=1cancelPreviousCalls.test…lifecycle.test|title=Lifecycle Action bar has broken accessibility #100273|occurrence=1 · introduced test · mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/base/test/common/lifecycle.test|title=Lifecycle Action bar has broken accessibility #100273|occurrence=1lifecycle.test|title=Lif…lifecycle.test|title=Lifecycle dispose disposable array|occurrence=1 · introduced test · mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/base/test/common/lifecycle.test|title=Lifecycle dispose disposable array|occurrence=1lifecycle.test|title=Lif…Focused concept · cancelPreviousCalls.ts ×4 · 78 introduced LOCcancelPreviousCalls.ts ×…

Graph controls are ready.

Interactive rendering requires JavaScript and WebGL. Use the native relationship evidence on this page while the interactive map is unavailable.

Native relationship evidence

Every exact file and test below is linked only from the concept that introduces it.

Introduced tests

Every collected test enters the hierarchy at exactly one concept.

1 test introduced at this concept.

Introduced code

Every collected source range enters the hierarchy at exactly one concept.

1 file ranked by introduced lines: 78 introduced LOC across 4 ranges. Expand a file to inspect source; the > gutter marks introduced lines.

src/vs/base/common/decorators/cancelPreviousCalls.ts 78 introduced LOC · 4 ranges

Open complete file

86 */
87 export function cancelPreviousCalls<
88 > TObject extends Disposable, cancelPreviousCalls.ts
89 > TArgs extends unknown[],
90 > TReturn,
91 > >(
92 > _proto: TObject,
93 > methodName: string,
94 > descriptor: TypedPropertyDescriptor<TWithOptionalCancellationToken<(...args: TArgs) => TReturn>>,
95 > ) {
96 > const originalMethod = descriptor.value;
97 >
98 > assertDefined(
99 > originalMethod,
100 > `Method '${methodName}' is not defined.`,
101 > );
102 >
103 > // we create the global map that contains `TObjectRecord` for each object instance that
104 > // uses this decorator, which itself contains a `{method name} -> TMethodRecord` mapping
105 > // for each decorated method on the object; the `TMethodRecord` record stores current
106 > // `cancellationTokenSource`, token of which was passed to the previous call of the method
107 > const objectRecords = new WeakMap<TObject, DisposableMap<string, CancellationTokenSource>>();
108 >
109 > // decorate the original method with the following logic that upon a new invocation
110 > // of the method cancels the cancellation token that was passed to a previous call
111 > descriptor.value = function (
112 > this: TObject,
113 > ...args: Parameters<typeof originalMethod>
114 > ): TReturn {
115 > // get or create a record for the current object instance
116 > // the creation is done once per each object instance
117 > let record = objectRecords.get(this);
118 > if (!record) {
119 > record = new DisposableMap();
120 > objectRecords.set(this, record);
121 >
122 > this._register({
123 > dispose: () => {
124 > objectRecords.get(this)?.dispose();
125 > objectRecords.delete(this);
126 > },
127 > });
128 > }
129 >
130 > // when the decorated method is called again and there is a cancellation token
131 > // source exists from a previous call, cancel and dispose it, then remove it
132 > record.get(methodName)?.dispose(true);
133 >
134 > // now we need to provide a cancellation token to the original method
135 > // as the last argument, there are two cases to consider:
136 > // - (common case) the arguments list does not have a cancellation token
137 > // as the last argument, - in this case we need to add a new one
138 > // - (possible case) - the arguments list already has a cancellation token
139 > // as the last argument, - in this case we need to reuse the token when
140 > // we create ours, and replace the old token with the new one
141 > // therefore,
142 >
143 > // get the last argument of the arguments list and if it is present,
144 > // reuse it as the token for the new cancellation token source
145 > const lastArgument = (args.length > 0)
146 > ? args[args.length - 1]
147 : undefined;
148 > const token = CancellationToken.isCancellationToken(lastArgument) cancelPreviousCalls.ts
149 ? lastArgument
150 > : undefined; cancelPreviousCalls.ts
151 >
152 > const cancellationSource = new CancellationTokenSource(token);
153 > record.set(methodName, cancellationSource);
154 >
155 > // then update or add cancellation token at the end of the arguments list
156 > if (CancellationToken.isCancellationToken(lastArgument)) {
157 args[args.length - 1] = cancellationSource.token;
158 > } else { cancelPreviousCalls.ts
159 > args.push(cancellationSource.token);
160 > }
161 >
162 > // finally invoke the original method passing original arguments and
163 > // the new cancellation token at the end of the arguments list
164 > return originalMethod.call(this, ...args);
165 > };
166 >
167 > return descriptor;
168 > }