From fdaa4ff26b9084316bb8ce3d6385c1f322b74cda Mon Sep 17 00:00:00 2001 From: nosknut Date: Thu, 13 Jul 2023 16:32:29 +0200 Subject: [PATCH] Adds a ts api for third party extensions --- src/arduino/arduino.ts | 7 +++-- src/arduino/boardManager.ts | 2 +- src/arduino/programmerManager.ts | 4 +-- src/extension.ts | 52 +++++++++++++++++++++++++++++++- 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/arduino/arduino.ts b/src/arduino/arduino.ts index 6d6f27b6..6e055dd6 100644 --- a/src/arduino/arduino.ts +++ b/src/arduino/arduino.ts @@ -105,8 +105,11 @@ export class ArduinoApp { if (this._settings.analyzeOnSettingChange) { // set up event handling for IntelliSense analysis const requestAnalysis = async () => { - if (isCompilerParserEnabled()) { - await this._analysisManager.requestAnalysis(); + // Check again in case the setting was disabled after initialization + if (this._settings.analyzeOnSettingChange) { + if (isCompilerParserEnabled()) { + await this._analysisManager.requestAnalysis(); + } } }; const dc = DeviceContext.getInstance(); diff --git a/src/arduino/boardManager.ts b/src/arduino/boardManager.ts index ee3f45c1..bb467fff 100644 --- a/src/arduino/boardManager.ts +++ b/src/arduino/boardManager.ts @@ -508,7 +508,7 @@ export class BoardManager { } } - private listBoards(): IBoard[] { + public listBoards(): IBoard[] { const result = []; this._boards.forEach((b) => { result.push(b); diff --git a/src/arduino/programmerManager.ts b/src/arduino/programmerManager.ts index b766166e..2b9e559e 100644 --- a/src/arduino/programmerManager.ts +++ b/src/arduino/programmerManager.ts @@ -57,7 +57,7 @@ export class ProgrammerManager { DeviceContext.getInstance().programmer = this._programmerValue; } - private setProgrammerValue(programmerName: string | null) { + public setProgrammerValue(programmerName: string | null) { const programmer = this._arduinoApp.boardManager.installedProgrammers.get(programmerName); this._programmerValue = this._settings.useArduinoCli ? programmerName : programmer ? programmer.key : programmerName; this._programmerDisplayName = this._programmerValue @@ -71,7 +71,7 @@ export class ProgrammerManager { return programmer ? programmer.displayName : programmerName; } - private getAvailableProgrammers(currentBoard: IBoard): IProgrammer[] { + public getAvailableProgrammers(currentBoard: IBoard): IProgrammer[] { if (!currentBoard || !currentBoard.platform) { return []; } diff --git a/src/extension.ts b/src/extension.ts index e4764ebf..b4240990 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -10,7 +10,7 @@ import * as vscode from "vscode"; import * as constants from "./common/constants"; const arduinoContentProviderModule = impor("./arduino/arduinoContentProvider") as typeof import ("./arduino/arduinoContentProvider"); -import { IBoard } from "./arduino/package"; +import { IBoard, IProgrammer } from "./arduino/package"; import { VscodeSettings } from "./arduino/vscodeSettings"; const arduinoActivatorModule = impor("./arduinoActivator") as typeof import ("./arduinoActivator"); const arduinoContextModule = impor("./arduinoContext") as typeof import ("./arduinoContext"); @@ -26,6 +26,7 @@ const completionProviderModule = impor("./langService/completionProvider") as ty import { BuildMode } from "./arduino/arduino"; import * as Logger from "./logger/logger"; import { SerialMonitor } from "./serialmonitor/serialMonitor"; +import { ArduinoContentProvider } from "./arduino/arduinoContentProvider"; const usbDetectorModule = impor("./serialmonitor/usbDetector") as typeof import ("./serialmonitor/usbDetector"); export async function activate(context: vscode.ExtensionContext) { @@ -383,10 +384,17 @@ export async function activate(context: vscode.ExtensionContext) { } Logger.traceUserData("end-activate-extension", { correlationId: activeGuid }); + // Makes the provider available to the programmatic api + const provider: { + arduinoManagerProvider?: ArduinoContentProvider, + } = {}; + setTimeout(async () => { const arduinoManagerProvider = new arduinoContentProviderModule.ArduinoContentProvider(context.extensionPath); await arduinoManagerProvider.initialize(); + provider.arduinoManagerProvider = arduinoManagerProvider; + context.subscriptions.push(vscode.workspace.registerTextDocumentContentProvider(ARDUINO_MANAGER_PROTOCOL, arduinoManagerProvider)); registerArduinoCommand("arduino.showBoardManager", async () => { const panel = vscode.window.createWebviewPanel("arduinoBoardManager", "Arduino Board Manager", vscode.ViewColumn.Two, { @@ -447,6 +455,48 @@ export async function activate(context: vscode.ExtensionContext) { usbDetectorModule.UsbDetector.getInstance().initialize(context); usbDetectorModule.UsbDetector.getInstance().startListening(); }, 200); + + return { + getCurrentBoard() { + return arduinoContextModule.default.boardManager.currentBoard; + }, + getBoardTypes() { + return arduinoContextModule.default.boardManager.listBoards(); + }, + changeBoardType(board: IBoard) { + arduinoContextModule.default.boardManager.doChangeBoardType(board); + provider.arduinoManagerProvider.update(LIBRARY_MANAGER_URI); + provider.arduinoManagerProvider.update(EXAMPLES_URI); + return { board: arduinoContextModule.default.boardManager.currentBoard }; + }, + installBoard: async (packageName: string, arch: string = "", version: string = "", showOutput: boolean = true) => { + await arduinoContextModule.default.arduinoApp.installBoard(packageName, arch, version, showOutput) + }, + getCurrentProgrammer() { + return deviceContext.programmer; + }, + getAvailableProgrammers(board: IBoard) { + return arduinoContextModule.default.arduinoApp.programmerManager.getAvailableProgrammers(board) + }, + selectProgrammer(programmer: IProgrammer) { + if (!arduinoContextModule.default.arduinoApp.building) { + try { + arduinoContextModule.default.arduinoApp.programmerManager.setProgrammerValue(programmer.name); + deviceContext.programmer = arduinoContextModule.default.arduinoApp.programmerManager.currentProgrammer; + return true; + } catch (ex) { + return false; + } + } + }, + selectSketch(relativeSketchPath: string) { + deviceContext.sketch = relativeSketchPath; + deviceContext.showStatusBar(); + }, + setOutput(relativeOutputPath: string) { + deviceContext.output = relativeOutputPath; + } + } } export async function deactivate() {