Skip to content

Commit 8f976f3

Browse files
authored
Maintain enabled OperatorLogPoint when changing underlying soure code (#104)
* Move OperatorLogPointManager * Add intersection Map Util * Implement OperatorLogPointMerger Fixes #102
1 parent 2da72e2 commit 8f976f3

File tree

20 files changed

+402
-88
lines changed

20 files changed

+402
-88
lines changed

packages/extension/src/__mocks__/vscode.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ export class Uri implements UriType {
129129
}
130130

131131
toString(skipEncoding?: boolean): string {
132-
return '';
132+
return `${this.scheme}${this.authority}${this.path}${this.query}${this.fragment}`;
133133
}
134134

135135
toJSON(): any {

packages/extension/src/commands/operatorLogPointManagement.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,47 @@ import { interfaces } from 'inversify';
22
import * as vscode from 'vscode';
33
import { ILogger } from '../logger';
44
import OperatorLogPoint from '../operatorLogPoint';
5-
import { IOperatorLogPointManager } from '../operatorLogPoint/logPointManager';
5+
import { IOperatorLogPointManager } from '../operatorLogPoint/manager';
66
import { Commands } from './commands';
77
import registerCommand from './registerCommand';
88

99
export default function registerOperatorLogPointManagementCommands(
1010
context: vscode.ExtensionContext,
1111
container: interfaces.Container
1212
): void {
13-
const logPointManager = container.get<IOperatorLogPointManager>(IOperatorLogPointManager);
13+
const manager = container.get<IOperatorLogPointManager>(IOperatorLogPointManager);
1414
const logger = container.get<ILogger>(ILogger);
1515

1616
context.subscriptions.push(
1717
registerCommand(vscode.commands, Commands.EnableOperatorLogPoint, async (operatorLogPoint) => {
1818
if (typeof operatorLogPoint === 'string') {
1919
try {
2020
const parsed = OperatorLogPoint.parse(operatorLogPoint);
21-
logPointManager.enable(parsed);
21+
manager.enable(parsed);
2222
} catch (e) {
2323
logger.warn(
2424
'Extension',
2525
`Tried to enable serialized OperatorLogPoint, but could not parse it. ("${operatorLogPoint}")`
2626
);
2727
}
2828
} else {
29-
logPointManager.enable(operatorLogPoint);
29+
manager.enable(operatorLogPoint);
3030
}
3131
}),
3232

3333
registerCommand(vscode.commands, Commands.DisableOperatorLogPoint, async (operatorLogPoint) => {
3434
if (typeof operatorLogPoint === 'string') {
3535
try {
3636
const parsed = OperatorLogPoint.parse(operatorLogPoint);
37-
logPointManager.disable(parsed);
37+
manager.disable(parsed);
3838
} catch (e) {
3939
logger.warn(
4040
'Extension',
4141
`Tried to disable serialized OperatorLogPoint, but could not parse it. ("${operatorLogPoint}")`
4242
);
4343
}
4444
} else {
45-
logPointManager.disable(operatorLogPoint);
45+
manager.disable(operatorLogPoint);
4646
}
4747
})
4848
);

packages/extension/src/decoration/decorationManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { inject, injectable, interfaces } from 'inversify';
22
import type * as vscodeApiType from 'vscode';
33
import { RootContainer, VsCodeApi } from '../ioc/types';
44
import { ILogger } from '../logger';
5-
import { IOperatorLogPointManager } from '../operatorLogPoint/logPointManager';
5+
import { IOperatorLogPointManager } from '../operatorLogPoint/manager';
66
import { IOperatorLogPointRecommender } from '../operatorLogPoint/recommender';
77
import { IResourceProvider } from '../resources';
88
import { ISessionManager } from '../sessionManager';

packages/extension/src/decoration/liveLogDecorationProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { DecorationRangeBehavior, Range, TextDocument, TextEditor, ThemeColor, w
55
import { DocumentDecorationProvider } from '.';
66
import { Colors } from '../colors';
77
import { Configuration } from '../configuration';
8-
import { IOperatorLogPointManager } from '../operatorLogPoint/logPointManager';
8+
import { IOperatorLogPointManager } from '../operatorLogPoint/manager';
99
import { ISessionManager } from '../sessionManager';
1010
import { ISession } from '../sessionManager/session';
1111
import { IDisposable } from '../util/types';

packages/extension/src/decoration/operatorLogPointDecorationProvider/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import {
1010
} from 'vscode';
1111
import { DocumentDecorationProvider } from '..';
1212
import OperatorLogPoint from '../../operatorLogPoint';
13-
import { IOperatorLogPointManager } from '../../operatorLogPoint/logPointManager';
13+
import { IOperatorLogPointManager } from '../../operatorLogPoint/manager';
1414
import { IOperatorLogPointRecommendationEvent, IOperatorLogPointRecommender } from '../../operatorLogPoint/recommender';
15-
import { difference } from '../../util/map';
15+
import difference from '../../util/map/difference';
1616
import { IDisposable } from '../../util/types';
1717
import { IDecorationSetter } from '../decorationSetter';
1818
import createHoverMessageForLogPoints from './createHoverMessageForLogPoint';

packages/extension/src/decoration/operatorLogPointGutterIconDecorationProvider/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ import {
1212
import { DocumentDecorationProvider } from '..';
1313
import { Configuration } from '../../configuration';
1414
import OperatorLogPoint from '../../operatorLogPoint';
15-
import { IOperatorLogPointManager } from '../../operatorLogPoint/logPointManager';
15+
import { IOperatorLogPointManager } from '../../operatorLogPoint/manager';
1616
import { IOperatorLogPointRecommendationEvent, IOperatorLogPointRecommender } from '../../operatorLogPoint/recommender';
1717
import { IResourceProvider } from '../../resources';
18-
import { difference } from '../../util/map';
18+
import difference from '../../util/map/difference';
1919
import { IDisposable } from '../../util/types';
2020
import { IDecorationSetter } from '../decorationSetter';
2121
import getEnabledState from './getEnabledState';

packages/extension/src/ioc/rootContainer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import DecorationManager, { IDecorationManager } from '../decoration/decorationM
99
import { default as DefaultDecorationSetter, IDecorationSetter } from '../decoration/decorationSetter';
1010
import Logger, { ILogger, logLevelFromString } from '../logger';
1111
import ConsoleLogSink from '../logger/console';
12-
import LogPointManager, { IOperatorLogPointManager } from '../operatorLogPoint/logPointManager';
12+
import OperatorLogPointManager, { IOperatorLogPointManager } from '../operatorLogPoint/manager';
1313
import OperatorLogPointRecommender, { IOperatorLogPointRecommender } from '../operatorLogPoint/recommender';
1414
import DefaultResourceProvider, { IResourceProvider } from '../resources';
1515
import SessionManager, { ISessionManager } from '../sessionManager';
@@ -64,7 +64,7 @@ export default function createRootContainer(
6464
.to(OperatorLogPointRecommender)
6565
.inSingletonScope()
6666
.onActivation(container.trackDisposableBinding);
67-
container.bind<IOperatorLogPointManager>(IOperatorLogPointManager).to(LogPointManager).inSingletonScope();
67+
container.bind<IOperatorLogPointManager>(IOperatorLogPointManager).to(OperatorLogPointManager).inSingletonScope();
6868

6969
container.bind<IDecorationSetter>(IDecorationSetter).to(DecorationSetter).inSingletonScope();
7070
container

packages/extension/src/operatorLogPoint/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ interface IOperatorLogPoint {
99
operatorIdentifier: IOperatorIdentifier;
1010
operatorName: string | null;
1111
enabled: boolean;
12+
key: string;
1213
}
1314

1415
export default class OperatorLogPoint implements IOperatorLogPoint {

packages/extension/src/operatorLogPoint/logPointManager.test.ts renamed to packages/extension/src/operatorLogPoint/manager/index.test.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
import 'reflect-metadata';
2-
import Logger from '../logger';
3-
import { logPointFixtureA, logPointFixtureB } from './index.fixture';
4-
import LogPointManager from './logPointManager';
2+
import Logger from '../../logger';
3+
import { logPointFixtureA, logPointFixtureB } from '../index.fixture';
4+
import OperatorLogPointManager from '.';
5+
import { IOperatorLogPointRecommender } from '../recommender';
56

67
describe('OperatorLogPointManager', () => {
7-
let logPointManager: LogPointManager;
8+
let logPointManager: OperatorLogPointManager;
9+
let recommender: IOperatorLogPointRecommender;
810

911
beforeEach(() => {
10-
logPointManager = new LogPointManager(Logger.nullLogger());
12+
recommender = {
13+
dispose: jest.fn(),
14+
onRecommendOperatorLogPoints: jest.fn(),
15+
recommend: jest.fn(),
16+
};
17+
logPointManager = new OperatorLogPointManager(recommender, Logger.nullLogger());
1118
});
1219

1320
describe('enable()', () => {

packages/extension/src/operatorLogPoint/logPointManager.ts renamed to packages/extension/src/operatorLogPoint/manager/index.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import { IOperatorIdentifier } from '@rxjs-debugging/telemetry/out/operatorIdent
22
import operatorIdentifierToString from '@rxjs-debugging/telemetry/out/operatorIdentifier/toString';
33
import { inject, injectable } from 'inversify';
44
import { Event, EventEmitter } from 'vscode';
5-
import OperatorLogPoint from '.';
6-
import { ILogger } from '../logger';
7-
import { IDisposable } from '../util/types';
5+
import OperatorLogPoint from '..';
6+
import { ILogger } from '../../logger';
7+
import { IDisposable } from '../../util/types';
8+
import { IOperatorLogPointRecommender } from '../recommender';
9+
import OperatorLogPointMerger from './merger';
810

911
export const IOperatorLogPointManager = Symbol('OperatorLogPointManager');
1012

@@ -16,16 +18,37 @@ export interface IOperatorLogPointManager extends IDisposable {
1618
onDidChangeLogPoints: Event<ReadonlyArray<OperatorLogPoint>>;
1719
}
1820

21+
/**
22+
* Manages enabled `OperatorLogPoint`s.
23+
*/
1924
@injectable()
20-
export default class LogPointManager implements IOperatorLogPointManager {
21-
private readonly _logPoints: Map<string, OperatorLogPoint> = new Map();
25+
export default class OperatorLogPointManager implements IOperatorLogPointManager {
26+
/**
27+
* A map with `OperatorLogPoint`s. The key is equivalent with the operator log points `key` property.
28+
*/
29+
private _logPoints: Map<string, OperatorLogPoint> = new Map();
2230

2331
private _onDidChangeLogPoints = new EventEmitter<ReadonlyArray<OperatorLogPoint>>();
2432
get onDidChangeLogPoints(): Event<ReadonlyArray<OperatorLogPoint>> {
2533
return this._onDidChangeLogPoints.event;
2634
}
2735

28-
constructor(@inject(ILogger) private readonly logger: ILogger) {}
36+
private readonly onRecommendOperatorLogPointsDisposable: IDisposable;
37+
38+
constructor(
39+
@inject(IOperatorLogPointRecommender) recommender: IOperatorLogPointRecommender,
40+
@inject(ILogger) private readonly logger: ILogger
41+
) {
42+
const merger = new OperatorLogPointMerger();
43+
44+
this.onRecommendOperatorLogPointsDisposable = recommender.onRecommendOperatorLogPoints(
45+
({ operatorLogPoints: newlyRecommended }) => {
46+
this.logger.info('LogPointManager', 'Update log points with latest recommendations');
47+
this._logPoints = new Map(merger.merge(this.logPoints, newlyRecommended).map((l) => [l.key, l]));
48+
this._onDidChangeLogPoints.fire(this.logPoints);
49+
}
50+
);
51+
}
2952

3053
enable(operatorLogPoint: OperatorLogPoint): void {
3154
const enabledOperatorLogPoint = operatorLogPoint.with({ enabled: true });
@@ -59,5 +82,6 @@ export default class LogPointManager implements IOperatorLogPointManager {
5982

6083
dispose(): void {
6184
this._onDidChangeLogPoints.dispose();
85+
this.onRecommendOperatorLogPointsDisposable.dispose();
6286
}
6387
}

0 commit comments

Comments
 (0)