====== 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 =====
* [[.:architektur|Pregled arhitekture]]
* [[.:extension-entwicklung|Razvoj razširitev]]
* [[.:vscode-wrapper|VSCode ovojni API]]