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:

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:

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