Skip to content

Instantly share code, notes, and snippets.

@Kielan
Last active February 14, 2026 21:02
Show Gist options
  • Select an option

  • Save Kielan/330b6dc31b27ee2a1f94334ab02e2c71 to your computer and use it in GitHub Desktop.

Select an option

Save Kielan/330b6dc31b27ee2a1f94334ab02e2c71 to your computer and use it in GitHub Desktop.
VS Code’s core architecture:

VS Code’s core architecture: VS Code splits into three major layers: UI (Workbench) ↓ Editor (Monaco) ↓ Language Features (Providers / LSP)

VS Code itself does NOT parse most languages. It delegates to:

  • Built-in language services (TS/JS, JSON, HTML, CSS)
  • Extensions
  • LSP servers

Autocomplete (Suggest) data flow/architecture: When you press: Ctrl + Space

Here’s what happens: SuggestController ↓ SuggestModel ↓ CompletionItemProvider (1..N) ↓ Language Feature Registry ↓ Extension Host or Built-in Provider ↓ (Optional) LSP Server

🔹 UI Layer (Popup Menu) src/vs/editor/contrib/suggest/

Key Files 1️⃣ suggestController.ts

Main entry point for triggering suggest. Class: SuggestController Key methods: triggerSuggest() _cancelSuggestWidget()

2️⃣ suggestModel.ts Handles provider orchestration and merging results. This is where all providers are queried. Class: SuggestModel Important methods: trigger(context: SuggestTriggerContext) _provideCompletionItems()

3️⃣ suggestWidget.ts The actual popup UI list. Class: SuggestWidget Handles: Rendering Selection Filtering Focus

  1. Completion Providers (Language Side) This is the core autocomplete interface. Provider Interface Defined in: src/vs/editor/common/languages.ts Interface: export interface CompletionItemProvider { provideCompletionItems( model: ITextModel, position: Position, context: CompletionContext, token: CancellationToken ): ProviderResult; }

Registry In: src/vs/editor/common/languageFeatureRegistry.ts Class: LanguageFeatureRegistry Used for: -CompletionItemProvider -HoverProvider -DefinitionProvider -etc.

  1. Hover / “Lookup Window” (Tooltip) When you hover over a symbol: HoverController ↓ HoverOperation ↓ HoverProvider (1..N) ↓ Language Service / LSP

🔹 UI Files Folder: src/vs/editor/contrib/hover/ Important files: hoverController.ts Entry point. contentHoverController.ts Coordinates content hover behavior. hoverWidget.ts The actual tooltip UI.

Hover Provider Interface In: src/vs/editor/common/languages.ts Interface: export interface HoverProvider { provideHover( model: ITextModel, position: Position, token: CancellationToken ): ProviderResult; }

  1. Syntax Tree — Where It Actually Comes From VS Code editor itself does NOT build an AST for most languages. Instead: | Language | Who owns AST | | --------------------- | --------------------------- | | TypeScript/JavaScript | TypeScript Server | | JSON | vscode-json-languageservice | | HTML | vscode-html-languageservice | | CSS | vscode-css-languageservice | | Python | Pylance extension | | Rust | rust-analyzer extension |

TypeScript Example (Built-in) Extension folder: extensions/typescript-language-features/ Important file: src/tsServer/tsServerService.ts This launches: tsserver.js

The AST lives inside TypeScript's compiler services. Autocomplete ultimately comes from:

languageService.getCompletionsAtPosition()

Defined in the TypeScript repo, not VS Code.

  1. LSP Data Flow (Most Languages) For extension-based languages: Editor (Monaco) ↓ Extension Host ↓ vscode-languageclient ↓ JSON-RPC ↓ Language Server (separate process)

LSP Interface (Extension API) Registers providers from extensions. In: src/vs/workbench/api/common/extHostLanguageFeatures.ts Key class: ExtHostLanguageFeatures

Completion LSP Spec Protocol definition lives in: Language Server Protocol repo: Completion request: textDocument/completion Spec: CompletionParams CompletionItem CompletionList

  1. Full Autocomplete Flow (Step-by-Step) Let’s trace Ctrl+Space fully: 1️⃣ User triggers suggest SuggestController.triggerSuggest() ↓ 2️⃣ SuggestModel gathers providers LanguageFeatureRegistry ↓ 3️⃣ Each provider called provideCompletionItems() ↓ 4️⃣ If LSP-backed: Extension Host → JSON RPC → Language Server → returns CompletionItems ↓ 5️⃣ SuggestModel merges & ranks ↓ 6️⃣ SuggestWidget renders popup

  2. Core Language Interfaces src/vs/editor/common/languages.ts Defines: CompletionItem Hover Definition DocumentSymbol 2️⃣ Provider Registry src/vs/editor/common/languageFeatureRegistry.ts 3️⃣ Suggest Engine src/vs/editor/contrib/suggest/ 4️⃣ Hover Engine src/vs/editor/contrib/hover/ 5️⃣ Extension Host Bridge src/vs/workbench/api/common/extHostLanguageFeatures.ts

  3. Monaco vs VS Code Important distinction: VS Code embeds Monaco Editor. Monaco repo: https://github.com/microsoft/monaco-editor Many editor-side files originate from Monaco. If you're exploring autocomplete internals, also read: monaco-editor/src/vs/editor/contrib/suggest/ They are extremely similar.

  4. Architectural Layers (Mental Model) Think of VS Code like this: [Workbench UI] panels, tabs, layout [Editor (Monaco)] text model cursor decorations suggest hover [Language Feature Registry] provider orchestration [Extension Host] sandbox for extensions [Language Server / Built-in Service] AST type checking semantic model

  5. If You Want to Modify Behavior Modify popup UI? Look in: suggestWidget.ts Modify ranking? completionModel.ts Modify trigger logic? suggestController.ts Modify hover appearance? hoverWidget.ts

  6. Where Lookup Tables Live There are 2 types: 1️⃣ Keyword-based completion Hardcoded arrays inside language services. Example: JSON schema keywords HTML tags list These live in: vscode-html-languageservice vscode-json-languageservice

2️⃣ AST-based lookup Generated from: TypeScript compiler API LSP server symbol tables VS Code itself does not maintain symbol tables.

  1. Best Way to Learn the Flow I recommend: Open VS Code repo Search: provideCompletionItems Set breakpoint in: suggestModel.ts Run VS Code in dev mode:
yarn watch

./scripts/code.sh

  1. If You're Studying Architecture The most educational files: Those define the whole contract.
languages.ts
suggestModel.ts
extHostLanguageFeatures.ts
languageFeatureRegistry.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment