Skip to content

Commit 5f51939

Browse files
Akos Kittakittaakos
Akos Kitta
authored andcommitted
ATL-374: Refactored the Output services.
Signed-off-by: Akos Kitta <kittaakos@typefox.io>
1 parent f26dae1 commit 5f51939

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+825
-944
lines changed

arduino-debugger-extension/src/browser/arduino-variable-resolver.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
import { VariableContribution, VariableRegistry, Variable } from '@theia/variable-resolver/lib/browser';
33
import { injectable, inject } from 'inversify';
44
import { MessageService } from '@theia/core/lib/common/message-service';
5-
import { BoardsServiceClientImpl } from 'arduino-ide-extension/lib/browser/boards/boards-service-client-impl';
5+
import { BoardsServiceProvider } from 'arduino-ide-extension/lib/browser/boards/boards-service-provider';
66

77
@injectable()
88
export class ArduinoVariableResolver implements VariableContribution {
99

10-
@inject(BoardsServiceClientImpl)
11-
protected readonly boardsServiceClient: BoardsServiceClientImpl;
10+
@inject(BoardsServiceProvider)
11+
protected readonly boardsServiceProvider: BoardsServiceProvider;
1212

1313
@inject(MessageService)
1414
protected readonly messageService: MessageService
@@ -27,7 +27,7 @@ export class ArduinoVariableResolver implements VariableContribution {
2727
}
2828

2929
protected async resolveFqbn(): Promise<string | undefined> {
30-
const { boardsConfig } = this.boardsServiceClient;
30+
const { boardsConfig } = this.boardsServiceProvider;
3131
if (!boardsConfig || !boardsConfig.selectedBoard) {
3232
this.messageService.error('No board selected. Please select a board for debugging.');
3333
return undefined;
@@ -36,7 +36,7 @@ export class ArduinoVariableResolver implements VariableContribution {
3636
}
3737

3838
protected async resolvePort(): Promise<string | undefined> {
39-
const { boardsConfig } = this.boardsServiceClient;
39+
const { boardsConfig } = this.boardsServiceProvider;
4040
if (!boardsConfig || !boardsConfig.selectedPort) {
4141
return undefined;
4242
}

arduino-ide-extension/src/browser/arduino-daemon-client-impl.ts

Lines changed: 0 additions & 53 deletions
This file was deleted.

arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ import { TerminalMenus } from '@theia/terminal/lib/browser/terminal-frontend-con
2424
import { inject, injectable, postConstruct } from 'inversify';
2525
import * as React from 'react';
2626
import { MainMenuManager } from '../common/main-menu-manager';
27-
import { BoardsService, BoardsServiceClient, CoreService, Port, SketchesService, ToolOutputServiceClient, ExecutableService } from '../common/protocol';
27+
import { BoardsService, CoreService, Port, SketchesService, ExecutableService } from '../common/protocol';
2828
import { ArduinoDaemon } from '../common/protocol/arduino-daemon';
2929
import { ConfigService } from '../common/protocol/config-service';
3030
import { FileSystemExt } from '../common/protocol/filesystem-ext';
3131
import { ArduinoCommands } from './arduino-commands';
3232
import { BoardsConfig } from './boards/boards-config';
3333
import { BoardsConfigDialog } from './boards/boards-config-dialog';
3434
import { BoardsDataStore } from './boards/boards-data-store';
35-
import { BoardsServiceClientImpl } from './boards/boards-service-client-impl';
35+
import { BoardsServiceProvider } from './boards/boards-service-provider';
3636
import { BoardsToolBarItem } from './boards/boards-toolbar-item';
3737
import { EditorMode } from './editor-mode';
3838
import { ArduinoMenus } from './menu/arduino-menus';
@@ -44,6 +44,9 @@ import { HostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted
4444
import { FileService } from '@theia/filesystem/lib/browser/file-service';
4545

4646
const debounce = require('lodash.debounce');
47+
import { OutputService } from '../common/protocol/output-service';
48+
import { NotificationCenter } from './notification-center';
49+
import { Settings } from './contributions/settings';
4750

4851
@injectable()
4952
export class ArduinoFrontendContribution implements FrontendApplicationContribution,
@@ -61,15 +64,8 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut
6164
@inject(CoreService)
6265
protected readonly coreService: CoreService;
6366

64-
@inject(ToolOutputServiceClient)
65-
protected readonly toolOutputServiceClient: ToolOutputServiceClient;
66-
67-
@inject(BoardsServiceClientImpl)
68-
protected readonly boardsServiceClientImpl: BoardsServiceClientImpl;
69-
70-
// Unused but do not remove it. It's required by DI, otherwise `init` method is not called.
71-
@inject(BoardsServiceClient)
72-
protected readonly boardsServiceClient: BoardsServiceClient;
67+
@inject(BoardsServiceProvider)
68+
protected readonly boardsServiceClientImpl: BoardsServiceProvider;
7369

7470
@inject(SelectionService)
7571
protected readonly selectionService: SelectionService;
@@ -151,6 +147,13 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut
151147

152148
@inject(ExecutableService)
153149
protected executableService: ExecutableService;
150+
@inject(OutputService)
151+
protected readonly outputService: OutputService;
152+
153+
@inject(NotificationCenter)
154+
protected readonly notificationCenter: NotificationCenter;
155+
156+
protected invalidConfigPopup: Promise<void | 'No' | 'Yes' | undefined> | undefined;
154157

155158
@postConstruct()
156159
protected async init(): Promise<void> {
@@ -198,6 +201,21 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut
198201
}
199202
}
200203
});
204+
this.notificationCenter.onConfigChanged(({ config }) => {
205+
if (config) {
206+
this.invalidConfigPopup = undefined;
207+
} else {
208+
if (!this.invalidConfigPopup) {
209+
this.invalidConfigPopup = this.messageService.error(`Your CLI configuration is invalid. Do you want to correct it now?`, 'No', 'Yes')
210+
.then(answer => {
211+
if (answer === 'Yes') {
212+
this.commandRegistry.executeCommand(Settings.Commands.OPEN_CLI_CONFIG.id)
213+
}
214+
this.invalidConfigPopup = undefined;
215+
});
216+
}
217+
}
218+
});
201219
}
202220

203221
protected startLanguageServer = debounce((fqbn: string, name: string | undefined) => this.doStartLanguageServer(fqbn, name));

arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts

Lines changed: 26 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,14 @@ import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging/w
88
import { FrontendApplicationContribution, FrontendApplication as TheiaFrontendApplication } from '@theia/core/lib/browser/frontend-application'
99
import { LibraryListWidget } from './library/library-list-widget';
1010
import { ArduinoFrontendContribution } from './arduino-frontend-contribution';
11-
import { LibraryServiceServer, LibraryServiceServerPath } from '../common/protocol/library-service';
12-
import { BoardsService, BoardsServicePath, BoardsServiceClient } from '../common/protocol/boards-service';
11+
import { LibraryService, LibraryServicePath } from '../common/protocol/library-service';
12+
import { BoardsService, BoardsServicePath } from '../common/protocol/boards-service';
1313
import { SketchesService, SketchesServicePath } from '../common/protocol/sketches-service';
1414
import { SketchesServiceClientImpl } from '../common/protocol/sketches-service-client-impl';
15-
import { CoreService, CoreServicePath, CoreServiceClient } from '../common/protocol/core-service';
15+
import { CoreService, CoreServicePath } from '../common/protocol/core-service';
1616
import { BoardsListWidget } from './boards/boards-list-widget';
1717
import { BoardsListWidgetFrontendContribution } from './boards/boards-widget-frontend-contribution';
18-
import { ToolOutputServiceClient } from '../common/protocol/tool-output-service';
19-
import { ToolOutputService } from '../common/protocol/tool-output-service';
20-
import { ToolOutputServiceClientImpl } from './tool-output/client-service-impl';
21-
import { BoardsServiceClientImpl } from './boards/boards-service-client-impl';
18+
import { BoardsServiceProvider } from './boards/boards-service-provider';
2219
import { WorkspaceService as TheiaWorkspaceService } from '@theia/workspace/lib/browser/workspace-service';
2320
import { WorkspaceService } from './theia/workspace/workspace-service';
2421
import { OutlineViewContribution as TheiaOutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution';
@@ -50,7 +47,7 @@ import { SearchInWorkspaceFrontendContribution } from './theia/search-in-workspa
5047
import { LibraryListWidgetFrontendContribution } from './library/library-widget-frontend-contribution';
5148
import { MonitorServiceClientImpl } from './monitor/monitor-service-client-impl';
5249
import { MonitorServicePath, MonitorService, MonitorServiceClient } from '../common/protocol/monitor-service';
53-
import { ConfigService, ConfigServicePath, ConfigServiceClient } from '../common/protocol/config-service';
50+
import { ConfigService, ConfigServicePath } from '../common/protocol/config-service';
5451
import { MonitorWidget } from './monitor/monitor-widget';
5552
import { MonitorViewContribution } from './monitor/monitor-view-contribution';
5653
import { MonitorConnection } from './monitor/monitor-connection';
@@ -67,17 +64,14 @@ import { EditorMode } from './editor-mode';
6764
import { ListItemRenderer } from './widgets/component-list/list-item-renderer';
6865
import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution';
6966
import { MonacoThemingService } from '@theia/monaco/lib/browser/monaco-theming-service';
70-
import { ArduinoDaemonClientImpl } from './arduino-daemon-client-impl';
71-
import { ArduinoDaemonClient, ArduinoDaemonPath, ArduinoDaemon } from '../common/protocol/arduino-daemon';
67+
import { ArduinoDaemonPath, ArduinoDaemon } from '../common/protocol/arduino-daemon';
7268
import { EditorManager as TheiaEditorManager } from '@theia/editor/lib/browser';
7369
import { EditorManager } from './theia/editor/editor-manager';
7470
import { FrontendConnectionStatusService, ApplicationConnectionStatusContribution } from './theia/core/connection-status-service';
7571
import {
7672
FrontendConnectionStatusService as TheiaFrontendConnectionStatusService,
7773
ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution
7874
} from '@theia/core/lib/browser/connection-status-service';
79-
import { ConfigServiceClientImpl } from './config-service-client-impl';
80-
import { CoreServiceClientImpl } from './core-service-client-impl';
8175
import { BoardsDataMenuUpdater } from './boards/boards-data-menu-updater';
8276
import { BoardsDataStore } from './boards/boards-data-store';
8377
import { ILogger } from '@theia/core';
@@ -116,14 +110,17 @@ import { OutputWidget } from './theia/output/output-widget';
116110
import { BurnBootloader } from './contributions/burn-bootloader';
117111
import { ExamplesServicePath, ExamplesService } from '../common/protocol/examples-service';
118112
import { BuiltInExamples, LibraryExamples } from './contributions/examples';
119-
import { LibraryServiceProvider } from './library/library-service-provider';
120113
import { IncludeLibrary } from './contributions/include-library';
121114
import { OutputChannelManager as TheiaOutputChannelManager } from '@theia/output/lib/common/output-channel';
122115
import { OutputChannelManager } from './theia/output/output-channel';
123116
import { OutputChannelRegistryMainImpl as TheiaOutputChannelRegistryMainImpl, OutputChannelRegistryMainImpl } from './theia/plugin-ext/output-channel-registry-main';
124117
import { ExecutableService, ExecutableServicePath } from '../common/protocol';
125118
import { MonacoTextModelService as TheiaMonacoTextModelService } from '@theia/monaco/lib/browser/monaco-text-model-service';
126119
import { MonacoTextModelService } from './theia/monaco/monaco-text-model-service';
120+
import { OutputServiceImpl } from './output-service-impl';
121+
import { OutputServicePath, OutputService } from '../common/protocol/output-service';
122+
import { NotificationCenter } from './notification-center';
123+
import { NotificationServicePath, NotificationServiceServer } from '../common/protocol';
127124

128125
const ElementQueries = require('css-element-queries/src/ElementQueries');
129126

@@ -153,8 +150,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
153150
bind(ListItemRenderer).toSelf().inSingletonScope();
154151

155152
// Library service
156-
bind(LibraryServiceProvider).toSelf().inSingletonScope();
157-
bind(LibraryServiceServer).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, LibraryServiceServerPath)).inSingletonScope();
153+
bind(LibraryService).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, LibraryServicePath)).inSingletonScope();
158154

159155
// Library list widget
160156
bind(LibraryListWidget).toSelf();
@@ -170,34 +166,13 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
170166
bind(SketchesServiceClientImpl).toSelf().inSingletonScope();
171167

172168
// Config service
173-
bind(ConfigService).toDynamicValue(context => {
174-
const connection = context.container.get(WebSocketConnectionProvider);
175-
const client = context.container.get(ConfigServiceClientImpl);
176-
return connection.createProxy(ConfigServicePath, client);
177-
}).inSingletonScope();
178-
bind(ConfigServiceClientImpl).toSelf().inSingletonScope();
179-
bind(ConfigServiceClient).toDynamicValue(context => {
180-
const client = context.container.get(ConfigServiceClientImpl);
181-
WebSocketConnectionProvider.createProxy(context.container, ConfigServicePath, client);
182-
return client;
183-
}).inSingletonScope();
169+
bind(ConfigService).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, ConfigServicePath)).inSingletonScope();
184170

185171
// Boards service
186-
bind(BoardsService).toDynamicValue(context => {
187-
const connection = context.container.get(WebSocketConnectionProvider);
188-
const client = context.container.get(BoardsServiceClientImpl);
189-
return connection.createProxy(BoardsServicePath, client);
190-
}).inSingletonScope();
172+
bind(BoardsService).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, BoardsServicePath)).inSingletonScope();
191173
// Boards service client to receive and delegate notifications from the backend.
192-
bind(BoardsServiceClientImpl).toSelf().inSingletonScope();
193-
bind(FrontendApplicationContribution).toService(BoardsServiceClientImpl);
194-
bind(BoardsServiceClient).toDynamicValue(async context => {
195-
const client = context.container.get(BoardsServiceClientImpl);
196-
const service = context.container.get<BoardsService>(BoardsService);
197-
await client.init(service);
198-
WebSocketConnectionProvider.createProxy(context.container, BoardsServicePath, client);
199-
return client;
200-
}).inSingletonScope();
174+
bind(BoardsServiceProvider).toSelf().inSingletonScope();
175+
bind(FrontendApplicationContribution).toService(BoardsServiceProvider);
201176

