Extension-Arhitektura

Detaljan opis interne arhitekture WvdS VSCode Extensiona.

Životni ciklus

┌─────────────────────────────────────────────────────────────┐
│                    EXTENSION LIFECYCLE                       │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  1. VS Code Start                                            │
│     ↓                                                        │
│  2. Activation Event se aktivira                             │
│     (onCommand, onLanguage, onStartupFinished, ...)          │
│     ↓                                                        │
│  3. extension_main.js se učitava                             │
│     ↓                                                        │
│  4. Activate() se poziva                                     │
│     → Inicijalizacija servisa                                │
│     → Registracija naredbi                                   │
│     → Postavljanje Event Handlera                            │
│     ↓                                                        │
│  5. Extension je aktivan                                     │
│     → Interakcija s korisnikom                               │
│     → Izvršavanje naredbi                                    │
│     ↓                                                        │
│  6. VS Code Shutdown / Extension deaktiviran                 │
│     ↓                                                        │
│  7. Deactivate() se poziva                                   │
│     → Cleanup                                                │
│     → Oslobađanje resursa                                    │
│                                                              │
└─────────────────────────────────────────────────────────────┘

Entry Point

Svaki Extension ima točno jedan Entry Point: 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
  // Inicijalizacija ovdje
end;
 
procedure Deactivate;
begin
  // Cleanup ovdje
end;
 
initialization
  ExportActivateDeactivate(@Activate, @Deactivate);
 
end.

Activation Events

Event Opis Primjer
onStartupFinished Nakon pokretanja VS Code Core Extension
onCommand:* Pri pozivu naredbe wvds.build.run
onLanguage:* Pri otvaranju datoteke pascal, pxaml
onView:* Pri otvaranju Viewa wvds.toolbox
workspaceContains:** Kada datoteka postoji *.lpr, *.pas
onCustomEditor:* Pri Custom Editoru wvds.designer

Registracija naredbi

procedure RegisterCommands(AContext: TExtensionContext);
begin
  // Jednostavna naredba
  RegisterCommand('wvds.feature.action', @HandleAction);
 
  // Naredba s argumentima
  RegisterCommand('wvds.feature.open', @HandleOpen);
 
  // Asinkrona naredba
  RegisterAsyncCommand('wvds.feature.process', @HandleProcessAsync);
end;
 
procedure HandleAction(Args: TJSValueDynArray);
begin
  ShowInfoMessage('Akcija izvršena');
end;
 
function HandleProcessAsync(Args: TJSValueDynArray): TJSPromise;
begin
  Result := TJSPromise.New(
    procedure(Resolve, Reject: TJSPromiseResolver)
    begin
      // Async posao...
      Resolve(nil);
    end
  );
end;

Service-Pattern

// 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;
  // Inicijalizacija servisa
  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.

Disposables

VS Code koristi Disposables za upravljanje resursima:

procedure Activate(AContext: TExtensionContext);
var
  Disposable: TDisposable;
begin
  // Registracija naredbe i dobivanje Disposablea
  Disposable := RegisterCommand('wvds.test', @Handler);
 
  // Dodavanje u Context za automatski cleanup
  AContext.Subscriptions.Push(Disposable);
end;

WebView-Integracija

procedure ShowWebViewPanel;
var
  Panel: TWebviewPanel;
begin
  Panel := CreateWebviewPanel(
    'wvds.feature.panel',     // viewType
    'Feature Panel',           // title
    ViewColumn.One,           // showOptions
    WebviewOptions            // options
  );
 
  // Postavljanje HTML-a
  Panel.Webview.Html := GetPanelHtml;
 
  // Postavljanje Messaginga
  Panel.Webview.OnDidReceiveMessage(@HandleWebviewMessage);
 
  // Slanje poruka
  Panel.Webview.PostMessage(TJSObject.New);
end;

Event-Handling

procedure SetupEventHandlers;
begin
  // Promjena konfiguracije
  OnDidChangeConfiguration(@HandleConfigChange);
 
  // Dokument-Eventi
  OnDidOpenTextDocument(@HandleDocumentOpen);
  OnDidSaveTextDocument(@HandleDocumentSave);
  OnDidCloseTextDocument(@HandleDocumentClose);
 
  // Workspace-Eventi
  OnDidChangeWorkspaceFolders(@HandleWorkspaceChange);
end;

Vidi također

Zuletzt geändert: 29.01.2026. u 22:29