Arhitektura razširitve

Podroben opis notranje arhitekture WvdS VSCode razširitve.

Življenjski cikel

┌─────────────────────────────────────────────────────────────┐
│                    ŽIVLJENJSKI CIKEL RAZŠIRITVE              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  1. Zagon VS Code                                            │
│     ↓                                                        │
│  2. Sproži se aktivacijski dogodek                           │
│     (onCommand, onLanguage, onStartupFinished, ...)          │
│     ↓                                                        │
│  3. Naloži se extension_main.js                              │
│     ↓                                                        │
│  4. Pokliče se Activate()                                    │
│     → Inicializacija storitev                                │
│     → Registracija ukazov                                    │
│     → Nastavitev obravnavalcev dogodkov                      │
│     ↓                                                        │
│  5. Razširitev je aktivna                                    │
│     → Interakcija uporabnika                                 │
│     → Izvajanje ukazov                                       │
│     ↓                                                        │
│  6. Zaustavitev VS Code / Deaktivacija razširitve            │
│     ↓                                                        │
│  7. Pokliče se Deactivate()                                  │
│     → Čiščenje                                               │
│     → Sprostitev virov                                       │
│                                                              │
└─────────────────────────────────────────────────────────────┘

Vstopna točka

Vsaka razširitev ima natanko eno vstopno točko: extension_main.pas

unit extension_main;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  JS, VSCode.API, VSCode.ExtensionExports;
 
procedure Activate(AContext: TExtensionContext);
procedure Deactivate;
 
implementation
 
procedure Activate(AContext: TExtensionContext);
begin
  // Inicializacija tukaj
end;
 
procedure Deactivate;
begin
  // Čiščenje tukaj
end;
 
initialization
  ExportActivateDeactivate(@Activate, @Deactivate);
 
end.

Aktivacijski dogodki

Dogodek Opis Primer
onStartupFinished Po zagonu VS Code Jedro razširitve
onCommand:* Ob klicu ukaza wvds.build.run
onLanguage:* Ob odprtju datoteke pascal, pxaml
onView:* Ob odprtju pogleda wvds.toolbox
workspaceContains:** Ko datoteka obstaja *.lpr, *.pas
onCustomEditor:* Ob odprtju urejevalnika po meri wvds.designer

Registracija ukazov

procedure RegisterCommands(AContext: TExtensionContext);
begin
  // Preprost ukaz
  RegisterCommand('wvds.feature.action', @HandleAction);
 
  // Ukaz z argumenti
  RegisterCommand('wvds.feature.open', @HandleOpen);
 
  // Asinhroni ukaz
  RegisterAsyncCommand('wvds.feature.process', @HandleProcessAsync);
end;
 
procedure HandleAction(Args: TJSValueDynArray);
begin
  ShowInfoMessage('Akcija izvedena');
end;
 
function HandleProcessAsync(Args: TJSValueDynArray): TJSPromise;
begin
  Result := TJSPromise.New(
    procedure(Resolve, Reject: TJSPromiseResolver)
    begin
      // Asinhrono delo...
      Resolve(nil);
    end
  );
end;

Vzorec storitev

// Feature.Service.pas
unit Feature.Service;
 
interface
 
type
  TWvdSFeatureService = class
  private
    FInitialized: Boolean;
  public
    procedure Initialize;
    procedure Shutdown;
    function DoWork(const AInput: string): string;
  end;
 
var
  FeatureService: TWvdSFeatureService;
 
implementation
 
procedure TWvdSFeatureService.Initialize;
begin
  if FInitialized then Exit;
  // Inicializacija storitve
  FInitialized := True;
end;
 
procedure TWvdSFeatureService.Shutdown;
begin
  if not FInitialized then Exit;
  // Čiščenje
  FInitialized := False;
end;
 
initialization
  FeatureService := TWvdSFeatureService.Create;
 
finalization
  FeatureService.Free;
 
end.

Odložljivi objekti

VS Code uporablja odložljive objekte za upravljanje virov:

procedure Activate(AContext: TExtensionContext);
var
  Disposable: TDisposable;
begin
  // Registracija ukaza in pridobitev odložljivega objekta
  Disposable := RegisterCommand('wvds.test', @Handler);
 
  // Dodaj v kontekst za samodejno čiščenje
  AContext.Subscriptions.Push(Disposable);
end;

Integracija WebView

procedure ShowWebViewPanel;
var
  Panel: TWebviewPanel;
begin
  Panel := CreateWebviewPanel(
    'wvds.feature.panel',     // viewType
    'Panel funkcije',          // title
    ViewColumn.One,           // showOptions
    WebviewOptions            // options
  );
 
  // Nastavi HTML
  Panel.Webview.Html := GetPanelHtml;
 
  // Nastavi sporočanje
  Panel.Webview.OnDidReceiveMessage(@HandleWebviewMessage);
 
  // Pošlji sporočila
  Panel.Webview.PostMessage(TJSObject.New);
end;

Obravnava dogodkov

procedure SetupEventHandlers;
begin
  // Sprememba konfiguracije
  OnDidChangeConfiguration(@HandleConfigChange);
 
  // Dogodki dokumenta
  OnDidOpenTextDocument(@HandleDocumentOpen);
  OnDidSaveTextDocument(@HandleDocumentSave);
  OnDidCloseTextDocument(@HandleDocumentClose);
 
  // Dogodki delovnega prostora
  OnDidChangeWorkspaceFolders(@HandleWorkspaceChange);
end;

Glejte tudi

Zuletzt geändert: dne 29.01.2026 ob 22:22