202177
// To be able to track, and update the menu based on the core settings (aka. board details) of the currently selected board.
203178
bind(FrontendApplicationContribution).to(BoardsDataMenuUpdater).inSingletonScope();
@@ -230,26 +205,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
230205
})
231206

232207
// Core service
233-
bind(CoreService).toDynamicValue(context => {
234-
const connection = context.container.get(WebSocketConnectionProvider);
235-
const client = context.container.get(CoreServiceClientImpl);
236-
return connection.createProxy(CoreServicePath, client);
237-
}).inSingletonScope();
238-
// Core service client to receive and delegate notifications when the index or the library index has been updated.
239-
bind(CoreServiceClientImpl).toSelf().inSingletonScope();
240-
bind(CoreServiceClient).toDynamicValue(context => {
241-
const client = context.container.get(CoreServiceClientImpl);
242-
WebSocketConnectionProvider.createProxy(context.container, CoreServicePath, client);
243-
return client;
244-
}).inSingletonScope();
245-
246-
// Tool output service client
247-
bind(ToolOutputServiceClientImpl).toSelf().inSingletonScope();
248-
bind(ToolOutputServiceClient).toDynamicValue(context => {
249-
const client = context.container.get(ToolOutputServiceClientImpl);
250-
WebSocketConnectionProvider.createProxy(context.container, ToolOutputService.SERVICE_PATH, client);
251-
return client;
252-
}).inSingletonScope();
208+
bind(CoreService).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, CoreServicePath)).inSingletonScope();
253209

