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
- 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.
- 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; }
- 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.
- 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
-
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
-
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
-
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.
-
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
-
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
-
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.
- 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
- If You're Studying Architecture The most educational files: Those define the whole contract.
languages.ts
suggestModel.ts
extHostLanguageFeatures.ts
languageFeatureRegistry.ts