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