254210
// Serial monitor
255211
bind(MonitorModel).toSelf().inSingletonScope();
@@ -341,18 +297,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
341297
bind(ShellLayoutRestorer).toSelf().inSingletonScope();
342298
rebind(TheiaShellLayoutRestorer).toService(ShellLayoutRestorer);
343299

344-
// Arduino daemon client. Receives notifications from the backend if the CLI daemon process has been restarted.
345-
bind(ArduinoDaemon).toDynamicValue(context => {
346-
const connection = context.container.get(WebSocketConnectionProvider);
347-
const client = context.container.get(ArduinoDaemonClientImpl);
348-
return connection.createProxy(ArduinoDaemonPath, client);
349-
}).inSingletonScope();
350-
bind(ArduinoDaemonClientImpl).toSelf().inSingletonScope();
351-
bind(ArduinoDaemonClient).toDynamicValue(context => {
352-
const client = context.container.get(ArduinoDaemonClientImpl);
353-
WebSocketConnectionProvider.createProxy(context.container, ArduinoDaemonPath, client);
354-
return client;
355-
}).inSingletonScope();
300+
bind(ArduinoDaemon).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, ArduinoDaemonPath)).inSingletonScope();
356301

357302
// File-system extension
358303
bind(FileSystemExt).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, FileSystemExtPath)).inSingletonScope();
@@ -379,4 +324,13 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
379324
Contribution.configure(bind, BuiltInExamples);
380325
Contribution.configure(bind, LibraryExamples);
381326
Contribution.configure(bind, IncludeLibrary);
327+
328+
bind(OutputServiceImpl).toSelf().inSingletonScope().onActivation(({ container }, outputService) => {
329+
WebSocketConnectionProvider.createProxy(container, OutputServicePath, outputService);
330+
return outputService;
331+
});
332+
bind(OutputService).toService(OutputServiceImpl);
333+
334+
bind(NotificationCenter).toSelf().inSingletonScope();
335+
bind(NotificationServiceServer).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, NotificationServicePath)).inSingletonScope();
382336
});

0 commit comments

Comments
 (0)