# GN Language Server
[](https://github.com/google/gn-language-server/actions/workflows/ci.yml)
A [language server](https://microsoft.github.io/language-server-protocol/) for
[GN](https://gn.googlesource.com/gn/),
the build configuration language used in Chromium, Fuchsia, and other projects.
## Features
- Syntax highlighting
- Syntax error reporting
- Context-aware completion and auto-import
- Hover documentation
- Go to definition
- Finding target references
- Following imports
- Following dependencies
- Quick fix
- Sticky scroll with useful lines
- Code lens
- Outline
- Code folding
- Formatting
- Go to the nearest `BUILD.gn` (VSCode only)
## Installing
### VSCode and its derivatives
You can install an extension with prebuilt language server binaries from the
official
[VSCode marketplace](https://marketplace.visualstudio.com/items?itemName=Google.gn)
or the [OpenVSX marketplace](https://open-vsx.org/extension/Google/gn).
Search for "GN Language" in the VSCode's extension window.

### JetBrains IDEs (IntelliJ, CLion, Android Studio, etc.)
You can install a plugin with prebuilt language server binaries from the
[JetBrains marketplace](https://plugins.jetbrains.com/plugin/29463-gn-language).
Search for "GN Language" in the IDE's plugin window.
### Emacs
Install the language server with [Cargo](https://doc.rust-lang.org/cargo/).
```sh
cargo install --locked gn-language-server
```
Then set up [gn-mode](https://github.com/lashtear/gn-mode) or any syntax
highlighting mode for GN, and add the following to your config:
```elisp
(use-package gn-mode
:ensure t
:mode ("\\.gn\\'" "\\.gni\\'")
:hook (gn-mode . eglot-ensure)
:config
(with-eval-after-load 'eglot
(add-to-list 'eglot-server-programs '(gn-mode . ("gn-language-server")))))
```
### Other Editors/IDEs
Install the language server with [Cargo](https://doc.rust-lang.org/cargo/).
```sh
cargo install --locked gn-language-server
```
Then follow editor-specific instructions to install the language server.
## Gallery
### Syntax highlighting

### Completion and auto-import

### Hover documentation

### Go to definition

### Following imports

### Following dependencies

### Quick fix

### Sticky scroll with useful lines

### Code lens

### Outline

### Code folding

## Building from source
### Language server binary
```sh
cargo build --release
```
### VSCode extension
```sh
cd vscode-gn
npm install
npm run build
npm run package
```
## Versioning scheme
We use the versioning scheme recommended by the
[VSCode's official documentation](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#prerelease-extensions).
That is:
- Pre-release versions are `1.<odd>.x`
- Release versions are `1.<even>.x`
For Rust releases on crates.io, we use `1.<even>.x-prerelease` for pre-releases.
## Architecture
For an overview of the project's architecture, see [ARCHITECTURE.md](./ARCHITECTURE.md).
## Disclaimer
This is not an officially supported Google product. This project is not
eligible for the [Google Open Source Software Vulnerability Rewards
Program](https://bughunters.google.com/open-source-security).