# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview This is an IntelliJ IDEA plugin that provides Slint language support through LSP (Language Server Protocol) integration. The plugin downloads platform-specific Slint LSP binaries from GitHub releases and integrates them with IntelliJ's LSP infrastructure. ## Build System This project uses Gradle with the Kotlin DSL and the IntelliJ Platform Gradle Plugin. ### Common Commands **Build the plugin:** ```bash ./gradlew build ``` **Run the plugin in a sandbox IDE:** ```bash ./gradlew runIde ``` **Run tests:** ```bash ./gradlew test ``` **Verify plugin compatibility:** ```bash ./gradlew verifyPlugin ``` **Build plugin distribution ZIP:** ```bash ./gradlew buildPlugin ``` **Clean build artifacts:** ```bash ./gradlew clean ``` ## Architecture ### LSP Integration The plugin uses IntelliJ's LSP support (`com.intellij.modules.lsp`) to provide language features for `.slint` files. **Key components:** - `SlintLspServerSupportProvider` (src/main/kotlin/me/zhouxi/slint/lsp/SlintLspServerSupportProvider.kt:13): Main LSP integration point. Implements `LspServerSupportProvider` to start the Slint LSP server when `.slint` files are opened. - `SlintRuntime` (src/main/kotlin/me/zhouxi/slint/SlintRuntime.kt:8): Manages plugin paths and locates the platform-specific LSP binary. Detects OS (Windows/Linux/macOS) and resolves the correct executable path. - `FooLspServerDescriptor` (src/main/kotlin/me/zhouxi/slint/lsp/SlintLspServerSupportProvider.kt:34): Internal descriptor that creates the command line for launching the LSP server. ### Binary Distribution The build process downloads platform-specific Slint LSP binaries from GitHub releases: - **Download task** (build.gradle.kts:72-79): Downloads LSP binaries for Linux, macOS, and Windows from `https://github.com/slint-ui/slint/releases/download/v{version}/` - **Extract task** (build.gradle.kts:80-104): Extracts and renames binaries to standardized names (`slint-lsp-linux`, `slint-lsp-macos`, `slint-lsp-windows.exe`) - **Sandbox preparation** (build.gradle.kts:105-111): Copies extracted binaries to `slint/lsp/` directory in the plugin sandbox The Slint version is configured in `gradle.properties` via the `slintVersion` property. ### Plugin Configuration - **plugin.xml** (src/main/resources/META-INF/plugin.xml): Declares the plugin metadata, dependencies, and extension points. Registers `SlintLspServerSupportProvider` as the LSP server support provider. - **Target IDE version**: IntelliJ IDEA 2025.2.4 with minimum build 252.25557 (configured in build.gradle.kts:43,56) - **Java/Kotlin version**: JVM 21 (build.gradle.kts:68-70,114-118) ## Project Structure ``` src/main/kotlin/me/zhouxi/slint/ ├── SlintRuntime.kt # Plugin runtime and binary path resolution ├── icons/SlintIcons.kt # Icon resources for UI └── lsp/ └── SlintLspServerSupportProvider.kt # LSP integration ``` ## Testing the Plugin ### Manual Testing 1. **Build and run in sandbox:** ```bash ./gradlew runIde ``` 2. **Test with sample file:** - Open `test-files/hello.slint` - Verify file icon, syntax highlighting, and LSP features 3. **Test LSP features:** - Code completion: Type and press Ctrl+Space - Goto definition: Ctrl+Click on symbols - Hover: Mouse over symbols - Diagnostics: Introduce syntax errors - Formatting: Ctrl+Alt+L ### Verify LSP Server Check LSP server status in the status bar (bottom right). Should show "Slint" when a .slint file is open. ### Common Issues - **LSP server not starting**: Check that LSP binary exists in sandbox at `sandbox/plugins/slint/lsp/slint-lsp-{platform}` - **No syntax highlighting**: Verify TextMate grammar file is in resources - **No completion**: Check LSP server logs in `idea.log` ## Development Notes - The plugin uses IntelliJ's built-in LSP client infrastructure, so language features (completion, diagnostics, etc.) are provided by the Slint LSP server itself. - The sandbox directory is configured to `sandbox/` in the project root (build.gradle.kts:53). - When modifying LSP integration, test by running `./gradlew runIde` which launches a sandbox IDE with the plugin installed. - To update the Slint LSP version, change `slintVersion` in `gradle.properties` and rebuild. The build will download new binaries automatically.