Skip to content

Commit

Permalink
completes observable refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
hediet committed Jul 4, 2022
1 parent cdc1920 commit 75968b6
Show file tree
Hide file tree
Showing 12 changed files with 51 additions and 103 deletions.
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 @@ -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,19 @@ 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 { observableValue } 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 { IObservable, observableFromEvent, 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

0 comments on commit 75968b6

Please sign in to comment.