Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

completes observable refactoring #154089

Merged
merged 1 commit into from
Jul 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/vs/base/common/observableImpl/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ export class TransactionImpl implements ITransaction {
export interface ISettableObservable<T, TChange = void> extends IObservable<T, TChange>, ISettable<T, TChange> {
}

export function observableValue<T>(name: string, initialValue: T): ISettableObservable<T> {
export function observableValue<T, TChange = void>(name: string, initialValue: T): ISettableObservable<T, TChange> {
return new ObservableValue(name, initialValue);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
*--------------------------------------------------------------------------------------------*/

import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { autorunWithStore } from 'vs/base/common/observable';
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
import { AudioCue, IAudioCueService } from 'vs/workbench/contrib/audioCues/browser/audioCueService';
import { autorunWithStore } from 'vs/workbench/contrib/audioCues/browser/observable';
import { IDebugService, IDebugSession } from 'vs/workbench/contrib/debug/common/debug';

export class AudioCueLineDebuggerContribution
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,11 @@ import { ICodeEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/edito
import { IMarkerService, MarkerSeverity } from 'vs/platform/markers/common/markers';
import { FoldingController } from 'vs/editor/contrib/folding/browser/folding';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import {
autorun,
autorunDelta,
constObservable,
derivedObservable,
observableFromEvent,
observableFromPromise,
IObservable,
wasEventTriggeredRecently,
debouncedObservable,
} from 'vs/workbench/contrib/audioCues/browser/observable';
import { ITextModel } from 'vs/editor/common/model';
import { GhostTextController } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextController';
import { AudioCue, IAudioCueService } from 'vs/workbench/contrib/audioCues/browser/audioCueService';
import { CursorChangeReason } from 'vs/editor/common/cursorEvents';
import { autorun, autorunDelta, constObservable, debouncedObservable, derived, IObservable, observableFromEvent, observableFromPromise, wasEventTriggeredRecently } from 'vs/base/common/observable';

export class AudioCueLineFeatureContribution
extends Disposable
Expand All @@ -48,7 +38,7 @@ export class AudioCueLineFeatureContribution
) {
super();

const someAudioCueFeatureIsEnabled = derivedObservable(
const someAudioCueFeatureIsEnabled = derived(
'someAudioCueFeatureIsEnabled',
(reader) =>
this.features.some((feature) =>
Expand All @@ -73,7 +63,7 @@ export class AudioCueLineFeatureContribution
);

this._register(
autorun((reader) => {
autorun('updateAudioCuesEnabled', (reader) => {
this.store.clear();

if (!someAudioCueFeatureIsEnabled.read(reader)) {
Expand All @@ -84,7 +74,7 @@ export class AudioCueLineFeatureContribution
if (activeEditor) {
this.registerAudioCuesForEditor(activeEditor.editor, activeEditor.model, this.store);
}
}, 'updateAudioCuesEnabled')
})
);
}

Expand Down Expand Up @@ -118,7 +108,7 @@ export class AudioCueLineFeatureContribution

const featureStates = this.features.map((feature) => {
const lineFeatureState = feature.getObservableState(editor, editorModel);
const isFeaturePresent = derivedObservable(
const isFeaturePresent = derived(
`isPresentInLine:${feature.audioCue.name}`,
(reader) => {
if (!this.audioCueService.isEnabled(feature.audioCue).read(reader)) {
Expand All @@ -130,7 +120,7 @@ export class AudioCueLineFeatureContribution
: lineFeatureState.read(reader).isPresent(lineNumber);
}
);
return derivedObservable(
return derived(
`typingDebouncedFeatureState:\n${feature.audioCue.name}`,
(reader) =>
feature.debounceWhileTyping && isTyping.read(reader)
Expand All @@ -139,7 +129,7 @@ export class AudioCueLineFeatureContribution
);
});

const state = derivedObservable(
const state = derived(
'states',
(reader) => ({
lineNumber: debouncedLineNumber.read(reader),
Expand Down Expand Up @@ -282,7 +272,7 @@ class InlineCompletionLineFeature implements LineFeature {
: undefined
));

return derivedObservable<LineFeatureState>('ghostText', reader => {
return derived<LineFeatureState>('ghostText', reader => {
const ghostText = activeGhostText.read(reader)?.read(reader);
return {
isPresent(lineNumber) {
Expand Down
4 changes: 2 additions & 2 deletions src/vs/workbench/contrib/audioCues/browser/audioCueService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import { FileAccess } from 'vs/base/common/network';
import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
import { observableFromEvent, IObservable, derivedObservable } from 'vs/workbench/contrib/audioCues/browser/observable';
import { Event } from 'vs/base/common/event';
import { localize } from 'vs/nls';
import { IObservable, observableFromEvent, derived } from 'vs/base/common/observable';

export const IAudioCueService = createDecorator<IAudioCueService>('audioCue');

Expand Down Expand Up @@ -95,7 +95,7 @@ export class AudioCueService extends Disposable implements IAudioCueService {
),
() => this.configurationService.getValue<'on' | 'off' | 'auto'>(cue.settingsKey)
);
return derivedObservable('audio cue enabled', reader => {
return derived('audio cue enabled', reader => {
const setting = settingObservable.read(reader);
if (
setting === 'on' ||
Expand Down
40 changes: 0 additions & 40 deletions src/vs/workbench/contrib/audioCues/browser/observable.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@

import { CompareResult, equals } from 'vs/base/common/arrays';
import { BugIndicatingError } from 'vs/base/common/errors';
import { ISettableObservable, derived, waitForState, observableValue, keepAlive, autorunHandleChanges, transaction, IReader, ITransaction, IObservable } from 'vs/base/common/observable';
import { ILanguageService } from 'vs/editor/common/languages/language';
import { ITextModel, ITextSnapshot } from 'vs/editor/common/model';
import { IModelService } from 'vs/editor/common/services/model';
import { EditorModel } from 'vs/workbench/common/editor/editorModel';
import { autorunHandleChanges, derivedObservable, IObservable, IReader, ITransaction, keepAlive, ObservableValue, transaction, waitForState } from 'vs/workbench/contrib/audioCues/browser/observable';
import { IDiffComputer } from 'vs/workbench/contrib/mergeEditor/browser/model/diffComputer';
import { LineRange } from 'vs/workbench/contrib/mergeEditor/browser/model/lineRange';
import { DetailedLineRangeMapping, DocumentMapping, LineRangeMapping } from 'vs/workbench/contrib/mergeEditor/browser/model/mapping';
Expand All @@ -28,7 +28,7 @@ export class MergeEditorModel extends EditorModel {
private readonly input2TextModelDiffs = this._register(new TextModelDiffs(this.base, this.input2, this.diffComputer));
private readonly resultTextModelDiffs = this._register(new TextModelDiffs(this.base, this.result, this.diffComputer));

public readonly state = derivedObservable('state', reader => {
public readonly state = derived('state', reader => {
const states = [
this.input1TextModelDiffs,
this.input2TextModelDiffs,
Expand All @@ -44,11 +44,11 @@ export class MergeEditorModel extends EditorModel {
return MergeEditorModelState.upToDate;
});

public readonly isUpToDate = derivedObservable('isUpToDate', reader => this.state.read(reader) === MergeEditorModelState.upToDate);
public readonly isUpToDate = derived('isUpToDate', reader => this.state.read(reader) === MergeEditorModelState.upToDate);

public readonly onInitialized = waitForState(this.state, state => state === MergeEditorModelState.upToDate);

public readonly modifiedBaseRanges = derivedObservable<ModifiedBaseRange[]>('modifiedBaseRanges', (reader) => {
public readonly modifiedBaseRanges = derived<ModifiedBaseRange[]>('modifiedBaseRanges', (reader) => {
const input1Diffs = this.input1TextModelDiffs.diffs.read(reader);
const input2Diffs = this.input2TextModelDiffs.diffs.read(reader);

Expand All @@ -60,22 +60,22 @@ export class MergeEditorModel extends EditorModel {
public readonly resultDiffs = this.resultTextModelDiffs.diffs;

private readonly modifiedBaseRangeStateStores =
derivedObservable('modifiedBaseRangeStateStores', reader => {
derived('modifiedBaseRangeStateStores', reader => {
const map = new Map(
this.modifiedBaseRanges.read(reader).map(s => ([s, new ObservableValue(ModifiedBaseRangeState.default, 'State')]))
this.modifiedBaseRanges.read(reader).map(s => ([s, observableValue('State', ModifiedBaseRangeState.default)]))
);
return map;
});

private readonly modifiedBaseRangeHandlingStateStores =
derivedObservable('modifiedBaseRangeHandlingStateStores', reader => {
derived('modifiedBaseRangeHandlingStateStores', reader => {
const map = new Map(
this.modifiedBaseRanges.read(reader).map(s => ([s, new ObservableValue(false, 'State')]))
this.modifiedBaseRanges.read(reader).map(s => ([s, observableValue('State', false)]))
);
return map;
});

public readonly unhandledConflictsCount = derivedObservable('unhandledConflictsCount', reader => {
public readonly unhandledConflictsCount = derived('unhandledConflictsCount', reader => {
const map = this.modifiedBaseRangeHandlingStateStores.read(reader);
let handledCount = 0;
for (const [_key, value] of map) {
Expand All @@ -86,7 +86,7 @@ export class MergeEditorModel extends EditorModel {

public readonly hasUnhandledConflicts = this.unhandledConflictsCount.map(value => /** @description hasUnhandledConflicts */ value > 0);

public readonly input1ResultMapping = derivedObservable('input1ResultMapping', reader => {
public readonly input1ResultMapping = derived('input1ResultMapping', reader => {
const resultDiffs = this.resultDiffs.read(reader);
const modifiedBaseRanges = DocumentMapping.betweenOutputs(this.input1LinesDiffs.read(reader), resultDiffs, this.input1.getLineCount());

Expand All @@ -103,7 +103,7 @@ export class MergeEditorModel extends EditorModel {
);
});

public readonly input2ResultMapping = derivedObservable('input2ResultMapping', reader => {
public readonly input2ResultMapping = derived('input2ResultMapping', reader => {
const resultDiffs = this.resultDiffs.read(reader);
const modifiedBaseRanges = DocumentMapping.betweenOutputs(this.input2LinesDiffs.read(reader), resultDiffs, this.input2.getLineCount());

Expand Down Expand Up @@ -192,7 +192,7 @@ export class MergeEditorModel extends EditorModel {
return this.resultTextModelDiffs.getResultRange(baseRange, reader);
}

private recomputeState(resultDiffs: DetailedLineRangeMapping[], stores: Map<ModifiedBaseRange, ObservableValue<ModifiedBaseRangeState>>, tx: ITransaction): void {
private recomputeState(resultDiffs: DetailedLineRangeMapping[], stores: Map<ModifiedBaseRange, ISettableObservable<ModifiedBaseRangeState>>, tx: ITransaction): void {
const baseRangeWithStoreAndTouchingDiffs = leftJoin(
stores,
resultDiffs,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@ import { compareBy, numberComparator } from 'vs/base/common/arrays';
import { BugIndicatingError } from 'vs/base/common/errors';
import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
import { ITextModel } from 'vs/editor/common/model';
import { IObservable, IReader, ITransaction, ObservableValue, transaction } from 'vs/workbench/contrib/audioCues/browser/observable';
import { DetailedLineRangeMapping } from 'vs/workbench/contrib/mergeEditor/browser/model/mapping';
import { LineRangeEdit } from 'vs/workbench/contrib/mergeEditor/browser/model/editing';
import { LineRange } from 'vs/workbench/contrib/mergeEditor/browser/model/lineRange';
import { ReentrancyBarrier } from 'vs/workbench/contrib/mergeEditor/browser/utils';
import { IDiffComputer } from './diffComputer';
import { IObservable, IReader, ITransaction, observableValue, transaction } from 'vs/base/common/observable';

export class TextModelDiffs extends Disposable {
private updateCount = 0;
private readonly _state = new ObservableValue<TextModelDiffState, TextModelDiffChangeReason>(TextModelDiffState.initializing, 'LiveDiffState');
private readonly _diffs = new ObservableValue<DetailedLineRangeMapping[], TextModelDiffChangeReason>([], 'LiveDiffs');
private readonly _state = observableValue<TextModelDiffState, TextModelDiffChangeReason>('LiveDiffState', TextModelDiffState.initializing);
private readonly _diffs = observableValue<DetailedLineRangeMapping[], TextModelDiffChangeReason>('LiveDiffs', []);

private readonly barrier = new ReentrancyBarrier();
private isDisposed = false;
Expand Down
9 changes: 4 additions & 5 deletions src/vs/workbench/contrib/mergeEditor/browser/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,10 @@

import { CompareResult, ArrayQueue } from 'vs/base/common/arrays';
import { BugIndicatingError } from 'vs/base/common/errors';
import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle';
import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { IObservable, autorun } from 'vs/base/common/observable';
import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget';
import { IModelDeltaDecoration } from 'vs/editor/common/model';
import { IObservable, autorun } from 'vs/workbench/contrib/audioCues/browser/observable';
import { IDisposable } from 'xterm';

export class ReentrancyBarrier {
private isActive = false;
Expand Down Expand Up @@ -74,12 +73,12 @@ function toSize(value: number | string): string {
export function applyObservableDecorations(editor: CodeEditorWidget, decorations: IObservable<IModelDeltaDecoration[]>): IDisposable {
const d = new DisposableStore();
let decorationIds: string[] = [];
d.add(autorun(reader => {
d.add(autorun(`Apply decorations from ${decorations.debugName}`, reader => {
const d = decorations.read(reader);
editor.changeDecorations(a => {
decorationIds = a.deltaDecorations(decorationIds, d);
});
}, `Apply decorations from ${decorations.debugName}`));
}));
d.add({
dispose: () => {
editor.changeDecorations(a => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@

import { h } from 'vs/base/browser/dom';
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
import { observableSignalFromEvent } from 'vs/base/common/observable';
import { autorun, IReader, observableFromEvent, observableSignalFromEvent } from 'vs/base/common/observable';
import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget';
import { autorun, IReader, observableFromEvent } from 'vs/workbench/contrib/audioCues/browser/observable';
import { LineRange } from 'vs/workbench/contrib/mergeEditor/browser/model/lineRange';

export class EditorGutter<T extends IGutterItemInfo = IGutterItemInfo> extends Disposable {
Expand Down Expand Up @@ -36,11 +35,11 @@ export class EditorGutter<T extends IGutterItemInfo = IGutterItemInfo> extends D
.root
);

this._register(autorun((reader) => {
this._register(autorun('update scroll decoration', (reader) => {
scrollDecoration.className = this.isScrollTopZero.read(reader) ? '' : 'scroll-decoration';
}, 'update scroll decoration'));
}));

this._register(autorun((reader) => this.render(reader), 'EditorGutter.Render'));
this._register(autorun('EditorGutter.Render', (reader) => this.render(reader)));
}

private readonly views = new Map<string, ManagedGutterItemView>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@ import { IView, IViewSize } from 'vs/base/browser/ui/grid/grid';
import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels';
import { Emitter, Event } from 'vs/base/common/event';
import { Disposable } from 'vs/base/common/lifecycle';
import { IObservable, observableFromEvent, observableValue, transaction } from 'vs/base/common/observable';
import { IEditorContributionDescription } from 'vs/editor/browser/editorExtensions';
import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget';
import { IEditorOptions } from 'vs/editor/common/config/editorOptions';
import { ITextModel } from 'vs/editor/common/model';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { DEFAULT_EDITOR_MAX_DIMENSIONS, DEFAULT_EDITOR_MIN_DIMENSIONS } from 'vs/workbench/browser/parts/editor/editor';
import { IObservable, observableFromEvent, ObservableValue, transaction } from 'vs/workbench/contrib/audioCues/browser/observable';
import { setStyle } from 'vs/workbench/contrib/mergeEditor/browser/utils';
import { MergeEditorViewModel } from 'vs/workbench/contrib/mergeEditor/browser/view/viewModel';

export abstract class CodeEditorView extends Disposable {
private readonly _viewModel = new ObservableValue<undefined | MergeEditorViewModel>(undefined, 'viewModel');
private readonly _viewModel = observableValue<undefined | MergeEditorViewModel>('viewModel', undefined);
readonly viewModel: IObservable<undefined | MergeEditorViewModel> = this._viewModel;
readonly model = this._viewModel.map(m => /** @description model */ m?.model);

Expand Down