monaco-editor-core 0.54.0-dev-20250911 → 0.54.0-dev-20250913
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/nls.messages.de.js +1 -1
- package/esm/nls.messages.es.js +1 -1
- package/esm/nls.messages.fr.js +1 -1
- package/esm/nls.messages.it.js +1 -1
- package/esm/nls.messages.ja.js +1 -1
- package/esm/nls.messages.ko.js +1 -1
- package/esm/nls.messages.ru.js +1 -1
- package/esm/nls.messages.zh-cn.js +1 -1
- package/esm/nls.messages.zh-tw.js +1 -1
- package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- package/esm/vs/base/browser/ui/menu/menu.js +2 -0
- package/esm/vs/base/browser/ui/menu/menu.js.map +1 -1
- package/esm/vs/base/common/observableInternal/index.js +3 -0
- package/esm/vs/base/common/observableInternal/index.js.map +1 -1
- package/esm/vs/base/common/observableInternal/logging/debugGetDependencyGraph.js +71 -0
- package/esm/vs/base/common/observableInternal/logging/debugGetDependencyGraph.js.map +1 -0
- package/esm/vs/base/common/observableInternal/observables/baseObservable.js +4 -0
- package/esm/vs/base/common/observableInternal/observables/baseObservable.js.map +1 -1
- package/esm/vs/base/common/observableInternal/observables/derivedImpl.js +10 -0
- package/esm/vs/base/common/observableInternal/observables/derivedImpl.js.map +1 -1
- package/esm/vs/base/common/observableInternal/observables/observableFromEvent.js +3 -0
- package/esm/vs/base/common/observableInternal/observables/observableFromEvent.js.map +1 -1
- package/esm/vs/base/common/observableInternal/reactions/autorunImpl.js +9 -0
- package/esm/vs/base/common/observableInternal/reactions/autorunImpl.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/commands.js +12 -1
- package/esm/vs/editor/browser/widget/diffEditor/commands.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js +25 -0
- package/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js.map +1 -1
- package/esm/vs/editor/common/core/ranges/lineRange.js +3 -0
- package/esm/vs/editor/common/core/ranges/lineRange.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js +4 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js +2 -0
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js +1 -0
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +2 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js.map +1 -1
- package/esm/vs/platform/actionWidget/browser/actionList.js +3 -0
- package/esm/vs/platform/actionWidget/browser/actionList.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInput.js +2 -2
- package/esm/vs/platform/quickinput/browser/quickInput.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputController.js +4 -0
- package/esm/vs/platform/quickinput/browser/quickInputController.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeController.js +12 -0
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeController.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeRenderer.js +11 -5
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeRenderer.js.map +1 -1
- package/esm/vs/platform/quickinput/common/quickInput.js.map +1 -1
- package/package.json +6 -2
- package/version.txt +1 -1
|
@@ -26,6 +26,9 @@ import { addLogger, setLogObservableFn } from './logging/logging.js';
|
|
|
26
26
|
import { ConsoleObservableLogger, logObservableToConsole } from './logging/consoleObservableLogger.js';
|
|
27
27
|
import { DevToolsLogger } from './logging/debugger/devToolsLogger.js';
|
|
28
28
|
import { env } from '../process.js';
|
|
29
|
+
import { _setDebugGetDependencyGraph } from './observables/baseObservable.js';
|
|
30
|
+
import { debugGetDependencyGraph } from './logging/debugGetDependencyGraph.js';
|
|
31
|
+
_setDebugGetDependencyGraph(debugGetDependencyGraph);
|
|
29
32
|
setLogObservableFn(logObservableToConsole);
|
|
30
33
|
// Remove "//" in the next line to enable logging
|
|
31
34
|
const enableLogging = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/common/observableInternal/index.ts","vs/base/common/observableInternal/index.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,6EAA6E;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAEnJ,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE5H,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EACvD,kCAAkC,EAAE,YAAY,EAAE,wBAAwB,EAC1E,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAA4C,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAA0B,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACrH,OAAO,EAAE,kCAAkC,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACzH,OAAO,EAAE,WAAW,EAAE,gCAAgC,EAAE,oBAAoB,EAAwB,MAAM,wBAAwB,CAAC;AACnI,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACvG,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/common/observableInternal/index.ts","vs/base/common/observableInternal/index.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,6EAA6E;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAEnJ,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE5H,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EACvD,kCAAkC,EAAE,YAAY,EAAE,wBAAwB,EAC1E,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAA4C,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAA0B,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACrH,OAAO,EAAE,kCAAkC,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACzH,OAAO,EAAE,WAAW,EAAE,gCAAgC,EAAE,oBAAoB,EAAwB,MAAM,wBAAwB,CAAC;AACnI,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACvG,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,2BAA2B,CAAC,uBAAuB,CAAC,CAAC;AACrD,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;AAE3C,iDAAiD;AACjD,MAAM,aAAa,GAAG,KAAK,CAEzB;AAEF,IAAI,aAAa,EAAE,CAAC;IACnB,SAAS,CAAC,IAAI,uBAAuB,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,IAAI,GAAG,IAAI,GAAG,CAAC,8BAA8B,CAAC,EAAE,CAAC;IAChD,kFAAkF;IAClF,SAAS,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;AACzC,CAAC","file":"index.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n// This is a facade for the observable implementation. Only import from here!\n\nexport { observableValueOpts } from './observables/observableValueOpts.js';\nexport { autorun, autorunDelta, autorunHandleChanges, autorunOpts, autorunWithStore, autorunWithStoreHandleChanges } from './reactions/autorun.js';\nexport { type IObservable, type IObservableWithChange, type IObserver, type IReader, type ISettable, type ISettableObservable, type ITransaction } from './base.js';\nexport { disposableObservableValue } from './observables/observableValue.js';\nexport { derived, derivedDisposable, derivedHandleChanges, derivedOpts, derivedWithSetter } from './observables/derived.js';\nexport { type IDerivedReader } from './observables/derivedImpl.js';\nexport { ObservablePromise, PromiseResult } from './utils/promise.js';\nexport { waitForState } from './utils/utilsCancellation.js';\nexport { debouncedObservable, derivedObservableWithCache,\n\tderivedObservableWithWritableCache, keepObserved, mapObservableArrayCached,\n\trecomputeInitiallyAndOnChange } from './utils/utils.js';\nexport { type DebugOwner } from './debugName.js';\nexport { type IChangeContext, type IChangeTracker, recordChanges, recordChangesLazy } from './changeTracker.js';\nexport { constObservable } from './observables/constObservable.js';\nexport { type IObservableSignal, observableSignal } from './observables/observableSignal.js';\nexport { observableFromEventOpts } from './observables/observableFromEvent.js';\nexport { observableSignalFromEvent } from './observables/observableSignalFromEvent.js';\nexport { asyncTransaction, globalTransaction, subtransaction, transaction, TransactionImpl } from './transaction.js';\nexport { observableFromValueWithChangeEvent, ValueWithChangeEventFromObservable } from './utils/valueWithChangeEvent.js';\nexport { runOnChange, runOnChangeWithCancellationToken, runOnChangeWithStore, type RemoveUndefined } from './utils/runOnChange.js';\nexport { derivedConstOnceDefined } from './experimental/utils.js';\nexport { observableFromEvent } from './observables/observableFromEvent.js';\nexport { observableValue } from './observables/observableValue.js';\nexport { DebugLocation } from './debugLocation.js';\n\nimport { addLogger, setLogObservableFn } from './logging/logging.js';\nimport { ConsoleObservableLogger, logObservableToConsole } from './logging/consoleObservableLogger.js';\nimport { DevToolsLogger } from './logging/debugger/devToolsLogger.js';\nimport { env } from '../process.js';\nimport { _setDebugGetDependencyGraph } from './observables/baseObservable.js';\nimport { debugGetDependencyGraph } from './logging/debugGetDependencyGraph.js';\n\n_setDebugGetDependencyGraph(debugGetDependencyGraph);\nsetLogObservableFn(logObservableToConsole);\n\n// Remove \"//\" in the next line to enable logging\nconst enableLogging = false\n\t// || Boolean(\"true\") // done \"weirdly\" so that a lint warning prevents you from pushing this\n\t;\n\nif (enableLogging) {\n\taddLogger(new ConsoleObservableLogger());\n}\n\nif (env && env['VSCODE_DEV_DEBUG_OBSERVABLES']) {\n\t// To debug observables you also need the extension \"ms-vscode.debug-value-editor\"\n\taddLogger(DevToolsLogger.getInstance());\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n// This is a facade for the observable implementation. Only import from here!\n\nexport { observableValueOpts } from './observables/observableValueOpts.js';\nexport { autorun, autorunDelta, autorunHandleChanges, autorunOpts, autorunWithStore, autorunWithStoreHandleChanges } from './reactions/autorun.js';\nexport { type IObservable, type IObservableWithChange, type IObserver, type IReader, type ISettable, type ISettableObservable, type ITransaction } from './base.js';\nexport { disposableObservableValue } from './observables/observableValue.js';\nexport { derived, derivedDisposable, derivedHandleChanges, derivedOpts, derivedWithSetter } from './observables/derived.js';\nexport { type IDerivedReader } from './observables/derivedImpl.js';\nexport { ObservablePromise, PromiseResult } from './utils/promise.js';\nexport { waitForState } from './utils/utilsCancellation.js';\nexport { debouncedObservable, derivedObservableWithCache,\n\tderivedObservableWithWritableCache, keepObserved, mapObservableArrayCached,\n\trecomputeInitiallyAndOnChange } from './utils/utils.js';\nexport { type DebugOwner } from './debugName.js';\nexport { type IChangeContext, type IChangeTracker, recordChanges, recordChangesLazy } from './changeTracker.js';\nexport { constObservable } from './observables/constObservable.js';\nexport { type IObservableSignal, observableSignal } from './observables/observableSignal.js';\nexport { observableFromEventOpts } from './observables/observableFromEvent.js';\nexport { observableSignalFromEvent } from './observables/observableSignalFromEvent.js';\nexport { asyncTransaction, globalTransaction, subtransaction, transaction, TransactionImpl } from './transaction.js';\nexport { observableFromValueWithChangeEvent, ValueWithChangeEventFromObservable } from './utils/valueWithChangeEvent.js';\nexport { runOnChange, runOnChangeWithCancellationToken, runOnChangeWithStore, type RemoveUndefined } from './utils/runOnChange.js';\nexport { derivedConstOnceDefined } from './experimental/utils.js';\nexport { observableFromEvent } from './observables/observableFromEvent.js';\nexport { observableValue } from './observables/observableValue.js';\nexport { DebugLocation } from './debugLocation.js';\n\nimport { addLogger, setLogObservableFn } from './logging/logging.js';\nimport { ConsoleObservableLogger, logObservableToConsole } from './logging/consoleObservableLogger.js';\nimport { DevToolsLogger } from './logging/debugger/devToolsLogger.js';\nimport { env } from '../process.js';\nimport { _setDebugGetDependencyGraph } from './observables/baseObservable.js';\nimport { debugGetDependencyGraph } from './logging/debugGetDependencyGraph.js';\n\n_setDebugGetDependencyGraph(debugGetDependencyGraph);\nsetLogObservableFn(logObservableToConsole);\n\n// Remove \"//\" in the next line to enable logging\nconst enableLogging = false\n\t// || Boolean(\"true\") // done \"weirdly\" so that a lint warning prevents you from pushing this\n\t;\n\nif (enableLogging) {\n\taddLogger(new ConsoleObservableLogger());\n}\n\nif (env && env['VSCODE_DEV_DEBUG_OBSERVABLES']) {\n\t// To debug observables you also need the extension \"ms-vscode.debug-value-editor\"\n\taddLogger(DevToolsLogger.getInstance());\n}\n"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { Derived } from '../observables/derivedImpl.js';
|
|
6
|
+
import { FromEventObservable } from '../observables/observableFromEvent.js';
|
|
7
|
+
import { ObservableValue } from '../observables/observableValue.js';
|
|
8
|
+
import { AutorunObserver } from '../reactions/autorunImpl.js';
|
|
9
|
+
import { formatValue } from './consoleObservableLogger.js';
|
|
10
|
+
export function debugGetDependencyGraph(obs, options) {
|
|
11
|
+
const debugNamePostProcessor = options?.debugNamePostProcessor ?? ((str) => str);
|
|
12
|
+
const info = Info.from(obs, debugNamePostProcessor);
|
|
13
|
+
if (!info) {
|
|
14
|
+
return '';
|
|
15
|
+
}
|
|
16
|
+
const alreadyListed = new Set();
|
|
17
|
+
return formatObservableInfo(info, 0, alreadyListed).trim();
|
|
18
|
+
}
|
|
19
|
+
function formatObservableInfo(info, indentLevel, alreadyListed) {
|
|
20
|
+
const indent = '\t\t'.repeat(indentLevel);
|
|
21
|
+
const lines = [];
|
|
22
|
+
const isAlreadyListed = alreadyListed.has(info.sourceObj);
|
|
23
|
+
if (isAlreadyListed) {
|
|
24
|
+
lines.push(`${indent}* ${info.type} ${info.name} (already listed)`);
|
|
25
|
+
return lines.join('\n');
|
|
26
|
+
}
|
|
27
|
+
alreadyListed.add(info.sourceObj);
|
|
28
|
+
lines.push(`${indent}* ${info.type} ${info.name}:`);
|
|
29
|
+
lines.push(`${indent} value: ${formatValue(info.value, 50)}`);
|
|
30
|
+
lines.push(`${indent} state: ${info.state}`);
|
|
31
|
+
if (info.dependencies.length > 0) {
|
|
32
|
+
lines.push(`${indent} dependencies:`);
|
|
33
|
+
for (const dep of info.dependencies) {
|
|
34
|
+
lines.push(formatObservableInfo(dep, indentLevel + 1, alreadyListed));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return lines.join('\n');
|
|
38
|
+
}
|
|
39
|
+
class Info {
|
|
40
|
+
static from(obs, debugNamePostProcessor) {
|
|
41
|
+
if (obs instanceof AutorunObserver) {
|
|
42
|
+
const state = obs.debugGetState();
|
|
43
|
+
return new Info(obs, debugNamePostProcessor(obs.debugName), 'autorun', undefined, state.stateStr, Array.from(state.dependencies).map(dep => Info.from(dep, debugNamePostProcessor) || Info.unknown(dep)));
|
|
44
|
+
}
|
|
45
|
+
else if (obs instanceof Derived) {
|
|
46
|
+
const state = obs.debugGetState();
|
|
47
|
+
return new Info(obs, debugNamePostProcessor(obs.debugName), 'derived', state.value, state.stateStr, Array.from(state.dependencies).map(dep => Info.from(dep, debugNamePostProcessor) || Info.unknown(dep)));
|
|
48
|
+
}
|
|
49
|
+
else if (obs instanceof ObservableValue) {
|
|
50
|
+
const state = obs.debugGetState();
|
|
51
|
+
return new Info(obs, debugNamePostProcessor(obs.debugName), 'observableValue', state.value, 'upToDate', []);
|
|
52
|
+
}
|
|
53
|
+
else if (obs instanceof FromEventObservable) {
|
|
54
|
+
const state = obs.debugGetState();
|
|
55
|
+
return new Info(obs, debugNamePostProcessor(obs.debugName), 'fromEvent', state.value, state.hasValue ? 'upToDate' : 'initial', []);
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
static unknown(obs) {
|
|
60
|
+
return new Info(obs, '(unknown)', 'unknown', undefined, 'unknown', []);
|
|
61
|
+
}
|
|
62
|
+
constructor(sourceObj, name, type, value, state, dependencies) {
|
|
63
|
+
this.sourceObj = sourceObj;
|
|
64
|
+
this.name = name;
|
|
65
|
+
this.type = type;
|
|
66
|
+
this.value = value;
|
|
67
|
+
this.state = state;
|
|
68
|
+
this.dependencies = dependencies;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=debugGetDependencyGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/common/observableInternal/logging/debugGetDependencyGraph.ts","vs/base/common/observableInternal/logging/debugGetDependencyGraph.ts"],"names":[],"mappings":"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","file":"debugGetDependencyGraph.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservable, IObserver } from '../base.js';\nimport { Derived } from '../observables/derivedImpl.js';\nimport { FromEventObservable } from '../observables/observableFromEvent.js';\nimport { ObservableValue } from '../observables/observableValue.js';\nimport { AutorunObserver } from '../reactions/autorunImpl.js';\nimport { formatValue } from './consoleObservableLogger.js';\n\nexport function debugGetDependencyGraph(obs: IObservable<any> | IObserver, options?: { debugNamePostProcessor?: (name: string) => string }): string {\n\tconst debugNamePostProcessor = options?.debugNamePostProcessor ?? ((str: string) => str);\n\tconst info = Info.from(obs, debugNamePostProcessor);\n\tif (!info) {\n\t\treturn '';\n\t}\n\n\tconst alreadyListed = new Set<IObservable<any> | IObserver>();\n\treturn formatObservableInfo(info, 0, alreadyListed).trim();\n}\n\nfunction formatObservableInfo(info: Info, indentLevel: number, alreadyListed: Set<IObservable<any> | IObserver>): string {\n\tconst indent = '\\t\\t'.repeat(indentLevel);\n\tconst lines: string[] = [];\n\n\tconst isAlreadyListed = alreadyListed.has(info.sourceObj);\n\tif (isAlreadyListed) {\n\t\tlines.push(`${indent}* ${info.type} ${info.name} (already listed)`);\n\t\treturn lines.join('\\n');\n\t}\n\n\talreadyListed.add(info.sourceObj);\n\n\tlines.push(`${indent}* ${info.type} ${info.name}:`);\n\tlines.push(`${indent} value: ${formatValue(info.value, 50)}`);\n\tlines.push(`${indent} state: ${info.state}`);\n\n\tif (info.dependencies.length > 0) {\n\t\tlines.push(`${indent} dependencies:`);\n\t\tfor (const dep of info.dependencies) {\n\t\t\tlines.push(formatObservableInfo(dep, indentLevel + 1, alreadyListed));\n\t\t}\n\t}\n\n\treturn lines.join('\\n');\n}\n\nclass Info {\n\tpublic static from(obs: IObservable<any> | IObserver, debugNamePostProcessor: (name: string) => string): Info | undefined {\n\t\tif (obs instanceof AutorunObserver) {\n\t\t\tconst state = obs.debugGetState();\n\t\t\treturn new Info(\n\t\t\t\tobs,\n\t\t\t\tdebugNamePostProcessor(obs.debugName),\n\t\t\t\t'autorun',\n\t\t\t\tundefined,\n\t\t\t\tstate.stateStr,\n\t\t\t\tArray.from(state.dependencies).map(dep => Info.from(dep, debugNamePostProcessor) || Info.unknown(dep))\n\t\t\t);\n\t\t} else if (obs instanceof Derived) {\n\t\t\tconst state = obs.debugGetState();\n\t\t\treturn new Info(\n\t\t\t\tobs,\n\t\t\t\tdebugNamePostProcessor(obs.debugName),\n\t\t\t\t'derived',\n\t\t\t\tstate.value,\n\t\t\t\tstate.stateStr,\n\t\t\t\tArray.from(state.dependencies).map(dep => Info.from(dep, debugNamePostProcessor) || Info.unknown(dep))\n\t\t\t);\n\t\t} else if (obs instanceof ObservableValue) {\n\t\t\tconst state = obs.debugGetState();\n\t\t\treturn new Info(\n\t\t\t\tobs,\n\t\t\t\tdebugNamePostProcessor(obs.debugName),\n\t\t\t\t'observableValue',\n\t\t\t\tstate.value,\n\t\t\t\t'upToDate',\n\t\t\t\t[]\n\t\t\t);\n\t\t} else if (obs instanceof FromEventObservable) {\n\t\t\tconst state = obs.debugGetState();\n\t\t\treturn new Info(\n\t\t\t\tobs,\n\t\t\t\tdebugNamePostProcessor(obs.debugName),\n\t\t\t\t'fromEvent',\n\t\t\t\tstate.value,\n\t\t\t\tstate.hasValue ? 'upToDate' : 'initial',\n\t\t\t\t[]\n\t\t\t);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic static unknown(obs: IObservable<any> | IObserver): Info {\n\t\treturn new Info(\n\t\t\tobs,\n\t\t\t'(unknown)',\n\t\t\t'unknown',\n\t\t\tundefined,\n\t\t\t'unknown',\n\t\t\t[]\n\t\t);\n\t}\n\n\tconstructor(\n\t\tpublic readonly sourceObj: IObservable<any> | IObserver,\n\t\tpublic readonly name: string,\n\t\tpublic readonly type: string,\n\t\tpublic readonly value: any,\n\t\tpublic readonly state: string,\n\t\tpublic readonly dependencies: Info[]\n\t) { }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservable, IObserver } from '../base.js';\nimport { Derived } from '../observables/derivedImpl.js';\nimport { FromEventObservable } from '../observables/observableFromEvent.js';\nimport { ObservableValue } from '../observables/observableValue.js';\nimport { AutorunObserver } from '../reactions/autorunImpl.js';\nimport { formatValue } from './consoleObservableLogger.js';\n\nexport function debugGetDependencyGraph(obs: IObservable<any> | IObserver, options?: { debugNamePostProcessor?: (name: string) => string }): string {\n\tconst debugNamePostProcessor = options?.debugNamePostProcessor ?? ((str: string) => str);\n\tconst info = Info.from(obs, debugNamePostProcessor);\n\tif (!info) {\n\t\treturn '';\n\t}\n\n\tconst alreadyListed = new Set<IObservable<any> | IObserver>();\n\treturn formatObservableInfo(info, 0, alreadyListed).trim();\n}\n\nfunction formatObservableInfo(info: Info, indentLevel: number, alreadyListed: Set<IObservable<any> | IObserver>): string {\n\tconst indent = '\\t\\t'.repeat(indentLevel);\n\tconst lines: string[] = [];\n\n\tconst isAlreadyListed = alreadyListed.has(info.sourceObj);\n\tif (isAlreadyListed) {\n\t\tlines.push(`${indent}* ${info.type} ${info.name} (already listed)`);\n\t\treturn lines.join('\\n');\n\t}\n\n\talreadyListed.add(info.sourceObj);\n\n\tlines.push(`${indent}* ${info.type} ${info.name}:`);\n\tlines.push(`${indent} value: ${formatValue(info.value, 50)}`);\n\tlines.push(`${indent} state: ${info.state}`);\n\n\tif (info.dependencies.length > 0) {\n\t\tlines.push(`${indent} dependencies:`);\n\t\tfor (const dep of info.dependencies) {\n\t\t\tlines.push(formatObservableInfo(dep, indentLevel + 1, alreadyListed));\n\t\t}\n\t}\n\n\treturn lines.join('\\n');\n}\n\nclass Info {\n\tpublic static from(obs: IObservable<any> | IObserver, debugNamePostProcessor: (name: string) => string): Info | undefined {\n\t\tif (obs instanceof AutorunObserver) {\n\t\t\tconst state = obs.debugGetState();\n\t\t\treturn new Info(\n\t\t\t\tobs,\n\t\t\t\tdebugNamePostProcessor(obs.debugName),\n\t\t\t\t'autorun',\n\t\t\t\tundefined,\n\t\t\t\tstate.stateStr,\n\t\t\t\tArray.from(state.dependencies).map(dep => Info.from(dep, debugNamePostProcessor) || Info.unknown(dep))\n\t\t\t);\n\t\t} else if (obs instanceof Derived) {\n\t\t\tconst state = obs.debugGetState();\n\t\t\treturn new Info(\n\t\t\t\tobs,\n\t\t\t\tdebugNamePostProcessor(obs.debugName),\n\t\t\t\t'derived',\n\t\t\t\tstate.value,\n\t\t\t\tstate.stateStr,\n\t\t\t\tArray.from(state.dependencies).map(dep => Info.from(dep, debugNamePostProcessor) || Info.unknown(dep))\n\t\t\t);\n\t\t} else if (obs instanceof ObservableValue) {\n\t\t\tconst state = obs.debugGetState();\n\t\t\treturn new Info(\n\t\t\t\tobs,\n\t\t\t\tdebugNamePostProcessor(obs.debugName),\n\t\t\t\t'observableValue',\n\t\t\t\tstate.value,\n\t\t\t\t'upToDate',\n\t\t\t\t[]\n\t\t\t);\n\t\t} else if (obs instanceof FromEventObservable) {\n\t\t\tconst state = obs.debugGetState();\n\t\t\treturn new Info(\n\t\t\t\tobs,\n\t\t\t\tdebugNamePostProcessor(obs.debugName),\n\t\t\t\t'fromEvent',\n\t\t\t\tstate.value,\n\t\t\t\tstate.hasValue ? 'upToDate' : 'initial',\n\t\t\t\t[]\n\t\t\t);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic static unknown(obs: IObservable<any> | IObserver): Info {\n\t\treturn new Info(\n\t\t\tobs,\n\t\t\t'(unknown)',\n\t\t\t'unknown',\n\t\t\tundefined,\n\t\t\t'unknown',\n\t\t\t[]\n\t\t);\n\t}\n\n\tconstructor(\n\t\tpublic readonly sourceObj: IObservable<any> | IObserver,\n\t\tpublic readonly name: string,\n\t\tpublic readonly type: string,\n\t\tpublic readonly value: any,\n\t\tpublic readonly state: string,\n\t\tpublic readonly dependencies: Info[]\n\t) { }\n}\n"]}
|
|
@@ -21,6 +21,10 @@ let _keepObserved;
|
|
|
21
21
|
export function _setKeepObserved(keepObserved) {
|
|
22
22
|
_keepObserved = keepObserved;
|
|
23
23
|
}
|
|
24
|
+
let _debugGetDependencyGraph;
|
|
25
|
+
export function _setDebugGetDependencyGraph(debugGetDependencyGraph) {
|
|
26
|
+
_debugGetDependencyGraph = debugGetDependencyGraph;
|
|
27
|
+
}
|
|
24
28
|
export class ConvenientObservable {
|
|
25
29
|
get TChange() { return null; }
|
|
26
30
|
reportChanges() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/common/observableInternal/observables/baseObservable.ts","vs/base/common/observableInternal/observables/baseObservable.ts"],"names":[],"mappings":"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","file":"baseObservable.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservableWithChange, IObserver, IReader, IObservable } from '../base.js';\nimport { DisposableStore } from '../commonFacade/deps.js';\nimport { DebugLocation } from '../debugLocation.js';\nimport { DebugOwner, getFunctionName } from '../debugName.js';\nimport { getLogger } from '../logging/logging.js';\nimport { keepObserved, recomputeInitiallyAndOnChange } from '../utils/utils.js';\nimport { derivedOpts } from './derived.js';\n\nlet _derived: typeof derivedOpts;\n/**\n * @internal\n * This is to allow splitting files.\n*/\nexport function _setDerivedOpts(derived: typeof _derived) {\n\t_derived = derived;\n}\n\nlet _recomputeInitiallyAndOnChange: typeof recomputeInitiallyAndOnChange;\nexport function _setRecomputeInitiallyAndOnChange(recomputeInitiallyAndOnChange: typeof _recomputeInitiallyAndOnChange) {\n\t_recomputeInitiallyAndOnChange = recomputeInitiallyAndOnChange;\n}\n\nlet _keepObserved: typeof keepObserved;\nexport function _setKeepObserved(keepObserved: typeof _keepObserved) {\n\t_keepObserved = keepObserved;\n}\n\nexport abstract class ConvenientObservable<T, TChange> implements IObservableWithChange<T, TChange> {\n\tget TChange(): TChange { return null!; }\n\n\tpublic abstract get(): T;\n\n\tpublic reportChanges(): void {\n\t\tthis.get();\n\t}\n\n\tpublic abstract addObserver(observer: IObserver): void;\n\tpublic abstract removeObserver(observer: IObserver): void;\n\n\t/** @sealed */\n\tpublic read(reader: IReader | undefined): T {\n\t\tif (reader) {\n\t\t\treturn reader.readObservable(this);\n\t\t} else {\n\t\t\treturn this.get();\n\t\t}\n\t}\n\n\t/** @sealed */\n\tpublic map<TNew>(fn: (value: T, reader: IReader) => TNew): IObservable<TNew>;\n\tpublic map<TNew>(owner: DebugOwner, fn: (value: T, reader: IReader) => TNew): IObservable<TNew>;\n\tpublic map<TNew>(fnOrOwner: DebugOwner | ((value: T, reader: IReader) => TNew), fnOrUndefined?: (value: T, reader: IReader) => TNew, debugLocation: DebugLocation = DebugLocation.ofCaller()): IObservable<TNew> {\n\t\tconst owner = fnOrUndefined === undefined ? undefined : fnOrOwner as DebugOwner;\n\t\tconst fn = fnOrUndefined === undefined ? fnOrOwner as (value: T, reader: IReader) => TNew : fnOrUndefined;\n\n\t\treturn _derived(\n\t\t\t{\n\t\t\t\towner,\n\t\t\t\tdebugName: () => {\n\t\t\t\t\tconst name = getFunctionName(fn);\n\t\t\t\t\tif (name !== undefined) {\n\t\t\t\t\t\treturn name;\n\t\t\t\t\t}\n\n\t\t\t\t\t// regexp to match `x => x.y` or `x => x?.y` where x and y can be arbitrary identifiers (uses backref):\n\t\t\t\t\tconst regexp = /^\\s*\\(?\\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\\s*\\)?\\s*=>\\s*\\1(?:\\??)\\.([a-zA-Z_$][a-zA-Z_$0-9]*)\\s*$/;\n\t\t\t\t\tconst match = regexp.exec(fn.toString());\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\treturn `${this.debugName}.${match[2]}`;\n\t\t\t\t\t}\n\t\t\t\t\tif (!owner) {\n\t\t\t\t\t\treturn `${this.debugName} (mapped)`;\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t},\n\t\t\t\tdebugReferenceFn: fn,\n\t\t\t},\n\t\t\t(reader) => fn(this.read(reader), reader),\n\t\t\tdebugLocation,\n\t\t);\n\t}\n\n\t/**\n\t * @sealed\n\t * Converts an observable of an observable value into a direct observable of the value.\n\t*/\n\tpublic flatten<TNew>(this: IObservable<IObservableWithChange<TNew, any>>): IObservable<TNew> {\n\t\treturn _derived(\n\t\t\t{\n\t\t\t\towner: undefined,\n\t\t\t\tdebugName: () => `${this.debugName} (flattened)`,\n\t\t\t},\n\t\t\t(reader) => this.read(reader).read(reader)\n\t\t);\n\t}\n\n\tpublic recomputeInitiallyAndOnChange(store: DisposableStore, handleValue?: (value: T) => void): IObservable<T> {\n\t\tstore.add(_recomputeInitiallyAndOnChange!(this, handleValue));\n\t\treturn this;\n\t}\n\n\tpublic abstract get debugName(): string;\n}\n\nexport abstract class BaseObservable<T, TChange = void> extends ConvenientObservable<T, TChange> {\n\tprotected readonly _observers = new Set<IObserver>();\n\n\tconstructor(debugLocation: DebugLocation) {\n\t\tsuper();\n\t\tgetLogger()?.handleObservableCreated(this, debugLocation);\n\t}\n\n\tpublic addObserver(observer: IObserver): void {\n\t\tconst len = this._observers.size;\n\t\tthis._observers.add(observer);\n\t\tif (len === 0) {\n\t\t\tthis.onFirstObserverAdded();\n\t\t}\n\t\tif (len !== this._observers.size) {\n\t\t\tgetLogger()?.handleOnListenerCountChanged(this, this._observers.size);\n\t\t}\n\t}\n\n\tpublic removeObserver(observer: IObserver): void {\n\t\tconst deleted = this._observers.delete(observer);\n\t\tif (deleted && this._observers.size === 0) {\n\t\t\tthis.onLastObserverRemoved();\n\t\t}\n\t\tif (deleted) {\n\t\t\tgetLogger()?.handleOnListenerCountChanged(this, this._observers.size);\n\t\t}\n\t}\n\n\tprotected onFirstObserverAdded(): void { }\n\tprotected onLastObserverRemoved(): void { }\n\n\tpublic debugGetObservers() {\n\t\treturn this._observers;\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservableWithChange, IObserver, IReader, IObservable } from '../base.js';\nimport { DisposableStore } from '../commonFacade/deps.js';\nimport { DebugLocation } from '../debugLocation.js';\nimport { DebugOwner, getFunctionName } from '../debugName.js';\nimport { getLogger } from '../logging/logging.js';\nimport { keepObserved, recomputeInitiallyAndOnChange } from '../utils/utils.js';\nimport { derivedOpts } from './derived.js';\n\nlet _derived: typeof derivedOpts;\n/**\n * @internal\n * This is to allow splitting files.\n*/\nexport function _setDerivedOpts(derived: typeof _derived) {\n\t_derived = derived;\n}\n\nlet _recomputeInitiallyAndOnChange: typeof recomputeInitiallyAndOnChange;\nexport function _setRecomputeInitiallyAndOnChange(recomputeInitiallyAndOnChange: typeof _recomputeInitiallyAndOnChange) {\n\t_recomputeInitiallyAndOnChange = recomputeInitiallyAndOnChange;\n}\n\nlet _keepObserved: typeof keepObserved;\nexport function _setKeepObserved(keepObserved: typeof _keepObserved) {\n\t_keepObserved = keepObserved;\n}\n\nexport abstract class ConvenientObservable<T, TChange> implements IObservableWithChange<T, TChange> {\n\tget TChange(): TChange { return null!; }\n\n\tpublic abstract get(): T;\n\n\tpublic reportChanges(): void {\n\t\tthis.get();\n\t}\n\n\tpublic abstract addObserver(observer: IObserver): void;\n\tpublic abstract removeObserver(observer: IObserver): void;\n\n\t/** @sealed */\n\tpublic read(reader: IReader | undefined): T {\n\t\tif (reader) {\n\t\t\treturn reader.readObservable(this);\n\t\t} else {\n\t\t\treturn this.get();\n\t\t}\n\t}\n\n\t/** @sealed */\n\tpublic map<TNew>(fn: (value: T, reader: IReader) => TNew): IObservable<TNew>;\n\tpublic map<TNew>(owner: DebugOwner, fn: (value: T, reader: IReader) => TNew): IObservable<TNew>;\n\tpublic map<TNew>(fnOrOwner: DebugOwner | ((value: T, reader: IReader) => TNew), fnOrUndefined?: (value: T, reader: IReader) => TNew, debugLocation: DebugLocation = DebugLocation.ofCaller()): IObservable<TNew> {\n\t\tconst owner = fnOrUndefined === undefined ? undefined : fnOrOwner as DebugOwner;\n\t\tconst fn = fnOrUndefined === undefined ? fnOrOwner as (value: T, reader: IReader) => TNew : fnOrUndefined;\n\n\t\treturn _derived(\n\t\t\t{\n\t\t\t\towner,\n\t\t\t\tdebugName: () => {\n\t\t\t\t\tconst name = getFunctionName(fn);\n\t\t\t\t\tif (name !== undefined) {\n\t\t\t\t\t\treturn name;\n\t\t\t\t\t}\n\n\t\t\t\t\t// regexp to match `x => x.y` or `x => x?.y` where x and y can be arbitrary identifiers (uses backref):\n\t\t\t\t\tconst regexp = /^\\s*\\(?\\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\\s*\\)?\\s*=>\\s*\\1(?:\\??)\\.([a-zA-Z_$][a-zA-Z_$0-9]*)\\s*$/;\n\t\t\t\t\tconst match = regexp.exec(fn.toString());\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\treturn `${this.debugName}.${match[2]}`;\n\t\t\t\t\t}\n\t\t\t\t\tif (!owner) {\n\t\t\t\t\t\treturn `${this.debugName} (mapped)`;\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t},\n\t\t\t\tdebugReferenceFn: fn,\n\t\t\t},\n\t\t\t(reader) => fn(this.read(reader), reader),\n\t\t\tdebugLocation,\n\t\t);\n\t}\n\n\t/**\n\t * @sealed\n\t * Converts an observable of an observable value into a direct observable of the value.\n\t*/\n\tpublic flatten<TNew>(this: IObservable<IObservableWithChange<TNew, any>>): IObservable<TNew> {\n\t\treturn _derived(\n\t\t\t{\n\t\t\t\towner: undefined,\n\t\t\t\tdebugName: () => `${this.debugName} (flattened)`,\n\t\t\t},\n\t\t\t(reader) => this.read(reader).read(reader)\n\t\t);\n\t}\n\n\tpublic recomputeInitiallyAndOnChange(store: DisposableStore, handleValue?: (value: T) => void): IObservable<T> {\n\t\tstore.add(_recomputeInitiallyAndOnChange!(this, handleValue));\n\t\treturn this;\n\t}\n\n\tpublic abstract get debugName(): string;\n}\n\nexport abstract class BaseObservable<T, TChange = void> extends ConvenientObservable<T, TChange> {\n\tprotected readonly _observers = new Set<IObserver>();\n\n\tconstructor(debugLocation: DebugLocation) {\n\t\tsuper();\n\t\tgetLogger()?.handleObservableCreated(this, debugLocation);\n\t}\n\n\tpublic addObserver(observer: IObserver): void {\n\t\tconst len = this._observers.size;\n\t\tthis._observers.add(observer);\n\t\tif (len === 0) {\n\t\t\tthis.onFirstObserverAdded();\n\t\t}\n\t\tif (len !== this._observers.size) {\n\t\t\tgetLogger()?.handleOnListenerCountChanged(this, this._observers.size);\n\t\t}\n\t}\n\n\tpublic removeObserver(observer: IObserver): void {\n\t\tconst deleted = this._observers.delete(observer);\n\t\tif (deleted && this._observers.size === 0) {\n\t\t\tthis.onLastObserverRemoved();\n\t\t}\n\t\tif (deleted) {\n\t\t\tgetLogger()?.handleOnListenerCountChanged(this, this._observers.size);\n\t\t}\n\t}\n\n\tprotected onFirstObserverAdded(): void { }\n\tprotected onLastObserverRemoved(): void { }\n\n\tpublic debugGetObservers() {\n\t\treturn this._observers;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/common/observableInternal/observables/baseObservable.ts","vs/base/common/observableInternal/observables/baseObservable.ts"],"names":[],"mappings":"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","file":"baseObservable.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservableWithChange, IObserver, IReader, IObservable } from '../base.js';\nimport { DisposableStore } from '../commonFacade/deps.js';\nimport { DebugLocation } from '../debugLocation.js';\nimport { DebugOwner, getFunctionName } from '../debugName.js';\nimport { debugGetDependencyGraph } from '../logging/debugGetDependencyGraph.js';\nimport { getLogger } from '../logging/logging.js';\nimport { keepObserved, recomputeInitiallyAndOnChange } from '../utils/utils.js';\nimport { derivedOpts } from './derived.js';\n\nlet _derived: typeof derivedOpts;\n/**\n * @internal\n * This is to allow splitting files.\n*/\nexport function _setDerivedOpts(derived: typeof _derived) {\n\t_derived = derived;\n}\n\nlet _recomputeInitiallyAndOnChange: typeof recomputeInitiallyAndOnChange;\nexport function _setRecomputeInitiallyAndOnChange(recomputeInitiallyAndOnChange: typeof _recomputeInitiallyAndOnChange) {\n\t_recomputeInitiallyAndOnChange = recomputeInitiallyAndOnChange;\n}\n\nlet _keepObserved: typeof keepObserved;\nexport function _setKeepObserved(keepObserved: typeof _keepObserved) {\n\t_keepObserved = keepObserved;\n}\n\nlet _debugGetDependencyGraph: typeof debugGetDependencyGraph;\nexport function _setDebugGetDependencyGraph(debugGetDependencyGraph: typeof _debugGetDependencyGraph) {\n\t_debugGetDependencyGraph = debugGetDependencyGraph;\n}\n\nexport abstract class ConvenientObservable<T, TChange> implements IObservableWithChange<T, TChange> {\n\tget TChange(): TChange { return null!; }\n\n\tpublic abstract get(): T;\n\n\tpublic reportChanges(): void {\n\t\tthis.get();\n\t}\n\n\tpublic abstract addObserver(observer: IObserver): void;\n\tpublic abstract removeObserver(observer: IObserver): void;\n\n\t/** @sealed */\n\tpublic read(reader: IReader | undefined): T {\n\t\tif (reader) {\n\t\t\treturn reader.readObservable(this);\n\t\t} else {\n\t\t\treturn this.get();\n\t\t}\n\t}\n\n\t/** @sealed */\n\tpublic map<TNew>(fn: (value: T, reader: IReader) => TNew): IObservable<TNew>;\n\tpublic map<TNew>(owner: DebugOwner, fn: (value: T, reader: IReader) => TNew): IObservable<TNew>;\n\tpublic map<TNew>(fnOrOwner: DebugOwner | ((value: T, reader: IReader) => TNew), fnOrUndefined?: (value: T, reader: IReader) => TNew, debugLocation: DebugLocation = DebugLocation.ofCaller()): IObservable<TNew> {\n\t\tconst owner = fnOrUndefined === undefined ? undefined : fnOrOwner as DebugOwner;\n\t\tconst fn = fnOrUndefined === undefined ? fnOrOwner as (value: T, reader: IReader) => TNew : fnOrUndefined;\n\n\t\treturn _derived(\n\t\t\t{\n\t\t\t\towner,\n\t\t\t\tdebugName: () => {\n\t\t\t\t\tconst name = getFunctionName(fn);\n\t\t\t\t\tif (name !== undefined) {\n\t\t\t\t\t\treturn name;\n\t\t\t\t\t}\n\n\t\t\t\t\t// regexp to match `x => x.y` or `x => x?.y` where x and y can be arbitrary identifiers (uses backref):\n\t\t\t\t\tconst regexp = /^\\s*\\(?\\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\\s*\\)?\\s*=>\\s*\\1(?:\\??)\\.([a-zA-Z_$][a-zA-Z_$0-9]*)\\s*$/;\n\t\t\t\t\tconst match = regexp.exec(fn.toString());\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\treturn `${this.debugName}.${match[2]}`;\n\t\t\t\t\t}\n\t\t\t\t\tif (!owner) {\n\t\t\t\t\t\treturn `${this.debugName} (mapped)`;\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t},\n\t\t\t\tdebugReferenceFn: fn,\n\t\t\t},\n\t\t\t(reader) => fn(this.read(reader), reader),\n\t\t\tdebugLocation,\n\t\t);\n\t}\n\n\t/**\n\t * @sealed\n\t * Converts an observable of an observable value into a direct observable of the value.\n\t*/\n\tpublic flatten<TNew>(this: IObservable<IObservableWithChange<TNew, any>>): IObservable<TNew> {\n\t\treturn _derived(\n\t\t\t{\n\t\t\t\towner: undefined,\n\t\t\t\tdebugName: () => `${this.debugName} (flattened)`,\n\t\t\t},\n\t\t\t(reader) => this.read(reader).read(reader)\n\t\t);\n\t}\n\n\tpublic recomputeInitiallyAndOnChange(store: DisposableStore, handleValue?: (value: T) => void): IObservable<T> {\n\t\tstore.add(_recomputeInitiallyAndOnChange!(this, handleValue));\n\t\treturn this;\n\t}\n\n\tpublic abstract get debugName(): string;\n}\n\nexport abstract class BaseObservable<T, TChange = void> extends ConvenientObservable<T, TChange> {\n\tprotected readonly _observers = new Set<IObserver>();\n\n\tconstructor(debugLocation: DebugLocation) {\n\t\tsuper();\n\t\tgetLogger()?.handleObservableCreated(this, debugLocation);\n\t}\n\n\tpublic addObserver(observer: IObserver): void {\n\t\tconst len = this._observers.size;\n\t\tthis._observers.add(observer);\n\t\tif (len === 0) {\n\t\t\tthis.onFirstObserverAdded();\n\t\t}\n\t\tif (len !== this._observers.size) {\n\t\t\tgetLogger()?.handleOnListenerCountChanged(this, this._observers.size);\n\t\t}\n\t}\n\n\tpublic removeObserver(observer: IObserver): void {\n\t\tconst deleted = this._observers.delete(observer);\n\t\tif (deleted && this._observers.size === 0) {\n\t\t\tthis.onLastObserverRemoved();\n\t\t}\n\t\tif (deleted) {\n\t\t\tgetLogger()?.handleOnListenerCountChanged(this, this._observers.size);\n\t\t}\n\t}\n\n\tprotected onFirstObserverAdded(): void { }\n\tprotected onLastObserverRemoved(): void { }\n\n\tpublic debugGetObservers() {\n\t\treturn this._observers;\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservableWithChange, IObserver, IReader, IObservable } from '../base.js';\nimport { DisposableStore } from '../commonFacade/deps.js';\nimport { DebugLocation } from '../debugLocation.js';\nimport { DebugOwner, getFunctionName } from '../debugName.js';\nimport { debugGetDependencyGraph } from '../logging/debugGetDependencyGraph.js';\nimport { getLogger } from '../logging/logging.js';\nimport { keepObserved, recomputeInitiallyAndOnChange } from '../utils/utils.js';\nimport { derivedOpts } from './derived.js';\n\nlet _derived: typeof derivedOpts;\n/**\n * @internal\n * This is to allow splitting files.\n*/\nexport function _setDerivedOpts(derived: typeof _derived) {\n\t_derived = derived;\n}\n\nlet _recomputeInitiallyAndOnChange: typeof recomputeInitiallyAndOnChange;\nexport function _setRecomputeInitiallyAndOnChange(recomputeInitiallyAndOnChange: typeof _recomputeInitiallyAndOnChange) {\n\t_recomputeInitiallyAndOnChange = recomputeInitiallyAndOnChange;\n}\n\nlet _keepObserved: typeof keepObserved;\nexport function _setKeepObserved(keepObserved: typeof _keepObserved) {\n\t_keepObserved = keepObserved;\n}\n\nlet _debugGetDependencyGraph: typeof debugGetDependencyGraph;\nexport function _setDebugGetDependencyGraph(debugGetDependencyGraph: typeof _debugGetDependencyGraph) {\n\t_debugGetDependencyGraph = debugGetDependencyGraph;\n}\n\nexport abstract class ConvenientObservable<T, TChange> implements IObservableWithChange<T, TChange> {\n\tget TChange(): TChange { return null!; }\n\n\tpublic abstract get(): T;\n\n\tpublic reportChanges(): void {\n\t\tthis.get();\n\t}\n\n\tpublic abstract addObserver(observer: IObserver): void;\n\tpublic abstract removeObserver(observer: IObserver): void;\n\n\t/** @sealed */\n\tpublic read(reader: IReader | undefined): T {\n\t\tif (reader) {\n\t\t\treturn reader.readObservable(this);\n\t\t} else {\n\t\t\treturn this.get();\n\t\t}\n\t}\n\n\t/** @sealed */\n\tpublic map<TNew>(fn: (value: T, reader: IReader) => TNew): IObservable<TNew>;\n\tpublic map<TNew>(owner: DebugOwner, fn: (value: T, reader: IReader) => TNew): IObservable<TNew>;\n\tpublic map<TNew>(fnOrOwner: DebugOwner | ((value: T, reader: IReader) => TNew), fnOrUndefined?: (value: T, reader: IReader) => TNew, debugLocation: DebugLocation = DebugLocation.ofCaller()): IObservable<TNew> {\n\t\tconst owner = fnOrUndefined === undefined ? undefined : fnOrOwner as DebugOwner;\n\t\tconst fn = fnOrUndefined === undefined ? fnOrOwner as (value: T, reader: IReader) => TNew : fnOrUndefined;\n\n\t\treturn _derived(\n\t\t\t{\n\t\t\t\towner,\n\t\t\t\tdebugName: () => {\n\t\t\t\t\tconst name = getFunctionName(fn);\n\t\t\t\t\tif (name !== undefined) {\n\t\t\t\t\t\treturn name;\n\t\t\t\t\t}\n\n\t\t\t\t\t// regexp to match `x => x.y` or `x => x?.y` where x and y can be arbitrary identifiers (uses backref):\n\t\t\t\t\tconst regexp = /^\\s*\\(?\\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\\s*\\)?\\s*=>\\s*\\1(?:\\??)\\.([a-zA-Z_$][a-zA-Z_$0-9]*)\\s*$/;\n\t\t\t\t\tconst match = regexp.exec(fn.toString());\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\treturn `${this.debugName}.${match[2]}`;\n\t\t\t\t\t}\n\t\t\t\t\tif (!owner) {\n\t\t\t\t\t\treturn `${this.debugName} (mapped)`;\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t},\n\t\t\t\tdebugReferenceFn: fn,\n\t\t\t},\n\t\t\t(reader) => fn(this.read(reader), reader),\n\t\t\tdebugLocation,\n\t\t);\n\t}\n\n\t/**\n\t * @sealed\n\t * Converts an observable of an observable value into a direct observable of the value.\n\t*/\n\tpublic flatten<TNew>(this: IObservable<IObservableWithChange<TNew, any>>): IObservable<TNew> {\n\t\treturn _derived(\n\t\t\t{\n\t\t\t\towner: undefined,\n\t\t\t\tdebugName: () => `${this.debugName} (flattened)`,\n\t\t\t},\n\t\t\t(reader) => this.read(reader).read(reader)\n\t\t);\n\t}\n\n\tpublic recomputeInitiallyAndOnChange(store: DisposableStore, handleValue?: (value: T) => void): IObservable<T> {\n\t\tstore.add(_recomputeInitiallyAndOnChange!(this, handleValue));\n\t\treturn this;\n\t}\n\n\tpublic abstract get debugName(): string;\n}\n\nexport abstract class BaseObservable<T, TChange = void> extends ConvenientObservable<T, TChange> {\n\tprotected readonly _observers = new Set<IObserver>();\n\n\tconstructor(debugLocation: DebugLocation) {\n\t\tsuper();\n\t\tgetLogger()?.handleObservableCreated(this, debugLocation);\n\t}\n\n\tpublic addObserver(observer: IObserver): void {\n\t\tconst len = this._observers.size;\n\t\tthis._observers.add(observer);\n\t\tif (len === 0) {\n\t\t\tthis.onFirstObserverAdded();\n\t\t}\n\t\tif (len !== this._observers.size) {\n\t\t\tgetLogger()?.handleOnListenerCountChanged(this, this._observers.size);\n\t\t}\n\t}\n\n\tpublic removeObserver(observer: IObserver): void {\n\t\tconst deleted = this._observers.delete(observer);\n\t\tif (deleted && this._observers.size === 0) {\n\t\t\tthis.onLastObserverRemoved();\n\t\t}\n\t\tif (deleted) {\n\t\t\tgetLogger()?.handleOnListenerCountChanged(this, this._observers.size);\n\t\t}\n\t}\n\n\tprotected onFirstObserverAdded(): void { }\n\tprotected onLastObserverRemoved(): void { }\n\n\tpublic debugGetObservers() {\n\t\treturn this._observers;\n\t}\n}\n"]}
|
|
@@ -5,6 +5,15 @@
|
|
|
5
5
|
import { BaseObservable } from './baseObservable.js';
|
|
6
6
|
import { BugIndicatingError, DisposableStore, assertFn, onBugIndicatingError } from '../commonFacade/deps.js';
|
|
7
7
|
import { getLogger } from '../logging/logging.js';
|
|
8
|
+
function derivedStateToString(state) {
|
|
9
|
+
switch (state) {
|
|
10
|
+
case 0 /* DerivedState.initial */: return 'initial';
|
|
11
|
+
case 1 /* DerivedState.dependenciesMightHaveChanged */: return 'dependenciesMightHaveChanged';
|
|
12
|
+
case 2 /* DerivedState.stale */: return 'stale';
|
|
13
|
+
case 3 /* DerivedState.upToDate */: return 'upToDate';
|
|
14
|
+
default: return '<unknown>';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
8
17
|
export class Derived extends BaseObservable {
|
|
9
18
|
get debugName() {
|
|
10
19
|
return this._debugNameData.getDebugName(this) ?? '(anonymous)';
|
|
@@ -303,6 +312,7 @@ export class Derived extends BaseObservable {
|
|
|
303
312
|
debugGetState() {
|
|
304
313
|
return {
|
|
305
314
|
state: this._state,
|
|
315
|
+
stateStr: derivedStateToString(this._state),
|
|
306
316
|
updateCount: this._updateCount,
|
|
307
317
|
isComputing: this._isComputing,
|
|
308
318
|
dependencies: this._dependencies,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/common/observableInternal/observables/derivedImpl.ts","vs/base/common/observableInternal/observables/derivedImpl.ts"],"names":[],"mappings":"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","file":"derivedImpl.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservable, IObservableWithChange, IObserver, IReaderWithStore, ISettableObservable, ITransaction } from '../base.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugNameData } from '../debugName.js';\nimport { BugIndicatingError, DisposableStore, EqualityComparer, assertFn, onBugIndicatingError } from '../commonFacade/deps.js';\nimport { getLogger } from '../logging/logging.js';\nimport { IChangeTracker } from '../changeTracker.js';\nimport { DebugLocation } from '../debugLocation.js';\n\nexport interface IDerivedReader<TChange = void> extends IReaderWithStore {\n}\n\nexport const enum DerivedState {\n\t/** Initial state, no previous value, recomputation needed */\n\tinitial = 0,\n\n\t/**\n\t * A dependency could have changed.\n\t * We need to explicitly ask them if at least one dependency changed.\n\t */\n\tdependenciesMightHaveChanged = 1,\n\n\t/**\n\t * A dependency changed and we need to recompute.\n\t * After recomputation, we need to check the previous value to see if we changed as well.\n\t */\n\tstale = 2,\n\n\t/**\n\t * No change reported, our cached value is up to date.\n\t */\n\tupToDate = 3,\n}\n\nexport class Derived<T, TChangeSummary = any, TChange = void> extends BaseObservable<T, TChange> implements IDerivedReader<TChange>, IObserver {\n\tprivate _state = DerivedState.initial;\n\tprivate _value: T | undefined = undefined;\n\tprivate _updateCount = 0;\n\tprivate _dependencies = new Set<IObservable<any>>();\n\tprivate _dependenciesToBeRemoved = new Set<IObservable<any>>();\n\tprivate _changeSummary: TChangeSummary | undefined = undefined;\n\tprivate _isUpdating = false;\n\tprivate _isComputing = false;\n\tprivate _didReportChange = false;\n\tprivate _isInBeforeUpdate = false;\n\tprivate _isReaderValid = false;\n\tprivate _store: DisposableStore | undefined = undefined;\n\tprivate _delayedStore: DisposableStore | undefined = undefined;\n\tprivate _removedObserverToCallEndUpdateOn: Set<IObserver> | null = null;\n\n\tpublic override get debugName(): string {\n\t\treturn this._debugNameData.getDebugName(this) ?? '(anonymous)';\n\t}\n\n\tconstructor(\n\t\tpublic readonly _debugNameData: DebugNameData,\n\t\tpublic readonly _computeFn: (reader: IDerivedReader<TChange>, changeSummary: TChangeSummary) => T,\n\t\tprivate readonly _changeTracker: IChangeTracker<TChangeSummary> | undefined,\n\t\tprivate readonly _handleLastObserverRemoved: (() => void) | undefined = undefined,\n\t\tprivate readonly _equalityComparator: EqualityComparer<T>,\n\t\tdebugLocation: DebugLocation,\n\t) {\n\t\tsuper(debugLocation);\n\t\tthis._changeSummary = this._changeTracker?.createChangeSummary(undefined);\n\t}\n\n\tprotected override onLastObserverRemoved(): void {\n\t\t/**\n\t\t * We are not tracking changes anymore, thus we have to assume\n\t\t * that our cache is invalid.\n\t\t */\n\t\tthis._state = DerivedState.initial;\n\t\tthis._value = undefined;\n\t\tgetLogger()?.handleDerivedCleared(this);\n\t\tfor (const d of this._dependencies) {\n\t\t\td.removeObserver(this);\n\t\t}\n\t\tthis._dependencies.clear();\n\n\t\tif (this._store !== undefined) {\n\t\t\tthis._store.dispose();\n\t\t\tthis._store = undefined;\n\t\t}\n\t\tif (this._delayedStore !== undefined) {\n\t\t\tthis._delayedStore.dispose();\n\t\t\tthis._delayedStore = undefined;\n\t\t}\n\n\t\tthis._handleLastObserverRemoved?.();\n\t}\n\n\tpublic override get(): T {\n\t\tconst checkEnabled = false; // TODO set to true\n\t\tif (this._isComputing && checkEnabled) {\n\t\t\t// investigate why this fails in the diff editor!\n\t\t\tthrow new BugIndicatingError('Cyclic deriveds are not supported yet!');\n\t\t}\n\n\t\tif (this._observers.size === 0) {\n\t\t\tlet result;\n\t\t\t// Without observers, we don't know when to clean up stuff.\n\t\t\t// Thus, we don't cache anything to prevent memory leaks.\n\t\t\ttry {\n\t\t\t\tthis._isReaderValid = true;\n\t\t\t\tlet changeSummary = undefined;\n\t\t\t\tif (this._changeTracker) {\n\t\t\t\t\tchangeSummary = this._changeTracker.createChangeSummary(undefined);\n\t\t\t\t\tthis._changeTracker.beforeUpdate?.(this, changeSummary);\n\t\t\t\t}\n\t\t\t\tresult = this._computeFn(this, changeSummary!);\n\t\t\t} finally {\n\t\t\t\tthis._isReaderValid = false;\n\t\t\t}\n\t\t\t// Clear new dependencies\n\t\t\tthis.onLastObserverRemoved();\n\t\t\treturn result;\n\n\t\t} else {\n\t\t\tdo {\n\t\t\t\t// We might not get a notification for a dependency that changed while it is updating,\n\t\t\t\t// thus we also have to ask all our depedencies if they changed in this case.\n\t\t\t\tif (this._state === DerivedState.dependenciesMightHaveChanged) {\n\t\t\t\t\tfor (const d of this._dependencies) {\n\t\t\t\t\t\t/** might call {@link handleChange} indirectly, which could make us stale */\n\t\t\t\t\t\td.reportChanges();\n\n\t\t\t\t\t\tif (this._state as DerivedState === DerivedState.stale) {\n\t\t\t\t\t\t\t// The other dependencies will refresh on demand, so early break\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// We called report changes of all dependencies.\n\t\t\t\t// If we are still not stale, we can assume to be up to date again.\n\t\t\t\tif (this._state === DerivedState.dependenciesMightHaveChanged) {\n\t\t\t\t\tthis._state = DerivedState.upToDate;\n\t\t\t\t}\n\n\t\t\t\tif (this._state !== DerivedState.upToDate) {\n\t\t\t\t\tthis._recompute();\n\t\t\t\t}\n\t\t\t\t// In case recomputation changed one of our dependencies, we need to recompute again.\n\t\t\t} while (this._state !== DerivedState.upToDate);\n\t\t\treturn this._value!;\n\t\t}\n\t}\n\n\tprivate _recompute() {\n\t\tlet didChange = false;\n\t\tthis._isComputing = true;\n\t\tthis._didReportChange = false;\n\n\t\tconst emptySet = this._dependenciesToBeRemoved;\n\t\tthis._dependenciesToBeRemoved = this._dependencies;\n\t\tthis._dependencies = emptySet;\n\n\t\ttry {\n\t\t\tconst changeSummary = this._changeSummary!;\n\n\t\t\tthis._isReaderValid = true;\n\t\t\tif (this._changeTracker) {\n\t\t\t\tthis._isInBeforeUpdate = true;\n\t\t\t\tthis._changeTracker.beforeUpdate?.(this, changeSummary);\n\t\t\t\tthis._isInBeforeUpdate = false;\n\t\t\t\tthis._changeSummary = this._changeTracker?.createChangeSummary(changeSummary);\n\t\t\t}\n\n\t\t\tconst hadValue = this._state !== DerivedState.initial;\n\t\t\tconst oldValue = this._value;\n\t\t\tthis._state = DerivedState.upToDate;\n\n\t\t\tconst delayedStore = this._delayedStore;\n\t\t\tif (delayedStore !== undefined) {\n\t\t\t\tthis._delayedStore = undefined;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tif (this._store !== undefined) {\n\t\t\t\t\tthis._store.dispose();\n\t\t\t\t\tthis._store = undefined;\n\t\t\t\t}\n\t\t\t\t/** might call {@link handleChange} indirectly, which could invalidate us */\n\t\t\t\tthis._value = this._computeFn(this, changeSummary);\n\n\t\t\t} finally {\n\t\t\t\tthis._isReaderValid = false;\n\t\t\t\t// We don't want our observed observables to think that they are (not even temporarily) not being observed.\n\t\t\t\t// Thus, we only unsubscribe from observables that are definitely not read anymore.\n\t\t\t\tfor (const o of this._dependenciesToBeRemoved) {\n\t\t\t\t\to.removeObserver(this);\n\t\t\t\t}\n\t\t\t\tthis._dependenciesToBeRemoved.clear();\n\n\t\t\t\tif (delayedStore !== undefined) {\n\t\t\t\t\tdelayedStore.dispose();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdidChange = this._didReportChange || (hadValue && !(this._equalityComparator(oldValue!, this._value)));\n\n\t\t\tgetLogger()?.handleObservableUpdated(this, {\n\t\t\t\toldValue,\n\t\t\t\tnewValue: this._value,\n\t\t\t\tchange: undefined,\n\t\t\t\tdidChange,\n\t\t\t\thadValue,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tonBugIndicatingError(e);\n\t\t}\n\n\t\tthis._isComputing = false;\n\n\t\tif (!this._didReportChange && didChange) {\n\t\t\tfor (const r of this._observers) {\n\t\t\t\tr.handleChange(this, undefined);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._didReportChange = false;\n\t\t}\n\t}\n\n\tpublic override toString(): string {\n\t\treturn `LazyDerived<${this.debugName}>`;\n\t}\n\n\t// IObserver Implementation\n\n\tpublic beginUpdate<T>(_observable: IObservable<T>): void {\n\t\tif (this._isUpdating) {\n\t\t\tthrow new BugIndicatingError('Cyclic deriveds are not supported yet!');\n\t\t}\n\n\t\tthis._updateCount++;\n\t\tthis._isUpdating = true;\n\t\ttry {\n\t\t\tconst propagateBeginUpdate = this._updateCount === 1;\n\t\t\tif (this._state === DerivedState.upToDate) {\n\t\t\t\tthis._state = DerivedState.dependenciesMightHaveChanged;\n\t\t\t\t// If we propagate begin update, that will already signal a possible change.\n\t\t\t\tif (!propagateBeginUpdate) {\n\t\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\t\tr.handlePossibleChange(this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (propagateBeginUpdate) {\n\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\tr.beginUpdate(this); // This signals a possible change\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._isUpdating = false;\n\t\t}\n\t}\n\n\tpublic endUpdate<T>(_observable: IObservable<T>): void {\n\t\tthis._updateCount--;\n\t\tif (this._updateCount === 0) {\n\t\t\t// End update could change the observer list.\n\t\t\tconst observers = [...this._observers];\n\t\t\tfor (const r of observers) {\n\t\t\t\tr.endUpdate(this);\n\t\t\t}\n\t\t\tif (this._removedObserverToCallEndUpdateOn) {\n\t\t\t\tconst observers = [...this._removedObserverToCallEndUpdateOn];\n\t\t\t\tthis._removedObserverToCallEndUpdateOn = null;\n\t\t\t\tfor (const r of observers) {\n\t\t\t\t\tr.endUpdate(this);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tassertFn(() => this._updateCount >= 0);\n\t}\n\n\tpublic handlePossibleChange<T>(observable: IObservable<T>): void {\n\t\t// In all other states, observers already know that we might have changed.\n\t\tif (this._state === DerivedState.upToDate && this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable)) {\n\t\t\tthis._state = DerivedState.dependenciesMightHaveChanged;\n\t\t\tfor (const r of this._observers) {\n\t\t\t\tr.handlePossibleChange(this);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic handleChange<T, TChange>(observable: IObservableWithChange<T, TChange>, change: TChange): void {\n\t\tif (this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable) || this._isInBeforeUpdate) {\n\t\t\tgetLogger()?.handleDerivedDependencyChanged(this, observable, change);\n\n\t\t\tlet shouldReact = false;\n\t\t\ttry {\n\t\t\t\tshouldReact = this._changeTracker ? this._changeTracker.handleChange({\n\t\t\t\t\tchangedObservable: observable,\n\t\t\t\t\tchange,\n\t\t\t\t\tdidChange: (o): this is any => o === observable as any,\n\t\t\t\t}, this._changeSummary!) : true;\n\t\t\t} catch (e) {\n\t\t\t\tonBugIndicatingError(e);\n\t\t\t}\n\n\t\t\tconst wasUpToDate = this._state === DerivedState.upToDate;\n\t\t\tif (shouldReact && (this._state === DerivedState.dependenciesMightHaveChanged || wasUpToDate)) {\n\t\t\t\tthis._state = DerivedState.stale;\n\t\t\t\tif (wasUpToDate) {\n\t\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\t\tr.handlePossibleChange(this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// IReader Implementation\n\n\tprivate _ensureReaderValid(): void {\n\t\tif (!this._isReaderValid) { throw new BugIndicatingError('The reader object cannot be used outside its compute function!'); }\n\t}\n\n\tpublic readObservable<T>(observable: IObservable<T>): T {\n\t\tthis._ensureReaderValid();\n\n\t\t// Subscribe before getting the value to enable caching\n\t\tobservable.addObserver(this);\n\t\t/** This might call {@link handleChange} indirectly, which could invalidate us */\n\t\tconst value = observable.get();\n\t\t// Which is why we only add the observable to the dependencies now.\n\t\tthis._dependencies.add(observable);\n\t\tthis._dependenciesToBeRemoved.delete(observable);\n\t\treturn value;\n\t}\n\n\tget store(): DisposableStore {\n\t\tthis._ensureReaderValid();\n\n\t\tif (this._store === undefined) {\n\t\t\tthis._store = new DisposableStore();\n\t\t}\n\t\treturn this._store;\n\t}\n\n\tpublic override addObserver(observer: IObserver): void {\n\t\tconst shouldCallBeginUpdate = !this._observers.has(observer) && this._updateCount > 0;\n\t\tsuper.addObserver(observer);\n\n\t\tif (shouldCallBeginUpdate) {\n\t\t\tif (this._removedObserverToCallEndUpdateOn && this._removedObserverToCallEndUpdateOn.has(observer)) {\n\t\t\t\tthis._removedObserverToCallEndUpdateOn.delete(observer);\n\t\t\t} else {\n\t\t\t\tobserver.beginUpdate(this);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override removeObserver(observer: IObserver): void {\n\t\tif (this._observers.has(observer) && this._updateCount > 0) {\n\t\t\tif (!this._removedObserverToCallEndUpdateOn) {\n\t\t\t\tthis._removedObserverToCallEndUpdateOn = new Set();\n\t\t\t}\n\t\t\tthis._removedObserverToCallEndUpdateOn.add(observer);\n\t\t}\n\t\tsuper.removeObserver(observer);\n\t}\n\n\tpublic debugGetState() {\n\t\treturn {\n\t\t\tstate: this._state,\n\t\t\tupdateCount: this._updateCount,\n\t\t\tisComputing: this._isComputing,\n\t\t\tdependencies: this._dependencies,\n\t\t\tvalue: this._value,\n\t\t};\n\t}\n\n\tpublic debugSetValue(newValue: unknown) {\n\t\tthis._value = newValue as any;\n\t}\n\n\tpublic debugRecompute(): void {\n\t\tif (!this._isComputing) {\n\t\t\tthis._recompute();\n\t\t} else {\n\t\t\tthis._state = DerivedState.stale;\n\t\t}\n\t}\n\n\tpublic setValue(newValue: T, tx: ITransaction, change: TChange): void {\n\t\tthis._value = newValue;\n\t\tconst observers = this._observers;\n\t\ttx.updateObserver(this, this);\n\t\tfor (const d of observers) {\n\t\t\td.handleChange(this, change);\n\t\t}\n\t}\n}\n\n\nexport class DerivedWithSetter<T, TChangeSummary = any, TOutChanges = any> extends Derived<T, TChangeSummary, TOutChanges> implements ISettableObservable<T, TOutChanges> {\n\tconstructor(\n\t\tdebugNameData: DebugNameData,\n\t\tcomputeFn: (reader: IDerivedReader<TOutChanges>, changeSummary: TChangeSummary) => T,\n\t\tchangeTracker: IChangeTracker<TChangeSummary> | undefined,\n\t\thandleLastObserverRemoved: (() => void) | undefined = undefined,\n\t\tequalityComparator: EqualityComparer<T>,\n\t\tpublic readonly set: (value: T, tx: ITransaction | undefined, change: TOutChanges) => void,\n\t\tdebugLocation: DebugLocation,\n\t) {\n\t\tsuper(\n\t\t\tdebugNameData,\n\t\t\tcomputeFn,\n\t\t\tchangeTracker,\n\t\t\thandleLastObserverRemoved,\n\t\t\tequalityComparator,\n\t\t\tdebugLocation,\n\t\t);\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservable, IObservableWithChange, IObserver, IReaderWithStore, ISettableObservable, ITransaction } from '../base.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugNameData } from '../debugName.js';\nimport { BugIndicatingError, DisposableStore, EqualityComparer, assertFn, onBugIndicatingError } from '../commonFacade/deps.js';\nimport { getLogger } from '../logging/logging.js';\nimport { IChangeTracker } from '../changeTracker.js';\nimport { DebugLocation } from '../debugLocation.js';\n\nexport interface IDerivedReader<TChange = void> extends IReaderWithStore {\n}\n\nexport const enum DerivedState {\n\t/** Initial state, no previous value, recomputation needed */\n\tinitial = 0,\n\n\t/**\n\t * A dependency could have changed.\n\t * We need to explicitly ask them if at least one dependency changed.\n\t */\n\tdependenciesMightHaveChanged = 1,\n\n\t/**\n\t * A dependency changed and we need to recompute.\n\t * After recomputation, we need to check the previous value to see if we changed as well.\n\t */\n\tstale = 2,\n\n\t/**\n\t * No change reported, our cached value is up to date.\n\t */\n\tupToDate = 3,\n}\n\nexport class Derived<T, TChangeSummary = any, TChange = void> extends BaseObservable<T, TChange> implements IDerivedReader<TChange>, IObserver {\n\tprivate _state = DerivedState.initial;\n\tprivate _value: T | undefined = undefined;\n\tprivate _updateCount = 0;\n\tprivate _dependencies = new Set<IObservable<any>>();\n\tprivate _dependenciesToBeRemoved = new Set<IObservable<any>>();\n\tprivate _changeSummary: TChangeSummary | undefined = undefined;\n\tprivate _isUpdating = false;\n\tprivate _isComputing = false;\n\tprivate _didReportChange = false;\n\tprivate _isInBeforeUpdate = false;\n\tprivate _isReaderValid = false;\n\tprivate _store: DisposableStore | undefined = undefined;\n\tprivate _delayedStore: DisposableStore | undefined = undefined;\n\tprivate _removedObserverToCallEndUpdateOn: Set<IObserver> | null = null;\n\n\tpublic override get debugName(): string {\n\t\treturn this._debugNameData.getDebugName(this) ?? '(anonymous)';\n\t}\n\n\tconstructor(\n\t\tpublic readonly _debugNameData: DebugNameData,\n\t\tpublic readonly _computeFn: (reader: IDerivedReader<TChange>, changeSummary: TChangeSummary) => T,\n\t\tprivate readonly _changeTracker: IChangeTracker<TChangeSummary> | undefined,\n\t\tprivate readonly _handleLastObserverRemoved: (() => void) | undefined = undefined,\n\t\tprivate readonly _equalityComparator: EqualityComparer<T>,\n\t\tdebugLocation: DebugLocation,\n\t) {\n\t\tsuper(debugLocation);\n\t\tthis._changeSummary = this._changeTracker?.createChangeSummary(undefined);\n\t}\n\n\tprotected override onLastObserverRemoved(): void {\n\t\t/**\n\t\t * We are not tracking changes anymore, thus we have to assume\n\t\t * that our cache is invalid.\n\t\t */\n\t\tthis._state = DerivedState.initial;\n\t\tthis._value = undefined;\n\t\tgetLogger()?.handleDerivedCleared(this);\n\t\tfor (const d of this._dependencies) {\n\t\t\td.removeObserver(this);\n\t\t}\n\t\tthis._dependencies.clear();\n\n\t\tif (this._store !== undefined) {\n\t\t\tthis._store.dispose();\n\t\t\tthis._store = undefined;\n\t\t}\n\t\tif (this._delayedStore !== undefined) {\n\t\t\tthis._delayedStore.dispose();\n\t\t\tthis._delayedStore = undefined;\n\t\t}\n\n\t\tthis._handleLastObserverRemoved?.();\n\t}\n\n\tpublic override get(): T {\n\t\tconst checkEnabled = false; // TODO set to true\n\t\tif (this._isComputing && checkEnabled) {\n\t\t\t// investigate why this fails in the diff editor!\n\t\t\tthrow new BugIndicatingError('Cyclic deriveds are not supported yet!');\n\t\t}\n\n\t\tif (this._observers.size === 0) {\n\t\t\tlet result;\n\t\t\t// Without observers, we don't know when to clean up stuff.\n\t\t\t// Thus, we don't cache anything to prevent memory leaks.\n\t\t\ttry {\n\t\t\t\tthis._isReaderValid = true;\n\t\t\t\tlet changeSummary = undefined;\n\t\t\t\tif (this._changeTracker) {\n\t\t\t\t\tchangeSummary = this._changeTracker.createChangeSummary(undefined);\n\t\t\t\t\tthis._changeTracker.beforeUpdate?.(this, changeSummary);\n\t\t\t\t}\n\t\t\t\tresult = this._computeFn(this, changeSummary!);\n\t\t\t} finally {\n\t\t\t\tthis._isReaderValid = false;\n\t\t\t}\n\t\t\t// Clear new dependencies\n\t\t\tthis.onLastObserverRemoved();\n\t\t\treturn result;\n\n\t\t} else {\n\t\t\tdo {\n\t\t\t\t// We might not get a notification for a dependency that changed while it is updating,\n\t\t\t\t// thus we also have to ask all our depedencies if they changed in this case.\n\t\t\t\tif (this._state === DerivedState.dependenciesMightHaveChanged) {\n\t\t\t\t\tfor (const d of this._dependencies) {\n\t\t\t\t\t\t/** might call {@link handleChange} indirectly, which could make us stale */\n\t\t\t\t\t\td.reportChanges();\n\n\t\t\t\t\t\tif (this._state as DerivedState === DerivedState.stale) {\n\t\t\t\t\t\t\t// The other dependencies will refresh on demand, so early break\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// We called report changes of all dependencies.\n\t\t\t\t// If we are still not stale, we can assume to be up to date again.\n\t\t\t\tif (this._state === DerivedState.dependenciesMightHaveChanged) {\n\t\t\t\t\tthis._state = DerivedState.upToDate;\n\t\t\t\t}\n\n\t\t\t\tif (this._state !== DerivedState.upToDate) {\n\t\t\t\t\tthis._recompute();\n\t\t\t\t}\n\t\t\t\t// In case recomputation changed one of our dependencies, we need to recompute again.\n\t\t\t} while (this._state !== DerivedState.upToDate);\n\t\t\treturn this._value!;\n\t\t}\n\t}\n\n\tprivate _recompute() {\n\t\tlet didChange = false;\n\t\tthis._isComputing = true;\n\t\tthis._didReportChange = false;\n\n\t\tconst emptySet = this._dependenciesToBeRemoved;\n\t\tthis._dependenciesToBeRemoved = this._dependencies;\n\t\tthis._dependencies = emptySet;\n\n\t\ttry {\n\t\t\tconst changeSummary = this._changeSummary!;\n\n\t\t\tthis._isReaderValid = true;\n\t\t\tif (this._changeTracker) {\n\t\t\t\tthis._isInBeforeUpdate = true;\n\t\t\t\tthis._changeTracker.beforeUpdate?.(this, changeSummary);\n\t\t\t\tthis._isInBeforeUpdate = false;\n\t\t\t\tthis._changeSummary = this._changeTracker?.createChangeSummary(changeSummary);\n\t\t\t}\n\n\t\t\tconst hadValue = this._state !== DerivedState.initial;\n\t\t\tconst oldValue = this._value;\n\t\t\tthis._state = DerivedState.upToDate;\n\n\t\t\tconst delayedStore = this._delayedStore;\n\t\t\tif (delayedStore !== undefined) {\n\t\t\t\tthis._delayedStore = undefined;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tif (this._store !== undefined) {\n\t\t\t\t\tthis._store.dispose();\n\t\t\t\t\tthis._store = undefined;\n\t\t\t\t}\n\t\t\t\t/** might call {@link handleChange} indirectly, which could invalidate us */\n\t\t\t\tthis._value = this._computeFn(this, changeSummary);\n\n\t\t\t} finally {\n\t\t\t\tthis._isReaderValid = false;\n\t\t\t\t// We don't want our observed observables to think that they are (not even temporarily) not being observed.\n\t\t\t\t// Thus, we only unsubscribe from observables that are definitely not read anymore.\n\t\t\t\tfor (const o of this._dependenciesToBeRemoved) {\n\t\t\t\t\to.removeObserver(this);\n\t\t\t\t}\n\t\t\t\tthis._dependenciesToBeRemoved.clear();\n\n\t\t\t\tif (delayedStore !== undefined) {\n\t\t\t\t\tdelayedStore.dispose();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdidChange = this._didReportChange || (hadValue && !(this._equalityComparator(oldValue!, this._value)));\n\n\t\t\tgetLogger()?.handleObservableUpdated(this, {\n\t\t\t\toldValue,\n\t\t\t\tnewValue: this._value,\n\t\t\t\tchange: undefined,\n\t\t\t\tdidChange,\n\t\t\t\thadValue,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tonBugIndicatingError(e);\n\t\t}\n\n\t\tthis._isComputing = false;\n\n\t\tif (!this._didReportChange && didChange) {\n\t\t\tfor (const r of this._observers) {\n\t\t\t\tr.handleChange(this, undefined);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._didReportChange = false;\n\t\t}\n\t}\n\n\tpublic override toString(): string {\n\t\treturn `LazyDerived<${this.debugName}>`;\n\t}\n\n\t// IObserver Implementation\n\n\tpublic beginUpdate<T>(_observable: IObservable<T>): void {\n\t\tif (this._isUpdating) {\n\t\t\tthrow new BugIndicatingError('Cyclic deriveds are not supported yet!');\n\t\t}\n\n\t\tthis._updateCount++;\n\t\tthis._isUpdating = true;\n\t\ttry {\n\t\t\tconst propagateBeginUpdate = this._updateCount === 1;\n\t\t\tif (this._state === DerivedState.upToDate) {\n\t\t\t\tthis._state = DerivedState.dependenciesMightHaveChanged;\n\t\t\t\t// If we propagate begin update, that will already signal a possible change.\n\t\t\t\tif (!propagateBeginUpdate) {\n\t\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\t\tr.handlePossibleChange(this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (propagateBeginUpdate) {\n\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\tr.beginUpdate(this); // This signals a possible change\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._isUpdating = false;\n\t\t}\n\t}\n\n\tpublic endUpdate<T>(_observable: IObservable<T>): void {\n\t\tthis._updateCount--;\n\t\tif (this._updateCount === 0) {\n\t\t\t// End update could change the observer list.\n\t\t\tconst observers = [...this._observers];\n\t\t\tfor (const r of observers) {\n\t\t\t\tr.endUpdate(this);\n\t\t\t}\n\t\t\tif (this._removedObserverToCallEndUpdateOn) {\n\t\t\t\tconst observers = [...this._removedObserverToCallEndUpdateOn];\n\t\t\t\tthis._removedObserverToCallEndUpdateOn = null;\n\t\t\t\tfor (const r of observers) {\n\t\t\t\t\tr.endUpdate(this);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tassertFn(() => this._updateCount >= 0);\n\t}\n\n\tpublic handlePossibleChange<T>(observable: IObservable<T>): void {\n\t\t// In all other states, observers already know that we might have changed.\n\t\tif (this._state === DerivedState.upToDate && this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable)) {\n\t\t\tthis._state = DerivedState.dependenciesMightHaveChanged;\n\t\t\tfor (const r of this._observers) {\n\t\t\t\tr.handlePossibleChange(this);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic handleChange<T, TChange>(observable: IObservableWithChange<T, TChange>, change: TChange): void {\n\t\tif (this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable) || this._isInBeforeUpdate) {\n\t\t\tgetLogger()?.handleDerivedDependencyChanged(this, observable, change);\n\n\t\t\tlet shouldReact = false;\n\t\t\ttry {\n\t\t\t\tshouldReact = this._changeTracker ? this._changeTracker.handleChange({\n\t\t\t\t\tchangedObservable: observable,\n\t\t\t\t\tchange,\n\t\t\t\t\tdidChange: (o): this is any => o === observable as any,\n\t\t\t\t}, this._changeSummary!) : true;\n\t\t\t} catch (e) {\n\t\t\t\tonBugIndicatingError(e);\n\t\t\t}\n\n\t\t\tconst wasUpToDate = this._state === DerivedState.upToDate;\n\t\t\tif (shouldReact && (this._state === DerivedState.dependenciesMightHaveChanged || wasUpToDate)) {\n\t\t\t\tthis._state = DerivedState.stale;\n\t\t\t\tif (wasUpToDate) {\n\t\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\t\tr.handlePossibleChange(this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// IReader Implementation\n\n\tprivate _ensureReaderValid(): void {\n\t\tif (!this._isReaderValid) { throw new BugIndicatingError('The reader object cannot be used outside its compute function!'); }\n\t}\n\n\tpublic readObservable<T>(observable: IObservable<T>): T {\n\t\tthis._ensureReaderValid();\n\n\t\t// Subscribe before getting the value to enable caching\n\t\tobservable.addObserver(this);\n\t\t/** This might call {@link handleChange} indirectly, which could invalidate us */\n\t\tconst value = observable.get();\n\t\t// Which is why we only add the observable to the dependencies now.\n\t\tthis._dependencies.add(observable);\n\t\tthis._dependenciesToBeRemoved.delete(observable);\n\t\treturn value;\n\t}\n\n\tget store(): DisposableStore {\n\t\tthis._ensureReaderValid();\n\n\t\tif (this._store === undefined) {\n\t\t\tthis._store = new DisposableStore();\n\t\t}\n\t\treturn this._store;\n\t}\n\n\tpublic override addObserver(observer: IObserver): void {\n\t\tconst shouldCallBeginUpdate = !this._observers.has(observer) && this._updateCount > 0;\n\t\tsuper.addObserver(observer);\n\n\t\tif (shouldCallBeginUpdate) {\n\t\t\tif (this._removedObserverToCallEndUpdateOn && this._removedObserverToCallEndUpdateOn.has(observer)) {\n\t\t\t\tthis._removedObserverToCallEndUpdateOn.delete(observer);\n\t\t\t} else {\n\t\t\t\tobserver.beginUpdate(this);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override removeObserver(observer: IObserver): void {\n\t\tif (this._observers.has(observer) && this._updateCount > 0) {\n\t\t\tif (!this._removedObserverToCallEndUpdateOn) {\n\t\t\t\tthis._removedObserverToCallEndUpdateOn = new Set();\n\t\t\t}\n\t\t\tthis._removedObserverToCallEndUpdateOn.add(observer);\n\t\t}\n\t\tsuper.removeObserver(observer);\n\t}\n\n\tpublic debugGetState() {\n\t\treturn {\n\t\t\tstate: this._state,\n\t\t\tupdateCount: this._updateCount,\n\t\t\tisComputing: this._isComputing,\n\t\t\tdependencies: this._dependencies,\n\t\t\tvalue: this._value,\n\t\t};\n\t}\n\n\tpublic debugSetValue(newValue: unknown) {\n\t\tthis._value = newValue as any;\n\t}\n\n\tpublic debugRecompute(): void {\n\t\tif (!this._isComputing) {\n\t\t\tthis._recompute();\n\t\t} else {\n\t\t\tthis._state = DerivedState.stale;\n\t\t}\n\t}\n\n\tpublic setValue(newValue: T, tx: ITransaction, change: TChange): void {\n\t\tthis._value = newValue;\n\t\tconst observers = this._observers;\n\t\ttx.updateObserver(this, this);\n\t\tfor (const d of observers) {\n\t\t\td.handleChange(this, change);\n\t\t}\n\t}\n}\n\n\nexport class DerivedWithSetter<T, TChangeSummary = any, TOutChanges = any> extends Derived<T, TChangeSummary, TOutChanges> implements ISettableObservable<T, TOutChanges> {\n\tconstructor(\n\t\tdebugNameData: DebugNameData,\n\t\tcomputeFn: (reader: IDerivedReader<TOutChanges>, changeSummary: TChangeSummary) => T,\n\t\tchangeTracker: IChangeTracker<TChangeSummary> | undefined,\n\t\thandleLastObserverRemoved: (() => void) | undefined = undefined,\n\t\tequalityComparator: EqualityComparer<T>,\n\t\tpublic readonly set: (value: T, tx: ITransaction | undefined, change: TOutChanges) => void,\n\t\tdebugLocation: DebugLocation,\n\t) {\n\t\tsuper(\n\t\t\tdebugNameData,\n\t\t\tcomputeFn,\n\t\t\tchangeTracker,\n\t\t\thandleLastObserverRemoved,\n\t\t\tequalityComparator,\n\t\t\tdebugLocation,\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/common/observableInternal/observables/derivedImpl.ts","vs/base/common/observableInternal/observables/derivedImpl.ts"],"names":[],"mappings":"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","file":"derivedImpl.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservable, IObservableWithChange, IObserver, IReaderWithStore, ISettableObservable, ITransaction } from '../base.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugNameData } from '../debugName.js';\nimport { BugIndicatingError, DisposableStore, EqualityComparer, assertFn, onBugIndicatingError } from '../commonFacade/deps.js';\nimport { getLogger } from '../logging/logging.js';\nimport { IChangeTracker } from '../changeTracker.js';\nimport { DebugLocation } from '../debugLocation.js';\n\nexport interface IDerivedReader<TChange = void> extends IReaderWithStore {\n}\n\nexport const enum DerivedState {\n\t/** Initial state, no previous value, recomputation needed */\n\tinitial = 0,\n\n\t/**\n\t * A dependency could have changed.\n\t * We need to explicitly ask them if at least one dependency changed.\n\t */\n\tdependenciesMightHaveChanged = 1,\n\n\t/**\n\t * A dependency changed and we need to recompute.\n\t * After recomputation, we need to check the previous value to see if we changed as well.\n\t */\n\tstale = 2,\n\n\t/**\n\t * No change reported, our cached value is up to date.\n\t */\n\tupToDate = 3,\n}\n\nfunction derivedStateToString(state: DerivedState): string {\n\tswitch (state) {\n\t\tcase DerivedState.initial: return 'initial';\n\t\tcase DerivedState.dependenciesMightHaveChanged: return 'dependenciesMightHaveChanged';\n\t\tcase DerivedState.stale: return 'stale';\n\t\tcase DerivedState.upToDate: return 'upToDate';\n\t\tdefault: return '<unknown>';\n\t}\n}\n\nexport class Derived<T, TChangeSummary = any, TChange = void> extends BaseObservable<T, TChange> implements IDerivedReader<TChange>, IObserver {\n\tprivate _state = DerivedState.initial;\n\tprivate _value: T | undefined = undefined;\n\tprivate _updateCount = 0;\n\tprivate _dependencies = new Set<IObservable<any>>();\n\tprivate _dependenciesToBeRemoved = new Set<IObservable<any>>();\n\tprivate _changeSummary: TChangeSummary | undefined = undefined;\n\tprivate _isUpdating = false;\n\tprivate _isComputing = false;\n\tprivate _didReportChange = false;\n\tprivate _isInBeforeUpdate = false;\n\tprivate _isReaderValid = false;\n\tprivate _store: DisposableStore | undefined = undefined;\n\tprivate _delayedStore: DisposableStore | undefined = undefined;\n\tprivate _removedObserverToCallEndUpdateOn: Set<IObserver> | null = null;\n\n\tpublic override get debugName(): string {\n\t\treturn this._debugNameData.getDebugName(this) ?? '(anonymous)';\n\t}\n\n\tconstructor(\n\t\tpublic readonly _debugNameData: DebugNameData,\n\t\tpublic readonly _computeFn: (reader: IDerivedReader<TChange>, changeSummary: TChangeSummary) => T,\n\t\tprivate readonly _changeTracker: IChangeTracker<TChangeSummary> | undefined,\n\t\tprivate readonly _handleLastObserverRemoved: (() => void) | undefined = undefined,\n\t\tprivate readonly _equalityComparator: EqualityComparer<T>,\n\t\tdebugLocation: DebugLocation,\n\t) {\n\t\tsuper(debugLocation);\n\t\tthis._changeSummary = this._changeTracker?.createChangeSummary(undefined);\n\t}\n\n\tprotected override onLastObserverRemoved(): void {\n\t\t/**\n\t\t * We are not tracking changes anymore, thus we have to assume\n\t\t * that our cache is invalid.\n\t\t */\n\t\tthis._state = DerivedState.initial;\n\t\tthis._value = undefined;\n\t\tgetLogger()?.handleDerivedCleared(this);\n\t\tfor (const d of this._dependencies) {\n\t\t\td.removeObserver(this);\n\t\t}\n\t\tthis._dependencies.clear();\n\n\t\tif (this._store !== undefined) {\n\t\t\tthis._store.dispose();\n\t\t\tthis._store = undefined;\n\t\t}\n\t\tif (this._delayedStore !== undefined) {\n\t\t\tthis._delayedStore.dispose();\n\t\t\tthis._delayedStore = undefined;\n\t\t}\n\n\t\tthis._handleLastObserverRemoved?.();\n\t}\n\n\tpublic override get(): T {\n\t\tconst checkEnabled = false; // TODO set to true\n\t\tif (this._isComputing && checkEnabled) {\n\t\t\t// investigate why this fails in the diff editor!\n\t\t\tthrow new BugIndicatingError('Cyclic deriveds are not supported yet!');\n\t\t}\n\n\t\tif (this._observers.size === 0) {\n\t\t\tlet result;\n\t\t\t// Without observers, we don't know when to clean up stuff.\n\t\t\t// Thus, we don't cache anything to prevent memory leaks.\n\t\t\ttry {\n\t\t\t\tthis._isReaderValid = true;\n\t\t\t\tlet changeSummary = undefined;\n\t\t\t\tif (this._changeTracker) {\n\t\t\t\t\tchangeSummary = this._changeTracker.createChangeSummary(undefined);\n\t\t\t\t\tthis._changeTracker.beforeUpdate?.(this, changeSummary);\n\t\t\t\t}\n\t\t\t\tresult = this._computeFn(this, changeSummary!);\n\t\t\t} finally {\n\t\t\t\tthis._isReaderValid = false;\n\t\t\t}\n\t\t\t// Clear new dependencies\n\t\t\tthis.onLastObserverRemoved();\n\t\t\treturn result;\n\n\t\t} else {\n\t\t\tdo {\n\t\t\t\t// We might not get a notification for a dependency that changed while it is updating,\n\t\t\t\t// thus we also have to ask all our depedencies if they changed in this case.\n\t\t\t\tif (this._state === DerivedState.dependenciesMightHaveChanged) {\n\t\t\t\t\tfor (const d of this._dependencies) {\n\t\t\t\t\t\t/** might call {@link handleChange} indirectly, which could make us stale */\n\t\t\t\t\t\td.reportChanges();\n\n\t\t\t\t\t\tif (this._state as DerivedState === DerivedState.stale) {\n\t\t\t\t\t\t\t// The other dependencies will refresh on demand, so early break\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// We called report changes of all dependencies.\n\t\t\t\t// If we are still not stale, we can assume to be up to date again.\n\t\t\t\tif (this._state === DerivedState.dependenciesMightHaveChanged) {\n\t\t\t\t\tthis._state = DerivedState.upToDate;\n\t\t\t\t}\n\n\t\t\t\tif (this._state !== DerivedState.upToDate) {\n\t\t\t\t\tthis._recompute();\n\t\t\t\t}\n\t\t\t\t// In case recomputation changed one of our dependencies, we need to recompute again.\n\t\t\t} while (this._state !== DerivedState.upToDate);\n\t\t\treturn this._value!;\n\t\t}\n\t}\n\n\tprivate _recompute() {\n\t\tlet didChange = false;\n\t\tthis._isComputing = true;\n\t\tthis._didReportChange = false;\n\n\t\tconst emptySet = this._dependenciesToBeRemoved;\n\t\tthis._dependenciesToBeRemoved = this._dependencies;\n\t\tthis._dependencies = emptySet;\n\n\t\ttry {\n\t\t\tconst changeSummary = this._changeSummary!;\n\n\t\t\tthis._isReaderValid = true;\n\t\t\tif (this._changeTracker) {\n\t\t\t\tthis._isInBeforeUpdate = true;\n\t\t\t\tthis._changeTracker.beforeUpdate?.(this, changeSummary);\n\t\t\t\tthis._isInBeforeUpdate = false;\n\t\t\t\tthis._changeSummary = this._changeTracker?.createChangeSummary(changeSummary);\n\t\t\t}\n\n\t\t\tconst hadValue = this._state !== DerivedState.initial;\n\t\t\tconst oldValue = this._value;\n\t\t\tthis._state = DerivedState.upToDate;\n\n\t\t\tconst delayedStore = this._delayedStore;\n\t\t\tif (delayedStore !== undefined) {\n\t\t\t\tthis._delayedStore = undefined;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tif (this._store !== undefined) {\n\t\t\t\t\tthis._store.dispose();\n\t\t\t\t\tthis._store = undefined;\n\t\t\t\t}\n\t\t\t\t/** might call {@link handleChange} indirectly, which could invalidate us */\n\t\t\t\tthis._value = this._computeFn(this, changeSummary);\n\n\t\t\t} finally {\n\t\t\t\tthis._isReaderValid = false;\n\t\t\t\t// We don't want our observed observables to think that they are (not even temporarily) not being observed.\n\t\t\t\t// Thus, we only unsubscribe from observables that are definitely not read anymore.\n\t\t\t\tfor (const o of this._dependenciesToBeRemoved) {\n\t\t\t\t\to.removeObserver(this);\n\t\t\t\t}\n\t\t\t\tthis._dependenciesToBeRemoved.clear();\n\n\t\t\t\tif (delayedStore !== undefined) {\n\t\t\t\t\tdelayedStore.dispose();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdidChange = this._didReportChange || (hadValue && !(this._equalityComparator(oldValue!, this._value)));\n\n\t\t\tgetLogger()?.handleObservableUpdated(this, {\n\t\t\t\toldValue,\n\t\t\t\tnewValue: this._value,\n\t\t\t\tchange: undefined,\n\t\t\t\tdidChange,\n\t\t\t\thadValue,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tonBugIndicatingError(e);\n\t\t}\n\n\t\tthis._isComputing = false;\n\n\t\tif (!this._didReportChange && didChange) {\n\t\t\tfor (const r of this._observers) {\n\t\t\t\tr.handleChange(this, undefined);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._didReportChange = false;\n\t\t}\n\t}\n\n\tpublic override toString(): string {\n\t\treturn `LazyDerived<${this.debugName}>`;\n\t}\n\n\t// IObserver Implementation\n\n\tpublic beginUpdate<T>(_observable: IObservable<T>): void {\n\t\tif (this._isUpdating) {\n\t\t\tthrow new BugIndicatingError('Cyclic deriveds are not supported yet!');\n\t\t}\n\n\t\tthis._updateCount++;\n\t\tthis._isUpdating = true;\n\t\ttry {\n\t\t\tconst propagateBeginUpdate = this._updateCount === 1;\n\t\t\tif (this._state === DerivedState.upToDate) {\n\t\t\t\tthis._state = DerivedState.dependenciesMightHaveChanged;\n\t\t\t\t// If we propagate begin update, that will already signal a possible change.\n\t\t\t\tif (!propagateBeginUpdate) {\n\t\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\t\tr.handlePossibleChange(this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (propagateBeginUpdate) {\n\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\tr.beginUpdate(this); // This signals a possible change\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._isUpdating = false;\n\t\t}\n\t}\n\n\tpublic endUpdate<T>(_observable: IObservable<T>): void {\n\t\tthis._updateCount--;\n\t\tif (this._updateCount === 0) {\n\t\t\t// End update could change the observer list.\n\t\t\tconst observers = [...this._observers];\n\t\t\tfor (const r of observers) {\n\t\t\t\tr.endUpdate(this);\n\t\t\t}\n\t\t\tif (this._removedObserverToCallEndUpdateOn) {\n\t\t\t\tconst observers = [...this._removedObserverToCallEndUpdateOn];\n\t\t\t\tthis._removedObserverToCallEndUpdateOn = null;\n\t\t\t\tfor (const r of observers) {\n\t\t\t\t\tr.endUpdate(this);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tassertFn(() => this._updateCount >= 0);\n\t}\n\n\tpublic handlePossibleChange<T>(observable: IObservable<T>): void {\n\t\t// In all other states, observers already know that we might have changed.\n\t\tif (this._state === DerivedState.upToDate && this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable)) {\n\t\t\tthis._state = DerivedState.dependenciesMightHaveChanged;\n\t\t\tfor (const r of this._observers) {\n\t\t\t\tr.handlePossibleChange(this);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic handleChange<T, TChange>(observable: IObservableWithChange<T, TChange>, change: TChange): void {\n\t\tif (this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable) || this._isInBeforeUpdate) {\n\t\t\tgetLogger()?.handleDerivedDependencyChanged(this, observable, change);\n\n\t\t\tlet shouldReact = false;\n\t\t\ttry {\n\t\t\t\tshouldReact = this._changeTracker ? this._changeTracker.handleChange({\n\t\t\t\t\tchangedObservable: observable,\n\t\t\t\t\tchange,\n\t\t\t\t\tdidChange: (o): this is any => o === observable as any,\n\t\t\t\t}, this._changeSummary!) : true;\n\t\t\t} catch (e) {\n\t\t\t\tonBugIndicatingError(e);\n\t\t\t}\n\n\t\t\tconst wasUpToDate = this._state === DerivedState.upToDate;\n\t\t\tif (shouldReact && (this._state === DerivedState.dependenciesMightHaveChanged || wasUpToDate)) {\n\t\t\t\tthis._state = DerivedState.stale;\n\t\t\t\tif (wasUpToDate) {\n\t\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\t\tr.handlePossibleChange(this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// IReader Implementation\n\n\tprivate _ensureReaderValid(): void {\n\t\tif (!this._isReaderValid) { throw new BugIndicatingError('The reader object cannot be used outside its compute function!'); }\n\t}\n\n\tpublic readObservable<T>(observable: IObservable<T>): T {\n\t\tthis._ensureReaderValid();\n\n\t\t// Subscribe before getting the value to enable caching\n\t\tobservable.addObserver(this);\n\t\t/** This might call {@link handleChange} indirectly, which could invalidate us */\n\t\tconst value = observable.get();\n\t\t// Which is why we only add the observable to the dependencies now.\n\t\tthis._dependencies.add(observable);\n\t\tthis._dependenciesToBeRemoved.delete(observable);\n\t\treturn value;\n\t}\n\n\tget store(): DisposableStore {\n\t\tthis._ensureReaderValid();\n\n\t\tif (this._store === undefined) {\n\t\t\tthis._store = new DisposableStore();\n\t\t}\n\t\treturn this._store;\n\t}\n\n\tpublic override addObserver(observer: IObserver): void {\n\t\tconst shouldCallBeginUpdate = !this._observers.has(observer) && this._updateCount > 0;\n\t\tsuper.addObserver(observer);\n\n\t\tif (shouldCallBeginUpdate) {\n\t\t\tif (this._removedObserverToCallEndUpdateOn && this._removedObserverToCallEndUpdateOn.has(observer)) {\n\t\t\t\tthis._removedObserverToCallEndUpdateOn.delete(observer);\n\t\t\t} else {\n\t\t\t\tobserver.beginUpdate(this);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override removeObserver(observer: IObserver): void {\n\t\tif (this._observers.has(observer) && this._updateCount > 0) {\n\t\t\tif (!this._removedObserverToCallEndUpdateOn) {\n\t\t\t\tthis._removedObserverToCallEndUpdateOn = new Set();\n\t\t\t}\n\t\t\tthis._removedObserverToCallEndUpdateOn.add(observer);\n\t\t}\n\t\tsuper.removeObserver(observer);\n\t}\n\n\tpublic debugGetState() {\n\t\treturn {\n\t\t\tstate: this._state,\n\t\t\tstateStr: derivedStateToString(this._state),\n\t\t\tupdateCount: this._updateCount,\n\t\t\tisComputing: this._isComputing,\n\t\t\tdependencies: this._dependencies,\n\t\t\tvalue: this._value,\n\t\t};\n\t}\n\n\tpublic debugSetValue(newValue: unknown) {\n\t\tthis._value = newValue as any;\n\t}\n\n\tpublic debugRecompute(): void {\n\t\tif (!this._isComputing) {\n\t\t\tthis._recompute();\n\t\t} else {\n\t\t\tthis._state = DerivedState.stale;\n\t\t}\n\t}\n\n\tpublic setValue(newValue: T, tx: ITransaction, change: TChange): void {\n\t\tthis._value = newValue;\n\t\tconst observers = this._observers;\n\t\ttx.updateObserver(this, this);\n\t\tfor (const d of observers) {\n\t\t\td.handleChange(this, change);\n\t\t}\n\t}\n}\n\n\nexport class DerivedWithSetter<T, TChangeSummary = any, TOutChanges = any> extends Derived<T, TChangeSummary, TOutChanges> implements ISettableObservable<T, TOutChanges> {\n\tconstructor(\n\t\tdebugNameData: DebugNameData,\n\t\tcomputeFn: (reader: IDerivedReader<TOutChanges>, changeSummary: TChangeSummary) => T,\n\t\tchangeTracker: IChangeTracker<TChangeSummary> | undefined,\n\t\thandleLastObserverRemoved: (() => void) | undefined = undefined,\n\t\tequalityComparator: EqualityComparer<T>,\n\t\tpublic readonly set: (value: T, tx: ITransaction | undefined, change: TOutChanges) => void,\n\t\tdebugLocation: DebugLocation,\n\t) {\n\t\tsuper(\n\t\t\tdebugNameData,\n\t\t\tcomputeFn,\n\t\t\tchangeTracker,\n\t\t\thandleLastObserverRemoved,\n\t\t\tequalityComparator,\n\t\t\tdebugLocation,\n\t\t);\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservable, IObservableWithChange, IObserver, IReaderWithStore, ISettableObservable, ITransaction } from '../base.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugNameData } from '../debugName.js';\nimport { BugIndicatingError, DisposableStore, EqualityComparer, assertFn, onBugIndicatingError } from '../commonFacade/deps.js';\nimport { getLogger } from '../logging/logging.js';\nimport { IChangeTracker } from '../changeTracker.js';\nimport { DebugLocation } from '../debugLocation.js';\n\nexport interface IDerivedReader<TChange = void> extends IReaderWithStore {\n}\n\nexport const enum DerivedState {\n\t/** Initial state, no previous value, recomputation needed */\n\tinitial = 0,\n\n\t/**\n\t * A dependency could have changed.\n\t * We need to explicitly ask them if at least one dependency changed.\n\t */\n\tdependenciesMightHaveChanged = 1,\n\n\t/**\n\t * A dependency changed and we need to recompute.\n\t * After recomputation, we need to check the previous value to see if we changed as well.\n\t */\n\tstale = 2,\n\n\t/**\n\t * No change reported, our cached value is up to date.\n\t */\n\tupToDate = 3,\n}\n\nfunction derivedStateToString(state: DerivedState): string {\n\tswitch (state) {\n\t\tcase DerivedState.initial: return 'initial';\n\t\tcase DerivedState.dependenciesMightHaveChanged: return 'dependenciesMightHaveChanged';\n\t\tcase DerivedState.stale: return 'stale';\n\t\tcase DerivedState.upToDate: return 'upToDate';\n\t\tdefault: return '<unknown>';\n\t}\n}\n\nexport class Derived<T, TChangeSummary = any, TChange = void> extends BaseObservable<T, TChange> implements IDerivedReader<TChange>, IObserver {\n\tprivate _state = DerivedState.initial;\n\tprivate _value: T | undefined = undefined;\n\tprivate _updateCount = 0;\n\tprivate _dependencies = new Set<IObservable<any>>();\n\tprivate _dependenciesToBeRemoved = new Set<IObservable<any>>();\n\tprivate _changeSummary: TChangeSummary | undefined = undefined;\n\tprivate _isUpdating = false;\n\tprivate _isComputing = false;\n\tprivate _didReportChange = false;\n\tprivate _isInBeforeUpdate = false;\n\tprivate _isReaderValid = false;\n\tprivate _store: DisposableStore | undefined = undefined;\n\tprivate _delayedStore: DisposableStore | undefined = undefined;\n\tprivate _removedObserverToCallEndUpdateOn: Set<IObserver> | null = null;\n\n\tpublic override get debugName(): string {\n\t\treturn this._debugNameData.getDebugName(this) ?? '(anonymous)';\n\t}\n\n\tconstructor(\n\t\tpublic readonly _debugNameData: DebugNameData,\n\t\tpublic readonly _computeFn: (reader: IDerivedReader<TChange>, changeSummary: TChangeSummary) => T,\n\t\tprivate readonly _changeTracker: IChangeTracker<TChangeSummary> | undefined,\n\t\tprivate readonly _handleLastObserverRemoved: (() => void) | undefined = undefined,\n\t\tprivate readonly _equalityComparator: EqualityComparer<T>,\n\t\tdebugLocation: DebugLocation,\n\t) {\n\t\tsuper(debugLocation);\n\t\tthis._changeSummary = this._changeTracker?.createChangeSummary(undefined);\n\t}\n\n\tprotected override onLastObserverRemoved(): void {\n\t\t/**\n\t\t * We are not tracking changes anymore, thus we have to assume\n\t\t * that our cache is invalid.\n\t\t */\n\t\tthis._state = DerivedState.initial;\n\t\tthis._value = undefined;\n\t\tgetLogger()?.handleDerivedCleared(this);\n\t\tfor (const d of this._dependencies) {\n\t\t\td.removeObserver(this);\n\t\t}\n\t\tthis._dependencies.clear();\n\n\t\tif (this._store !== undefined) {\n\t\t\tthis._store.dispose();\n\t\t\tthis._store = undefined;\n\t\t}\n\t\tif (this._delayedStore !== undefined) {\n\t\t\tthis._delayedStore.dispose();\n\t\t\tthis._delayedStore = undefined;\n\t\t}\n\n\t\tthis._handleLastObserverRemoved?.();\n\t}\n\n\tpublic override get(): T {\n\t\tconst checkEnabled = false; // TODO set to true\n\t\tif (this._isComputing && checkEnabled) {\n\t\t\t// investigate why this fails in the diff editor!\n\t\t\tthrow new BugIndicatingError('Cyclic deriveds are not supported yet!');\n\t\t}\n\n\t\tif (this._observers.size === 0) {\n\t\t\tlet result;\n\t\t\t// Without observers, we don't know when to clean up stuff.\n\t\t\t// Thus, we don't cache anything to prevent memory leaks.\n\t\t\ttry {\n\t\t\t\tthis._isReaderValid = true;\n\t\t\t\tlet changeSummary = undefined;\n\t\t\t\tif (this._changeTracker) {\n\t\t\t\t\tchangeSummary = this._changeTracker.createChangeSummary(undefined);\n\t\t\t\t\tthis._changeTracker.beforeUpdate?.(this, changeSummary);\n\t\t\t\t}\n\t\t\t\tresult = this._computeFn(this, changeSummary!);\n\t\t\t} finally {\n\t\t\t\tthis._isReaderValid = false;\n\t\t\t}\n\t\t\t// Clear new dependencies\n\t\t\tthis.onLastObserverRemoved();\n\t\t\treturn result;\n\n\t\t} else {\n\t\t\tdo {\n\t\t\t\t// We might not get a notification for a dependency that changed while it is updating,\n\t\t\t\t// thus we also have to ask all our depedencies if they changed in this case.\n\t\t\t\tif (this._state === DerivedState.dependenciesMightHaveChanged) {\n\t\t\t\t\tfor (const d of this._dependencies) {\n\t\t\t\t\t\t/** might call {@link handleChange} indirectly, which could make us stale */\n\t\t\t\t\t\td.reportChanges();\n\n\t\t\t\t\t\tif (this._state as DerivedState === DerivedState.stale) {\n\t\t\t\t\t\t\t// The other dependencies will refresh on demand, so early break\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// We called report changes of all dependencies.\n\t\t\t\t// If we are still not stale, we can assume to be up to date again.\n\t\t\t\tif (this._state === DerivedState.dependenciesMightHaveChanged) {\n\t\t\t\t\tthis._state = DerivedState.upToDate;\n\t\t\t\t}\n\n\t\t\t\tif (this._state !== DerivedState.upToDate) {\n\t\t\t\t\tthis._recompute();\n\t\t\t\t}\n\t\t\t\t// In case recomputation changed one of our dependencies, we need to recompute again.\n\t\t\t} while (this._state !== DerivedState.upToDate);\n\t\t\treturn this._value!;\n\t\t}\n\t}\n\n\tprivate _recompute() {\n\t\tlet didChange = false;\n\t\tthis._isComputing = true;\n\t\tthis._didReportChange = false;\n\n\t\tconst emptySet = this._dependenciesToBeRemoved;\n\t\tthis._dependenciesToBeRemoved = this._dependencies;\n\t\tthis._dependencies = emptySet;\n\n\t\ttry {\n\t\t\tconst changeSummary = this._changeSummary!;\n\n\t\t\tthis._isReaderValid = true;\n\t\t\tif (this._changeTracker) {\n\t\t\t\tthis._isInBeforeUpdate = true;\n\t\t\t\tthis._changeTracker.beforeUpdate?.(this, changeSummary);\n\t\t\t\tthis._isInBeforeUpdate = false;\n\t\t\t\tthis._changeSummary = this._changeTracker?.createChangeSummary(changeSummary);\n\t\t\t}\n\n\t\t\tconst hadValue = this._state !== DerivedState.initial;\n\t\t\tconst oldValue = this._value;\n\t\t\tthis._state = DerivedState.upToDate;\n\n\t\t\tconst delayedStore = this._delayedStore;\n\t\t\tif (delayedStore !== undefined) {\n\t\t\t\tthis._delayedStore = undefined;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tif (this._store !== undefined) {\n\t\t\t\t\tthis._store.dispose();\n\t\t\t\t\tthis._store = undefined;\n\t\t\t\t}\n\t\t\t\t/** might call {@link handleChange} indirectly, which could invalidate us */\n\t\t\t\tthis._value = this._computeFn(this, changeSummary);\n\n\t\t\t} finally {\n\t\t\t\tthis._isReaderValid = false;\n\t\t\t\t// We don't want our observed observables to think that they are (not even temporarily) not being observed.\n\t\t\t\t// Thus, we only unsubscribe from observables that are definitely not read anymore.\n\t\t\t\tfor (const o of this._dependenciesToBeRemoved) {\n\t\t\t\t\to.removeObserver(this);\n\t\t\t\t}\n\t\t\t\tthis._dependenciesToBeRemoved.clear();\n\n\t\t\t\tif (delayedStore !== undefined) {\n\t\t\t\t\tdelayedStore.dispose();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdidChange = this._didReportChange || (hadValue && !(this._equalityComparator(oldValue!, this._value)));\n\n\t\t\tgetLogger()?.handleObservableUpdated(this, {\n\t\t\t\toldValue,\n\t\t\t\tnewValue: this._value,\n\t\t\t\tchange: undefined,\n\t\t\t\tdidChange,\n\t\t\t\thadValue,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tonBugIndicatingError(e);\n\t\t}\n\n\t\tthis._isComputing = false;\n\n\t\tif (!this._didReportChange && didChange) {\n\t\t\tfor (const r of this._observers) {\n\t\t\t\tr.handleChange(this, undefined);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._didReportChange = false;\n\t\t}\n\t}\n\n\tpublic override toString(): string {\n\t\treturn `LazyDerived<${this.debugName}>`;\n\t}\n\n\t// IObserver Implementation\n\n\tpublic beginUpdate<T>(_observable: IObservable<T>): void {\n\t\tif (this._isUpdating) {\n\t\t\tthrow new BugIndicatingError('Cyclic deriveds are not supported yet!');\n\t\t}\n\n\t\tthis._updateCount++;\n\t\tthis._isUpdating = true;\n\t\ttry {\n\t\t\tconst propagateBeginUpdate = this._updateCount === 1;\n\t\t\tif (this._state === DerivedState.upToDate) {\n\t\t\t\tthis._state = DerivedState.dependenciesMightHaveChanged;\n\t\t\t\t// If we propagate begin update, that will already signal a possible change.\n\t\t\t\tif (!propagateBeginUpdate) {\n\t\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\t\tr.handlePossibleChange(this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (propagateBeginUpdate) {\n\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\tr.beginUpdate(this); // This signals a possible change\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._isUpdating = false;\n\t\t}\n\t}\n\n\tpublic endUpdate<T>(_observable: IObservable<T>): void {\n\t\tthis._updateCount--;\n\t\tif (this._updateCount === 0) {\n\t\t\t// End update could change the observer list.\n\t\t\tconst observers = [...this._observers];\n\t\t\tfor (const r of observers) {\n\t\t\t\tr.endUpdate(this);\n\t\t\t}\n\t\t\tif (this._removedObserverToCallEndUpdateOn) {\n\t\t\t\tconst observers = [...this._removedObserverToCallEndUpdateOn];\n\t\t\t\tthis._removedObserverToCallEndUpdateOn = null;\n\t\t\t\tfor (const r of observers) {\n\t\t\t\t\tr.endUpdate(this);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tassertFn(() => this._updateCount >= 0);\n\t}\n\n\tpublic handlePossibleChange<T>(observable: IObservable<T>): void {\n\t\t// In all other states, observers already know that we might have changed.\n\t\tif (this._state === DerivedState.upToDate && this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable)) {\n\t\t\tthis._state = DerivedState.dependenciesMightHaveChanged;\n\t\t\tfor (const r of this._observers) {\n\t\t\t\tr.handlePossibleChange(this);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic handleChange<T, TChange>(observable: IObservableWithChange<T, TChange>, change: TChange): void {\n\t\tif (this._dependencies.has(observable) && !this._dependenciesToBeRemoved.has(observable) || this._isInBeforeUpdate) {\n\t\t\tgetLogger()?.handleDerivedDependencyChanged(this, observable, change);\n\n\t\t\tlet shouldReact = false;\n\t\t\ttry {\n\t\t\t\tshouldReact = this._changeTracker ? this._changeTracker.handleChange({\n\t\t\t\t\tchangedObservable: observable,\n\t\t\t\t\tchange,\n\t\t\t\t\tdidChange: (o): this is any => o === observable as any,\n\t\t\t\t}, this._changeSummary!) : true;\n\t\t\t} catch (e) {\n\t\t\t\tonBugIndicatingError(e);\n\t\t\t}\n\n\t\t\tconst wasUpToDate = this._state === DerivedState.upToDate;\n\t\t\tif (shouldReact && (this._state === DerivedState.dependenciesMightHaveChanged || wasUpToDate)) {\n\t\t\t\tthis._state = DerivedState.stale;\n\t\t\t\tif (wasUpToDate) {\n\t\t\t\t\tfor (const r of this._observers) {\n\t\t\t\t\t\tr.handlePossibleChange(this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// IReader Implementation\n\n\tprivate _ensureReaderValid(): void {\n\t\tif (!this._isReaderValid) { throw new BugIndicatingError('The reader object cannot be used outside its compute function!'); }\n\t}\n\n\tpublic readObservable<T>(observable: IObservable<T>): T {\n\t\tthis._ensureReaderValid();\n\n\t\t// Subscribe before getting the value to enable caching\n\t\tobservable.addObserver(this);\n\t\t/** This might call {@link handleChange} indirectly, which could invalidate us */\n\t\tconst value = observable.get();\n\t\t// Which is why we only add the observable to the dependencies now.\n\t\tthis._dependencies.add(observable);\n\t\tthis._dependenciesToBeRemoved.delete(observable);\n\t\treturn value;\n\t}\n\n\tget store(): DisposableStore {\n\t\tthis._ensureReaderValid();\n\n\t\tif (this._store === undefined) {\n\t\t\tthis._store = new DisposableStore();\n\t\t}\n\t\treturn this._store;\n\t}\n\n\tpublic override addObserver(observer: IObserver): void {\n\t\tconst shouldCallBeginUpdate = !this._observers.has(observer) && this._updateCount > 0;\n\t\tsuper.addObserver(observer);\n\n\t\tif (shouldCallBeginUpdate) {\n\t\t\tif (this._removedObserverToCallEndUpdateOn && this._removedObserverToCallEndUpdateOn.has(observer)) {\n\t\t\t\tthis._removedObserverToCallEndUpdateOn.delete(observer);\n\t\t\t} else {\n\t\t\t\tobserver.beginUpdate(this);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic override removeObserver(observer: IObserver): void {\n\t\tif (this._observers.has(observer) && this._updateCount > 0) {\n\t\t\tif (!this._removedObserverToCallEndUpdateOn) {\n\t\t\t\tthis._removedObserverToCallEndUpdateOn = new Set();\n\t\t\t}\n\t\t\tthis._removedObserverToCallEndUpdateOn.add(observer);\n\t\t}\n\t\tsuper.removeObserver(observer);\n\t}\n\n\tpublic debugGetState() {\n\t\treturn {\n\t\t\tstate: this._state,\n\t\t\tstateStr: derivedStateToString(this._state),\n\t\t\tupdateCount: this._updateCount,\n\t\t\tisComputing: this._isComputing,\n\t\t\tdependencies: this._dependencies,\n\t\t\tvalue: this._value,\n\t\t};\n\t}\n\n\tpublic debugSetValue(newValue: unknown) {\n\t\tthis._value = newValue as any;\n\t}\n\n\tpublic debugRecompute(): void {\n\t\tif (!this._isComputing) {\n\t\t\tthis._recompute();\n\t\t} else {\n\t\t\tthis._state = DerivedState.stale;\n\t\t}\n\t}\n\n\tpublic setValue(newValue: T, tx: ITransaction, change: TChange): void {\n\t\tthis._value = newValue;\n\t\tconst observers = this._observers;\n\t\ttx.updateObserver(this, this);\n\t\tfor (const d of observers) {\n\t\t\td.handleChange(this, change);\n\t\t}\n\t}\n}\n\n\nexport class DerivedWithSetter<T, TChangeSummary = any, TOutChanges = any> extends Derived<T, TChangeSummary, TOutChanges> implements ISettableObservable<T, TOutChanges> {\n\tconstructor(\n\t\tdebugNameData: DebugNameData,\n\t\tcomputeFn: (reader: IDerivedReader<TOutChanges>, changeSummary: TChangeSummary) => T,\n\t\tchangeTracker: IChangeTracker<TChangeSummary> | undefined,\n\t\thandleLastObserverRemoved: (() => void) | undefined = undefined,\n\t\tequalityComparator: EqualityComparer<T>,\n\t\tpublic readonly set: (value: T, tx: ITransaction | undefined, change: TOutChanges) => void,\n\t\tdebugLocation: DebugLocation,\n\t) {\n\t\tsuper(\n\t\t\tdebugNameData,\n\t\t\tcomputeFn,\n\t\t\tchangeTracker,\n\t\t\thandleLastObserverRemoved,\n\t\t\tequalityComparator,\n\t\t\tdebugLocation,\n\t\t);\n\t}\n}\n"]}
|
|
@@ -92,6 +92,9 @@ export class FromEventObservable extends BaseObservable {
|
|
|
92
92
|
debugSetValue(value) {
|
|
93
93
|
this._value = value;
|
|
94
94
|
}
|
|
95
|
+
debugGetState() {
|
|
96
|
+
return { value: this._value, hasValue: this._hasValue };
|
|
97
|
+
}
|
|
95
98
|
}
|
|
96
99
|
(function (observableFromEvent) {
|
|
97
100
|
observableFromEvent.Observer = FromEventObservable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/common/observableInternal/observables/observableFromEvent.ts","vs/base/common/observableInternal/observables/observableFromEvent.ts"],"names":[],"mappings":"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","file":"observableFromEvent.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservable, ITransaction } from '../base.js';\nimport { subtransaction } from '../transaction.js';\nimport { EqualityComparer, Event, IDisposable, strictEquals } from '../commonFacade/deps.js';\nimport { DebugOwner, DebugNameData, IDebugNameData } from '../debugName.js';\nimport { getLogger } from '../logging/logging.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugLocation } from '../debugLocation.js';\n\n\nexport function observableFromEvent<T, TArgs = unknown>(\n\towner: DebugOwner,\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n\tdebugLocation?: DebugLocation,\n): IObservable<T>;\nexport function observableFromEvent<T, TArgs = unknown>(\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n): IObservable<T>;\nexport function observableFromEvent(...args:\n\t[owner: DebugOwner, event: Event<any>, getValue: (args: any | undefined) => any, debugLocation?: DebugLocation] |\n\t[event: Event<any>, getValue: (args: any | undefined) => any]\n): IObservable<any> {\n\tlet owner;\n\tlet event;\n\tlet getValue;\n\tlet debugLocation;\n\tif (args.length === 2) {\n\t\t[event, getValue] = args;\n\t} else {\n\t\t[owner, event, getValue, debugLocation] = args;\n\t}\n\treturn new FromEventObservable(\n\t\tnew DebugNameData(owner, undefined, getValue),\n\t\tevent,\n\t\tgetValue,\n\t\t() => FromEventObservable.globalTransaction,\n\t\tstrictEquals,\n\t\tdebugLocation ?? DebugLocation.ofCaller()\n\t);\n}\n\nexport function observableFromEventOpts<T, TArgs = unknown>(\n\toptions: IDebugNameData & {\n\t\tequalsFn?: EqualityComparer<T>;\n\t},\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n\tdebugLocation = DebugLocation.ofCaller()\n): IObservable<T> {\n\treturn new FromEventObservable(\n\t\tnew DebugNameData(options.owner, options.debugName, options.debugReferenceFn ?? getValue),\n\t\tevent,\n\t\tgetValue, () => FromEventObservable.globalTransaction, options.equalsFn ?? strictEquals, debugLocation\n\t);\n}\n\nexport class FromEventObservable<TArgs, T> extends BaseObservable<T> {\n\tpublic static globalTransaction: ITransaction | undefined;\n\n\tprivate _value: T | undefined;\n\tprivate _hasValue = false;\n\tprivate _subscription: IDisposable | undefined;\n\n\tconstructor(\n\t\tprivate readonly _debugNameData: DebugNameData,\n\t\tprivate readonly event: Event<TArgs>,\n\t\tpublic readonly _getValue: (args: TArgs | undefined) => T,\n\t\tprivate readonly _getTransaction: () => ITransaction | undefined,\n\t\tprivate readonly _equalityComparator: EqualityComparer<T>,\n\t\tdebugLocation: DebugLocation\n\t) {\n\t\tsuper(debugLocation);\n\t}\n\n\tprivate getDebugName(): string | undefined {\n\t\treturn this._debugNameData.getDebugName(this);\n\t}\n\n\tpublic get debugName(): string {\n\t\tconst name = this.getDebugName();\n\t\treturn 'From Event' + (name ? `: ${name}` : '');\n\t}\n\n\tprotected override onFirstObserverAdded(): void {\n\t\tthis._subscription = this.event(this.handleEvent);\n\t}\n\n\tprivate readonly handleEvent = (args: TArgs | undefined) => {\n\t\tconst newValue = this._getValue(args);\n\t\tconst oldValue = this._value;\n\n\t\tconst didChange = !this._hasValue || !(this._equalityComparator(oldValue!, newValue));\n\t\tlet didRunTransaction = false;\n\n\t\tif (didChange) {\n\t\t\tthis._value = newValue;\n\n\t\t\tif (this._hasValue) {\n\t\t\t\tdidRunTransaction = true;\n\t\t\t\tsubtransaction(\n\t\t\t\t\tthis._getTransaction(),\n\t\t\t\t\t(tx) => {\n\t\t\t\t\t\tgetLogger()?.handleObservableUpdated(this, { oldValue, newValue, change: undefined, didChange, hadValue: this._hasValue });\n\n\t\t\t\t\t\tfor (const o of this._observers) {\n\t\t\t\t\t\t\ttx.updateObserver(o, this);\n\t\t\t\t\t\t\to.handleChange(this, undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t() => {\n\t\t\t\t\t\tconst name = this.getDebugName();\n\t\t\t\t\t\treturn 'Event fired' + (name ? `: ${name}` : '');\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis._hasValue = true;\n\t\t}\n\n\t\tif (!didRunTransaction) {\n\t\t\tgetLogger()?.handleObservableUpdated(this, { oldValue, newValue, change: undefined, didChange, hadValue: this._hasValue });\n\t\t}\n\t};\n\n\tprotected override onLastObserverRemoved(): void {\n\t\tthis._subscription!.dispose();\n\t\tthis._subscription = undefined;\n\t\tthis._hasValue = false;\n\t\tthis._value = undefined;\n\t}\n\n\tpublic get(): T {\n\t\tif (this._subscription) {\n\t\t\tif (!this._hasValue) {\n\t\t\t\tthis.handleEvent(undefined);\n\t\t\t}\n\t\t\treturn this._value!;\n\t\t} else {\n\t\t\t// no cache, as there are no subscribers to keep it updated\n\t\t\tconst value = this._getValue(undefined);\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tpublic debugSetValue(value: unknown) {\n\t\tthis._value = value as any;\n\t}\n}\n\nexport namespace observableFromEvent {\n\texport const Observer = FromEventObservable;\n\n\texport function batchEventsGlobally(tx: ITransaction, fn: () => void): void {\n\t\tlet didSet = false;\n\t\tif (FromEventObservable.globalTransaction === undefined) {\n\t\t\tFromEventObservable.globalTransaction = tx;\n\t\t\tdidSet = true;\n\t\t}\n\t\ttry {\n\t\t\tfn();\n\t\t} finally {\n\t\t\tif (didSet) {\n\t\t\t\tFromEventObservable.globalTransaction = undefined;\n\t\t\t}\n\t\t}\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservable, ITransaction } from '../base.js';\nimport { subtransaction } from '../transaction.js';\nimport { EqualityComparer, Event, IDisposable, strictEquals } from '../commonFacade/deps.js';\nimport { DebugOwner, DebugNameData, IDebugNameData } from '../debugName.js';\nimport { getLogger } from '../logging/logging.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugLocation } from '../debugLocation.js';\n\n\nexport function observableFromEvent<T, TArgs = unknown>(\n\towner: DebugOwner,\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n\tdebugLocation?: DebugLocation,\n): IObservable<T>;\nexport function observableFromEvent<T, TArgs = unknown>(\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n): IObservable<T>;\nexport function observableFromEvent(...args:\n\t[owner: DebugOwner, event: Event<any>, getValue: (args: any | undefined) => any, debugLocation?: DebugLocation] |\n\t[event: Event<any>, getValue: (args: any | undefined) => any]\n): IObservable<any> {\n\tlet owner;\n\tlet event;\n\tlet getValue;\n\tlet debugLocation;\n\tif (args.length === 2) {\n\t\t[event, getValue] = args;\n\t} else {\n\t\t[owner, event, getValue, debugLocation] = args;\n\t}\n\treturn new FromEventObservable(\n\t\tnew DebugNameData(owner, undefined, getValue),\n\t\tevent,\n\t\tgetValue,\n\t\t() => FromEventObservable.globalTransaction,\n\t\tstrictEquals,\n\t\tdebugLocation ?? DebugLocation.ofCaller()\n\t);\n}\n\nexport function observableFromEventOpts<T, TArgs = unknown>(\n\toptions: IDebugNameData & {\n\t\tequalsFn?: EqualityComparer<T>;\n\t},\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n\tdebugLocation = DebugLocation.ofCaller()\n): IObservable<T> {\n\treturn new FromEventObservable(\n\t\tnew DebugNameData(options.owner, options.debugName, options.debugReferenceFn ?? getValue),\n\t\tevent,\n\t\tgetValue, () => FromEventObservable.globalTransaction, options.equalsFn ?? strictEquals, debugLocation\n\t);\n}\n\nexport class FromEventObservable<TArgs, T> extends BaseObservable<T> {\n\tpublic static globalTransaction: ITransaction | undefined;\n\n\tprivate _value: T | undefined;\n\tprivate _hasValue = false;\n\tprivate _subscription: IDisposable | undefined;\n\n\tconstructor(\n\t\tprivate readonly _debugNameData: DebugNameData,\n\t\tprivate readonly event: Event<TArgs>,\n\t\tpublic readonly _getValue: (args: TArgs | undefined) => T,\n\t\tprivate readonly _getTransaction: () => ITransaction | undefined,\n\t\tprivate readonly _equalityComparator: EqualityComparer<T>,\n\t\tdebugLocation: DebugLocation\n\t) {\n\t\tsuper(debugLocation);\n\t}\n\n\tprivate getDebugName(): string | undefined {\n\t\treturn this._debugNameData.getDebugName(this);\n\t}\n\n\tpublic get debugName(): string {\n\t\tconst name = this.getDebugName();\n\t\treturn 'From Event' + (name ? `: ${name}` : '');\n\t}\n\n\tprotected override onFirstObserverAdded(): void {\n\t\tthis._subscription = this.event(this.handleEvent);\n\t}\n\n\tprivate readonly handleEvent = (args: TArgs | undefined) => {\n\t\tconst newValue = this._getValue(args);\n\t\tconst oldValue = this._value;\n\n\t\tconst didChange = !this._hasValue || !(this._equalityComparator(oldValue!, newValue));\n\t\tlet didRunTransaction = false;\n\n\t\tif (didChange) {\n\t\t\tthis._value = newValue;\n\n\t\t\tif (this._hasValue) {\n\t\t\t\tdidRunTransaction = true;\n\t\t\t\tsubtransaction(\n\t\t\t\t\tthis._getTransaction(),\n\t\t\t\t\t(tx) => {\n\t\t\t\t\t\tgetLogger()?.handleObservableUpdated(this, { oldValue, newValue, change: undefined, didChange, hadValue: this._hasValue });\n\n\t\t\t\t\t\tfor (const o of this._observers) {\n\t\t\t\t\t\t\ttx.updateObserver(o, this);\n\t\t\t\t\t\t\to.handleChange(this, undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t() => {\n\t\t\t\t\t\tconst name = this.getDebugName();\n\t\t\t\t\t\treturn 'Event fired' + (name ? `: ${name}` : '');\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis._hasValue = true;\n\t\t}\n\n\t\tif (!didRunTransaction) {\n\t\t\tgetLogger()?.handleObservableUpdated(this, { oldValue, newValue, change: undefined, didChange, hadValue: this._hasValue });\n\t\t}\n\t};\n\n\tprotected override onLastObserverRemoved(): void {\n\t\tthis._subscription!.dispose();\n\t\tthis._subscription = undefined;\n\t\tthis._hasValue = false;\n\t\tthis._value = undefined;\n\t}\n\n\tpublic get(): T {\n\t\tif (this._subscription) {\n\t\t\tif (!this._hasValue) {\n\t\t\t\tthis.handleEvent(undefined);\n\t\t\t}\n\t\t\treturn this._value!;\n\t\t} else {\n\t\t\t// no cache, as there are no subscribers to keep it updated\n\t\t\tconst value = this._getValue(undefined);\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tpublic debugSetValue(value: unknown) {\n\t\tthis._value = value as any;\n\t}\n}\n\nexport namespace observableFromEvent {\n\texport const Observer = FromEventObservable;\n\n\texport function batchEventsGlobally(tx: ITransaction, fn: () => void): void {\n\t\tlet didSet = false;\n\t\tif (FromEventObservable.globalTransaction === undefined) {\n\t\t\tFromEventObservable.globalTransaction = tx;\n\t\t\tdidSet = true;\n\t\t}\n\t\ttry {\n\t\t\tfn();\n\t\t} finally {\n\t\t\tif (didSet) {\n\t\t\t\tFromEventObservable.globalTransaction = undefined;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/common/observableInternal/observables/observableFromEvent.ts","vs/base/common/observableInternal/observables/observableFromEvent.ts"],"names":[],"mappings":"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","file":"observableFromEvent.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservable, ITransaction } from '../base.js';\nimport { subtransaction } from '../transaction.js';\nimport { EqualityComparer, Event, IDisposable, strictEquals } from '../commonFacade/deps.js';\nimport { DebugOwner, DebugNameData, IDebugNameData } from '../debugName.js';\nimport { getLogger } from '../logging/logging.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugLocation } from '../debugLocation.js';\n\n\nexport function observableFromEvent<T, TArgs = unknown>(\n\towner: DebugOwner,\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n\tdebugLocation?: DebugLocation,\n): IObservable<T>;\nexport function observableFromEvent<T, TArgs = unknown>(\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n): IObservable<T>;\nexport function observableFromEvent(...args:\n\t[owner: DebugOwner, event: Event<any>, getValue: (args: any | undefined) => any, debugLocation?: DebugLocation] |\n\t[event: Event<any>, getValue: (args: any | undefined) => any]\n): IObservable<any> {\n\tlet owner;\n\tlet event;\n\tlet getValue;\n\tlet debugLocation;\n\tif (args.length === 2) {\n\t\t[event, getValue] = args;\n\t} else {\n\t\t[owner, event, getValue, debugLocation] = args;\n\t}\n\treturn new FromEventObservable(\n\t\tnew DebugNameData(owner, undefined, getValue),\n\t\tevent,\n\t\tgetValue,\n\t\t() => FromEventObservable.globalTransaction,\n\t\tstrictEquals,\n\t\tdebugLocation ?? DebugLocation.ofCaller()\n\t);\n}\n\nexport function observableFromEventOpts<T, TArgs = unknown>(\n\toptions: IDebugNameData & {\n\t\tequalsFn?: EqualityComparer<T>;\n\t},\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n\tdebugLocation = DebugLocation.ofCaller()\n): IObservable<T> {\n\treturn new FromEventObservable(\n\t\tnew DebugNameData(options.owner, options.debugName, options.debugReferenceFn ?? getValue),\n\t\tevent,\n\t\tgetValue, () => FromEventObservable.globalTransaction, options.equalsFn ?? strictEquals, debugLocation\n\t);\n}\n\nexport class FromEventObservable<TArgs, T> extends BaseObservable<T> {\n\tpublic static globalTransaction: ITransaction | undefined;\n\n\tprivate _value: T | undefined;\n\tprivate _hasValue = false;\n\tprivate _subscription: IDisposable | undefined;\n\n\tconstructor(\n\t\tprivate readonly _debugNameData: DebugNameData,\n\t\tprivate readonly event: Event<TArgs>,\n\t\tpublic readonly _getValue: (args: TArgs | undefined) => T,\n\t\tprivate readonly _getTransaction: () => ITransaction | undefined,\n\t\tprivate readonly _equalityComparator: EqualityComparer<T>,\n\t\tdebugLocation: DebugLocation\n\t) {\n\t\tsuper(debugLocation);\n\t}\n\n\tprivate getDebugName(): string | undefined {\n\t\treturn this._debugNameData.getDebugName(this);\n\t}\n\n\tpublic get debugName(): string {\n\t\tconst name = this.getDebugName();\n\t\treturn 'From Event' + (name ? `: ${name}` : '');\n\t}\n\n\tprotected override onFirstObserverAdded(): void {\n\t\tthis._subscription = this.event(this.handleEvent);\n\t}\n\n\tprivate readonly handleEvent = (args: TArgs | undefined) => {\n\t\tconst newValue = this._getValue(args);\n\t\tconst oldValue = this._value;\n\n\t\tconst didChange = !this._hasValue || !(this._equalityComparator(oldValue!, newValue));\n\t\tlet didRunTransaction = false;\n\n\t\tif (didChange) {\n\t\t\tthis._value = newValue;\n\n\t\t\tif (this._hasValue) {\n\t\t\t\tdidRunTransaction = true;\n\t\t\t\tsubtransaction(\n\t\t\t\t\tthis._getTransaction(),\n\t\t\t\t\t(tx) => {\n\t\t\t\t\t\tgetLogger()?.handleObservableUpdated(this, { oldValue, newValue, change: undefined, didChange, hadValue: this._hasValue });\n\n\t\t\t\t\t\tfor (const o of this._observers) {\n\t\t\t\t\t\t\ttx.updateObserver(o, this);\n\t\t\t\t\t\t\to.handleChange(this, undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t() => {\n\t\t\t\t\t\tconst name = this.getDebugName();\n\t\t\t\t\t\treturn 'Event fired' + (name ? `: ${name}` : '');\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis._hasValue = true;\n\t\t}\n\n\t\tif (!didRunTransaction) {\n\t\t\tgetLogger()?.handleObservableUpdated(this, { oldValue, newValue, change: undefined, didChange, hadValue: this._hasValue });\n\t\t}\n\t};\n\n\tprotected override onLastObserverRemoved(): void {\n\t\tthis._subscription!.dispose();\n\t\tthis._subscription = undefined;\n\t\tthis._hasValue = false;\n\t\tthis._value = undefined;\n\t}\n\n\tpublic get(): T {\n\t\tif (this._subscription) {\n\t\t\tif (!this._hasValue) {\n\t\t\t\tthis.handleEvent(undefined);\n\t\t\t}\n\t\t\treturn this._value!;\n\t\t} else {\n\t\t\t// no cache, as there are no subscribers to keep it updated\n\t\t\tconst value = this._getValue(undefined);\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tpublic debugSetValue(value: unknown): void {\n\t\tthis._value = value as any;\n\t}\n\n\tpublic debugGetState() {\n\t\treturn { value: this._value, hasValue: this._hasValue };\n\t}\n}\n\nexport namespace observableFromEvent {\n\texport const Observer = FromEventObservable;\n\n\texport function batchEventsGlobally(tx: ITransaction, fn: () => void): void {\n\t\tlet didSet = false;\n\t\tif (FromEventObservable.globalTransaction === undefined) {\n\t\t\tFromEventObservable.globalTransaction = tx;\n\t\t\tdidSet = true;\n\t\t}\n\t\ttry {\n\t\t\tfn();\n\t\t} finally {\n\t\t\tif (didSet) {\n\t\t\t\tFromEventObservable.globalTransaction = undefined;\n\t\t\t}\n\t\t}\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IObservable, ITransaction } from '../base.js';\nimport { subtransaction } from '../transaction.js';\nimport { EqualityComparer, Event, IDisposable, strictEquals } from '../commonFacade/deps.js';\nimport { DebugOwner, DebugNameData, IDebugNameData } from '../debugName.js';\nimport { getLogger } from '../logging/logging.js';\nimport { BaseObservable } from './baseObservable.js';\nimport { DebugLocation } from '../debugLocation.js';\n\n\nexport function observableFromEvent<T, TArgs = unknown>(\n\towner: DebugOwner,\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n\tdebugLocation?: DebugLocation,\n): IObservable<T>;\nexport function observableFromEvent<T, TArgs = unknown>(\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n): IObservable<T>;\nexport function observableFromEvent(...args:\n\t[owner: DebugOwner, event: Event<any>, getValue: (args: any | undefined) => any, debugLocation?: DebugLocation] |\n\t[event: Event<any>, getValue: (args: any | undefined) => any]\n): IObservable<any> {\n\tlet owner;\n\tlet event;\n\tlet getValue;\n\tlet debugLocation;\n\tif (args.length === 2) {\n\t\t[event, getValue] = args;\n\t} else {\n\t\t[owner, event, getValue, debugLocation] = args;\n\t}\n\treturn new FromEventObservable(\n\t\tnew DebugNameData(owner, undefined, getValue),\n\t\tevent,\n\t\tgetValue,\n\t\t() => FromEventObservable.globalTransaction,\n\t\tstrictEquals,\n\t\tdebugLocation ?? DebugLocation.ofCaller()\n\t);\n}\n\nexport function observableFromEventOpts<T, TArgs = unknown>(\n\toptions: IDebugNameData & {\n\t\tequalsFn?: EqualityComparer<T>;\n\t},\n\tevent: Event<TArgs>,\n\tgetValue: (args: TArgs | undefined) => T,\n\tdebugLocation = DebugLocation.ofCaller()\n): IObservable<T> {\n\treturn new FromEventObservable(\n\t\tnew DebugNameData(options.owner, options.debugName, options.debugReferenceFn ?? getValue),\n\t\tevent,\n\t\tgetValue, () => FromEventObservable.globalTransaction, options.equalsFn ?? strictEquals, debugLocation\n\t);\n}\n\nexport class FromEventObservable<TArgs, T> extends BaseObservable<T> {\n\tpublic static globalTransaction: ITransaction | undefined;\n\n\tprivate _value: T | undefined;\n\tprivate _hasValue = false;\n\tprivate _subscription: IDisposable | undefined;\n\n\tconstructor(\n\t\tprivate readonly _debugNameData: DebugNameData,\n\t\tprivate readonly event: Event<TArgs>,\n\t\tpublic readonly _getValue: (args: TArgs | undefined) => T,\n\t\tprivate readonly _getTransaction: () => ITransaction | undefined,\n\t\tprivate readonly _equalityComparator: EqualityComparer<T>,\n\t\tdebugLocation: DebugLocation\n\t) {\n\t\tsuper(debugLocation);\n\t}\n\n\tprivate getDebugName(): string | undefined {\n\t\treturn this._debugNameData.getDebugName(this);\n\t}\n\n\tpublic get debugName(): string {\n\t\tconst name = this.getDebugName();\n\t\treturn 'From Event' + (name ? `: ${name}` : '');\n\t}\n\n\tprotected override onFirstObserverAdded(): void {\n\t\tthis._subscription = this.event(this.handleEvent);\n\t}\n\n\tprivate readonly handleEvent = (args: TArgs | undefined) => {\n\t\tconst newValue = this._getValue(args);\n\t\tconst oldValue = this._value;\n\n\t\tconst didChange = !this._hasValue || !(this._equalityComparator(oldValue!, newValue));\n\t\tlet didRunTransaction = false;\n\n\t\tif (didChange) {\n\t\t\tthis._value = newValue;\n\n\t\t\tif (this._hasValue) {\n\t\t\t\tdidRunTransaction = true;\n\t\t\t\tsubtransaction(\n\t\t\t\t\tthis._getTransaction(),\n\t\t\t\t\t(tx) => {\n\t\t\t\t\t\tgetLogger()?.handleObservableUpdated(this, { oldValue, newValue, change: undefined, didChange, hadValue: this._hasValue });\n\n\t\t\t\t\t\tfor (const o of this._observers) {\n\t\t\t\t\t\t\ttx.updateObserver(o, this);\n\t\t\t\t\t\t\to.handleChange(this, undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t() => {\n\t\t\t\t\t\tconst name = this.getDebugName();\n\t\t\t\t\t\treturn 'Event fired' + (name ? `: ${name}` : '');\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis._hasValue = true;\n\t\t}\n\n\t\tif (!didRunTransaction) {\n\t\t\tgetLogger()?.handleObservableUpdated(this, { oldValue, newValue, change: undefined, didChange, hadValue: this._hasValue });\n\t\t}\n\t};\n\n\tprotected override onLastObserverRemoved(): void {\n\t\tthis._subscription!.dispose();\n\t\tthis._subscription = undefined;\n\t\tthis._hasValue = false;\n\t\tthis._value = undefined;\n\t}\n\n\tpublic get(): T {\n\t\tif (this._subscription) {\n\t\t\tif (!this._hasValue) {\n\t\t\t\tthis.handleEvent(undefined);\n\t\t\t}\n\t\t\treturn this._value!;\n\t\t} else {\n\t\t\t// no cache, as there are no subscribers to keep it updated\n\t\t\tconst value = this._getValue(undefined);\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tpublic debugSetValue(value: unknown): void {\n\t\tthis._value = value as any;\n\t}\n\n\tpublic debugGetState() {\n\t\treturn { value: this._value, hasValue: this._hasValue };\n\t}\n}\n\nexport namespace observableFromEvent {\n\texport const Observer = FromEventObservable;\n\n\texport function batchEventsGlobally(tx: ITransaction, fn: () => void): void {\n\t\tlet didSet = false;\n\t\tif (FromEventObservable.globalTransaction === undefined) {\n\t\t\tFromEventObservable.globalTransaction = tx;\n\t\t\tdidSet = true;\n\t\t}\n\t\ttry {\n\t\t\tfn();\n\t\t} finally {\n\t\t\tif (didSet) {\n\t\t\t\tFromEventObservable.globalTransaction = undefined;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -4,6 +4,14 @@
|
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { assertFn, BugIndicatingError, DisposableStore, markAsDisposed, onBugIndicatingError, trackDisposable } from '../commonFacade/deps.js';
|
|
6
6
|
import { getLogger } from '../logging/logging.js';
|
|
7
|
+
function autorunStateToString(state) {
|
|
8
|
+
switch (state) {
|
|
9
|
+
case 1 /* AutorunState.dependenciesMightHaveChanged */: return 'dependenciesMightHaveChanged';
|
|
10
|
+
case 2 /* AutorunState.stale */: return 'stale';
|
|
11
|
+
case 3 /* AutorunState.upToDate */: return 'upToDate';
|
|
12
|
+
default: return '<unknown>';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
7
15
|
export class AutorunObserver {
|
|
8
16
|
get debugName() {
|
|
9
17
|
return this._debugNameData.getDebugName(this) ?? '(anonymous)';
|
|
@@ -187,6 +195,7 @@ export class AutorunObserver {
|
|
|
187
195
|
updateCount: this._updateCount,
|
|
188
196
|
dependencies: this._dependencies,
|
|
189
197
|
state: this._state,
|
|
198
|
+
stateStr: autorunStateToString(this._state),
|
|
190
199
|
};
|
|
191
200
|
}
|
|
192
201
|
debugRerun() {
|