diff --git a/README.md b/README.md index e8a59b65..7270066b 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,8 @@ This extension provides several commands in the Command Palette (F1 o | `arduino.defaultBaudRate` | Default baud rate for the serial port monitor. The default value is 115200. Supported values are 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, 230400 and 250000 | | `arduino.defaultTimestampFormat` | Format of timestamp printed before each line of Serial Monitor output. You can find list of all available placeholders [here](https://github.com/samsonjs/strftime#supported-specifiers). | | `arduino.disableIntelliSenseAutoGen` | When `true` vscode-arduino will not auto-generate an IntelliSense configuration (i.e. `.vscode/c_cpp_properties.json`) by analyzing Arduino's compiler output. | +| `arduino.analyzeOnOpen` | When true, automatically run analysis when the project is opened. Only works when `arduino.analyzeOnSettingChange` is true. | +| `arduino.analyzeOnSettingChange` | When true, automatically run analysis when board, configuration, or sketch settings are changed. | The following Visual Studio Code settings are available for the Arduino extension. These can be set in global user preferences Ctrl + , *or* Cmd + , or workspace settings (`.vscode/settings.json`). The latter overrides the former. diff --git a/package.json b/package.json index db3b29d5..0d214316 100644 --- a/package.json +++ b/package.json @@ -541,6 +541,16 @@ "type": "string", "default": "", "markdownDescription": "Format of timestamp printed before each line of Serial Monitor output. You can find list of all available placeholders [here](https://github.com/samsonjs/strftime#supported-specifiers)." + }, + "arduino.analyzeOnOpen": { + "type": "boolean", + "default": true, + "markdownDescription": "When true, automatically run analysis when the project is opened. Only works when `arduino.analyzeOnSettingChange` is true." + }, + "arduino.analyzeOnSettingChange": { + "type": "boolean", + "default": true, + "markdownDescription": "When true, automatically run analysis when board, configuration, or sketch settings are changed." } } }, diff --git a/src/arduino/arduino.ts b/src/arduino/arduino.ts index 9f7dabfe..3de74779 100644 --- a/src/arduino/arduino.ts +++ b/src/arduino/arduino.ts @@ -101,16 +101,18 @@ export class ArduinoApp { } } - // set up event handling for IntelliSense analysis - const requestAnalysis = async () => { - if (isCompilerParserEnabled()) { - await this._analysisManager.requestAnalysis(); - } - }; - const dc = DeviceContext.getInstance(); - dc.onChangeBoard(requestAnalysis); - dc.onChangeConfiguration(requestAnalysis); - dc.onChangeSketch(requestAnalysis); + if (this._settings.analyzeOnSettingChange) { + // set up event handling for IntelliSense analysis + const requestAnalysis = async () => { + if (isCompilerParserEnabled()) { + await this._analysisManager.requestAnalysis(); + } + }; + const dc = DeviceContext.getInstance(); + dc.onChangeBoard(requestAnalysis); + dc.onChangeConfiguration(requestAnalysis); + dc.onChangeSketch(requestAnalysis); + } } /** diff --git a/src/arduino/arduinoSettings.ts b/src/arduino/arduinoSettings.ts index 7b82b8d8..e8f9bbba 100644 --- a/src/arduino/arduinoSettings.ts +++ b/src/arduino/arduinoSettings.ts @@ -23,6 +23,7 @@ export interface IArduinoSettings { preferences: Map; useArduinoCli: boolean; defaultTimestampFormat: string; + analyzeOnSettingChange: boolean; reloadPreferences(): void; } @@ -169,6 +170,10 @@ export class ArduinoSettings implements IArduinoSettings { return this._defaultTimestampFormat; } + public get analyzeOnSettingChange(): boolean { + return VscodeSettings.getInstance().analyzeOnSettingChange; + } + public reloadPreferences() { this._preferences = util.parseConfigFile(this.preferencePath); if (this.preferences.get("sketchbook.path")) { diff --git a/src/arduino/vscodeSettings.ts b/src/arduino/vscodeSettings.ts index 6a68fd02..ae2617d4 100644 --- a/src/arduino/vscodeSettings.ts +++ b/src/arduino/vscodeSettings.ts @@ -20,6 +20,8 @@ const configKeys = { USE_ARDUINO_CLI: "arduino.useArduinoCli", DISABLE_INTELLISENSE_AUTO_GEN: "arduino.disableIntelliSenseAutoGen", DEFAULT_TIMESTAMP_FORMAT: "arduino.defaultTimestampFormat", + ANALYZE_ON_OPEN: "arduino.analyzeOnOpen", + ANALYZE_ON_SETTING_CHANGE: "arduino.analyzeOnSettingChange", }; export interface IVscodeSettings { @@ -37,6 +39,8 @@ export interface IVscodeSettings { useArduinoCli: boolean; disableIntelliSenseAutoGen: boolean; defaultTimestampFormat: string; + analyzeOnOpen: boolean; + analyzeOnSettingChange: boolean; updateAdditionalUrls(urls: string[]): void; } @@ -124,6 +128,14 @@ export class VscodeSettings implements IVscodeSettings { return this.getConfigValue(configKeys.DEFAULT_TIMESTAMP_FORMAT); } + public get analyzeOnOpen(): boolean { + return this.getConfigValue(configKeys.ANALYZE_ON_OPEN); + } + + public get analyzeOnSettingChange(): boolean { + return this.getConfigValue(configKeys.ANALYZE_ON_SETTING_CHANGE); + } + public async updateAdditionalUrls(value) { await this.setConfigValue(configKeys.ADDITIONAL_URLS, value, true); } diff --git a/src/arduinoActivator.ts b/src/arduinoActivator.ts index cfcc8233..a593a311 100644 --- a/src/arduinoActivator.ts +++ b/src/arduinoActivator.ts @@ -10,6 +10,7 @@ import { ExampleManager } from "./arduino/exampleManager"; import { ExampleProvider } from "./arduino/exampleProvider"; import { LibraryManager } from "./arduino/libraryManager"; import { ProgrammerManager } from "./arduino/programmerManager"; +import { VscodeSettings } from "./arduino/vscodeSettings"; import ArduinoContext from "./arduinoContext"; import { DeviceContext } from "./deviceContext"; @@ -25,11 +26,22 @@ class ArduinoActivator { const arduinoSettings = new ArduinoSettings(); await arduinoSettings.initialize(); const arduinoApp = new ArduinoApp(arduinoSettings); - await arduinoApp.initialize(); + + // Initializing the app before the device context will cause a + // setting changed event that triggers analysis. + const analyzeOnOpen = VscodeSettings.getInstance().analyzeOnOpen; + if (analyzeOnOpen) { + await arduinoApp.initialize(); + } // TODO: After use the device.json config, should remove the dependency on the ArduinoApp object. const deviceContext = DeviceContext.getInstance(); await deviceContext.loadContext(); + + if (!analyzeOnOpen) { + await arduinoApp.initialize(); + } + // Show sketch status bar, and allow user to change sketch in config file deviceContext.showStatusBar(); // Arduino board manager & library manager