Inhaltsverzeichnis
Pregled arhitekture
Ta dokument opisuje celotno arhitekturo paketa WvdS FPC RAD Studio.
Oblikovalske odločitve
Zakaj Pascal za razširitve VS Code?
Motivacija:
- Enotna kodna baza za vse cilje (GUI, TUI, Web, razširitve)
- Močna tipizacija zmanjšuje napake med izvajanjem
- Izkoriščanje znanja razvijalcev iz obstoječih projektov Pascal
- pas2js omogoča visokokakovosten izhod JavaScript
Obravnavane alternative:
| Alternativa | Odločitev | Utemeljitev |
|---|---|---|
| TypeScript | Zavrnjeno | Dva jezika, več kompleksnosti |
| Rust + WASM | Zavrnjeno | Kompleksna interoperabilnost z VSCode API |
| Delphi | Zavrnjeno | Komercialno, brez alternative pas2js |
Zakaj PXAML namesto LFM?
Motivacija:
- Nadzor različic: XML je prijazen do diff
- Več ciljev: Enako označevanje za GUI, TUI, Web
- Orodja: Na voljo standardni razčlenjevalniki XML
- Znano: Sintaksa WPF/XAML za prehajanje
Slojevita arhitektura
┌─────────────────────────────────────────────────────────────────────┐ │ Extension Layer │ │ (extension_main.pas - Entry Point, Command Handler, UI Integration) │ ├─────────────────────────────────────────────────────────────────────┤ │ Service Layer │ │ (*.Service.pas - Poslovna logika, validacija, operacije) │ ├─────────────────────────────────────────────────────────────────────┤ │ Model Layer │ │ (*.Models.pas - Zapisi, tipi, enumeracije, brez logike) │ ├─────────────────────────────────────────────────────────────────────┤ │ Infrastructure Layer │ │ (WvdS.VSCode.*, WvdS.Node.* - API Wrapper, Platform Abstraction) │ └─────────────────────────────────────────────────────────────────────┘
Odgovornosti
| Sloj | Vsebina | Odvisnosti |
|---|---|---|
| Extension | Interakcija z UI, registracija ukazov | Service, Model, Infrastructure |
| Service | Poslovna logika, validacija | Model |
| Model | Podatkovne strukture | Brez |
| Infrastructure | VSCode/Node API | Samo zunanji API |
Pravila
DOVOLJENO: Extension -> Service -> Model PREPOVEDANO: Service -> Extension (obrat) PREPOVEDANO: Model -> Service (logika v Model)
Graf odvisnosti
wvds.vscode.packaging
│
▼
wvds.vscode.ui.preview ─► wvds.vscode.build
│ │
▼ │
wvds.vscode.ui.designer │
│ │
└───────┬──────────────┘
▼
wvds.vscode.projects
│
▼
wvds.vscode.ui.meta
│
▼
wvds.vscode.core (Osnova)
Podrobnosti odvisnosti razširitev
| Razširitev | Odvisnosti | Vloga |
|---|---|---|
| core | - | Osnova: Toolchain, beleženje, skupne storitve |
| build | core | Prevajanje, formater Uses |
| projects | core | Upravljanje projektov, predloge |
| ui.meta | core | Register komponent |
| ui.designer | core | Urejevalnik PXAML |
| ui.preview | core, ui.designer | Živi predogled |
| packaging | core, build | Ustvarjanje VSIX |
Struktura Monorepo
sources/ - Enoten vir resnice
sources/
├── common/ # Skupna koda
│ ├── core/ # Osnovne enote (brez odvisnosti)
│ │ ├── WvdS.System.pas
│ │ ├── WvdS.Collections.pas
│ │ └── WvdS.Strings.pas
│ │
│ ├── ui/ # UI ogrodje
│ │ ├── controls/ # Osnovni kontrolniki
│ │ ├── components/ # Sestavljene komponente
│ │ ├── runtime/ # PXAML Runtime
│ │ └── targets/ # Upodabljalniki
│ │ ├── tui/ # Terminal UI
│ │ ├── gui/ # Desktop GUI
│ │ └── web/ # Brskalnik
│ │
│ └── web/ # Host Bridges
│ ├── nodejs/ # Node.js API
│ └── vscode/ # VSCode API
│
├── extensions/ # Paketi VSIX
│ └── wvds.vscode.{name}/
│ ├── pas/ # Izvorna koda Pascal
│ ├── dist/ # Prevedeni JS
│ ├── templates/ # Predloge HTML
│ ├── images/ # Ikone, grafike
│ ├── package.json # Manifest razširitve
│ └── build.cfg # Konfiguracija gradnje
│
├── applications/ # Samostojne aplikacije
├── tools/ # CLI orodja
└── packages/ # Paketi IDE
binaries/ - Izhod gradnje
binaries/
├── out/{app}/{target}/{mode}/ # Artefakti gradnje
│ ├── gen/ # Generirana koda
│ ├── bin/ # Izvršljive datoteke
│ └── assets/ # Viri
│
├── cache/ # Predpomnilnik prevajalnika (.ppu, .o)
├── dist/ # Artefakti izdaje (.vsix)
└── logs/ # Dnevniki gradnje
Anatomija razširitve
Struktura map
wvds.vscode.{name}/
├── pas/
│ ├── extension_main.pas # Vstopna točka (OBVEZNO)
│ ├── {Feature}.Models.pas # Podatkovne strukture
│ ├── {Feature}.Service.pas # Poslovna logika
│ └── {Feature}.Dialog.pas # UI komponente (opcijsko)
│
├── dist/
│ ├── extension_main.js # Prevedeni JS
│ └── extension_main.js.map # Source Map
│
├── templates/
│ └── *.html # Predloge WebView
│
├── images/
│ └── icon.png # Ikona razširitve
│
├── package.json # Manifest VSCode
├── build.cfg # Konfiguracija gradnje
└── README.md # Dokumentacija
Vzorec 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 // Inicializacija storitev Initialize{Feature}Service; // Registracija ukazov RegisterCommand('wvds.{feature}.{action}', @Handle{Action}); // Izhodni kanal ShowInfoMessage('WvdS {Name} aktiviran'); end; procedure Activate(AContext: TExtensionContext); begin try DoActivate(AContext); except on E: Exception do ShowErrorMessage(Format(rsActivationFailed, [E.Message])); end; end; procedure Deactivate; begin // Čiščenje end; initialization ExportActivateDeactivate(@Activate, @Deactivate); end.
Komunikacija med razširitvami
Preko skupnih storitev
Razširitve komunicirajo preko razširitve Core:
// V razširitvi A CoreService.PublishEvent('build.completed', BuildResult); // V razširitvi B CoreService.SubscribeEvent('build.completed', @OnBuildCompleted);
Preko VSCode API
Za šibko sklopljenost:
// Klic ukazov ExecuteCommand('wvds.build.run'); // Dogodki OnDidChangeConfiguration(@HandleConfigChange);
Cevovod gradnje
┌──────────────────────────────────────────────────────────────┐ │ CEVOVOD GRADNJE │ ├──────────────────────────────────────────────────────────────┤ │ │ │ 1. Preverjanje politike (wvds-lint) │ │ - Brez datotek .ts? │ │ - Brez dvojnikov? │ │ - Wrapperji samo v common? │ │ │ │ 2. Prevajanje pas2js │ │ - Razreševanje enot │ │ - Preverjanje tipov │ │ - Generiranje JavaScript │ │ │ │ 3. Obdelava sredstev │ │ - Kopiranje predlog HTML │ │ - Optimizacija slik │ │ - Validacija package.json │ │ │ │ 4. Izhod │ │ - dist/extension_main.js │ │ - dist/extension_main.js.map │ │ │ │ 5. Pakiranje VSIX (opcijsko) │ │ - vsce package │ │ - binaries/dist/*.vsix │ │ │ └──────────────────────────────────────────────────────────────┘
Glejte tudi
Zuletzt geändert: dne 29.01.2026 ob 22:18