The attribute plugin is not available, 2fa disabled
Inhaltsverzeichnis
Panoramica dell'architettura
Questo documento descrive l'architettura complessiva della suite WvdS FPC RAD Studio.
Decisioni di design
Perché Pascal per le estensioni VS Code?
Motivazione:
- Base di codice unificata per tutti i target (GUI, TUI, Web, estensioni)
- Tipizzazione forte riduce gli errori a runtime
- Sfruttare il know-how degli sviluppatori da progetti Pascal esistenti
- pas2js permette output JavaScript di alta qualità
Alternative considerate:
| Alternativa | Decisione | Motivazione |
|---|---|---|
| TypeScript | Rifiutato | Due linguaggi, maggiore complessità |
| Rust + WASM | Rifiutato | Interop complessa con API VSCode |
| Delphi | Rifiutato | Commerciale, nessuna alternativa pas2js |
Perché PXAML invece di LFM?
Motivazione:
- Controllo versione: XML e diff-friendly
- Multi-target: stesso markup per GUI, TUI, Web
- Tooling: parser XML standard disponibili
- Familiare: sintassi WPF/XAML per chi migra
Architettura a strati
┌─────────────────────────────────────────────────────────────────────┐ │ Extension Layer │ │ (extension_main.pas - Entry Point, Command Handler, UI Integration) │ ├─────────────────────────────────────────────────────────────────────┤ │ Service Layer │ │ (*.Service.pas - Logica di business, validazione, operazioni) │ ├─────────────────────────────────────────────────────────────────────┤ │ Model Layer │ │ (*.Models.pas - Record, tipi, enum, nessuna logica) │ ├─────────────────────────────────────────────────────────────────────┤ │ Infrastructure Layer │ │ (WvdS.VSCode.*, WvdS.Node.* - API Wrapper, Platform Abstraction) │ └─────────────────────────────────────────────────────────────────────┘
Responsabilita
| Strato | Contenuto | Dipendenze |
|---|---|---|
| Extension | Interazione UI, registrazione comandi | Service, Model, Infrastructure |
| Service | Logica di business, validazione | Model |
| Model | Strutture dati | Nessuna |
| Infrastructure | API VSCode/Node | Solo API esterne |
Regole
CONSENTITO: Extension -> Service -> Model VIETATO: Service -> Extension (inversione) VIETATO: Model -> Service (logica nel Model)
Grafo delle dipendenze
wvds.vscode.packaging
│
▼
wvds.vscode.ui.preview ─► wvds.vscode.build
│ │
▼ │
wvds.vscode.ui.designer │
│ │
└───────┬──────────────┘
▼
wvds.vscode.projects
│
▼
wvds.vscode.ui.meta
│
▼
wvds.vscode.core (Base)
Dettaglio dipendenze estensioni
| Estensione | Dipendenze | Ruolo |
|---|---|---|
| core | - | Base: toolchain, logging, servizi condivisi |
| build | core | Compilazione, formattatore uses |
| projects | core | Gestione progetti, template |
| ui.meta | core | Registry componenti |
| ui.designer | core | Editor PXAML |
| ui.preview | core, ui.designer | Anteprima live |
| packaging | core, build | Creazione VSIX |
Struttura monorepo
sources/ - Single Source of Truth
sources/
├── common/ # Codice condiviso
│ ├── core/ # Unit base (nessuna dipendenza)
│ │ ├── WvdS.System.pas
│ │ ├── WvdS.Collections.pas
│ │ └── WvdS.Strings.pas
│ │
│ ├── ui/ # UI Framework
│ │ ├── controls/ # Controlli base
│ │ ├── components/ # Componenti compositi
│ │ ├── runtime/ # Runtime PXAML
│ │ └── targets/ # Renderer
│ │ ├── tui/ # Terminal UI
│ │ ├── gui/ # Desktop GUI
│ │ └── web/ # Browser
│ │
│ └── web/ # Host Bridges
│ ├── nodejs/ # API Node.js
│ └── vscode/ # API VSCode
│
├── extensions/ # Pacchetti VSIX
│ └── wvds.vscode.{name}/
│ ├── pas/ # Sorgente Pascal
│ ├── dist/ # JS compilato
│ ├── templates/ # Template HTML
│ ├── images/ # Icone, grafica
│ ├── package.json # Manifesto estensione
│ └── build.cfg # Configurazione build
│
├── applications/ # App standalone
├── tools/ # Strumenti CLI
└── packages/ # Pacchetti IDE
binaries/ - Output build
binaries/
├── out/{app}/{target}/{mode}/ # Artefatti build
│ ├── gen/ # Codice generato
│ ├── bin/ # File eseguibili
│ └── assets/ # Risorse
│
├── cache/ # Cache compilatore (.ppu, .o)
├── dist/ # Artefatti release (.vsix)
└── logs/ # Protocolli build
Anatomia di un'estensione
Struttura directory
wvds.vscode.{name}/
├── pas/
│ ├── extension_main.pas # Entry Point (OBBLIGATORIO)
│ ├── {Feature}.Models.pas # Strutture dati
│ ├── {Feature}.Service.pas # Logica di business
│ └── {Feature}.Dialog.pas # Componenti UI (opzionale)
│
├── dist/
│ ├── extension_main.js # JS compilato
│ └── extension_main.js.map # Source Map
│
├── templates/
│ └── *.html # Template WebView
│
├── images/
│ └── icon.png # Icona estensione
│
├── package.json # Manifesto VSCode
├── build.cfg # Configurazione build
└── README.md # Documentazione
Pattern extension_main.pas
unit extension_main; {$mode objfpc}{$H+} interface uses JS, VSCode.API, VSCode.Commands, VSCode.ExtensionExports, {Feature}.Service, {Feature}.Models; procedure Activate(AContext: TExtensionContext); procedure Deactivate; implementation procedure DoActivate(AContext: TExtensionContext); begin // Inizializzare i servizi Initialize{Feature}Service; // Registrare i comandi RegisterCommand('wvds.{feature}.{action}', @Handle{Action}); // Output Channel ShowInfoMessage('WvdS {Name} attivato'); end; procedure Activate(AContext: TExtensionContext); begin try DoActivate(AContext); except on E: Exception do ShowErrorMessage(Format(rsActivationFailed, [E.Message])); end; end; procedure Deactivate; begin // Cleanup end; initialization ExportActivateDeactivate(@Activate, @Deactivate); end.
Comunicazione tra estensioni
Tramite servizi condivisi
Le estensioni comunicano tramite l'estensione Core:
// Nell'estensione A CoreService.PublishEvent('build.completed', BuildResult); // Nell'estensione B CoreService.SubscribeEvent('build.completed', @OnBuildCompleted);
Tramite API VSCode
Per accoppiamento lasco:
// Chiamare comandi ExecuteCommand('wvds.build.run'); // Eventi OnDidChangeConfiguration(@HandleConfigChange);
Pipeline di build
┌──────────────────────────────────────────────────────────────┐ │ BUILD PIPELINE │ ├──────────────────────────────────────────────────────────────┤ │ │ │ 1. Controllo policy (wvds-lint) │ │ - Nessun file .ts? │ │ - Nessun duplicato? │ │ - Wrapper solo in common? │ │ │ │ 2. Compilazione pas2js │ │ - Risoluzione unit │ │ - Type checking │ │ - Generazione JavaScript │ │ │ │ 3. Elaborazione asset │ │ - Copiare template HTML │ │ - Ottimizzare immagini │ │ - Validare package.json │ │ │ │ 4. Output │ │ - dist/extension_main.js │ │ - dist/extension_main.js.map │ │ │ │ 5. Packaging VSIX (opzionale) │ │ - vsce package │ │ - binaries/dist/*.vsix │ │ │ └──────────────────────────────────────────────────────────────┘
Vedi anche
Zuletzt geändert: il 30/01/2026 alle 01:28