← Back to Projects

VS Code Smalltalk

leocamello/vscode-smalltalk

Bringing Smalltalk to Modern Editors

I created the Smalltalk extension for Visual Studio Code to provide a complete, offline IDE experience for the language. While it currently anchors on GNU Smalltalk, the architecture is designed with the future goal of supporting multiple dialects.

This project was born out of a desire to make Smalltalk—a profoundly elegant and purely object-oriented language—more accessible to modern developers who are accustomed to the VS Code ecosystem. By bridging the gap between a classic scripting environment and a modern IDE, I aim to encourage more developers to explore what programming feels like when everything is an object.

Install the Extension:

Core Architecture & Features

This extension goes far beyond basic syntax highlighting; it implements a robust, custom Language Server Protocol (LSP) backend from scratch in TypeScript.

  • Offline Language Intelligence: It runs a bundled TypeScript language server that operates fully offline. It provides IntelliSense, semantic highlighting, live diagnostics, and signature help without even requiring a GNU Smalltalk installation on the host machine.
  • Advanced Refactoring Engines: I recently architected complex refactoring capabilities, including scope-aware variable renaming and workspace-wide class renaming that intelligently respects kernel boundaries and prevents naming collisions.
  • Rigorous Testing Methodology: The extension is validated across five distinct testing layers: unit tests, property-based tests (for verifying round-trip immutability), evaluation goldens, handshake tests, and comprehensive End-to-End (E2E) acceptance tests.

The “Objects at the Command Line” Series

This extension is actively used to write, verify, and format all of the code featured in my ongoing blog series, Objects at the Command Line. Building the tool allowed me to author the series with absolute confidence, knowing the code is structurally sound and cleanly formatted.

View Repository →