All Projects → bkomuves → toy-language-server

bkomuves / toy-language-server

Licence: BSD-3-Clause License
Example language server (LSP) implementation for a toy language

Programming Languages

haskell
3896 projects
javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to toy-language-server

typescript-language-server
TypeScript & JavaScript Language Server
Stars: ✭ 1,118 (+1970.37%)
Mutual labels:  language-server, language-server-protocol, lsp
Protocol Buffers Language Server
[WIP] Protocol Buffers Language Server
Stars: ✭ 44 (-18.52%)
Mutual labels:  language-server, language-server-protocol, lsp
Erlang ls
The Erlang Language Server
Stars: ✭ 363 (+572.22%)
Mutual labels:  language-server, language-server-protocol, lsp
Monaco Languageclient
NPM module to connect Monaco editor with language servers
Stars: ✭ 419 (+675.93%)
Mutual labels:  language-server, language-server-protocol, lsp
atom-ide-scala
Scala & Dotty support for Atom IDE (🧟‍♂️ zombie repo)
Stars: ✭ 47 (-12.96%)
Mutual labels:  language-server, language-server-protocol, lsp
Elm Language Server
Language server implementation for Elm
Stars: ✭ 298 (+451.85%)
Mutual labels:  language-server, language-server-protocol, lsp
Typescript Language Server
TypeScript & JavaScript Language Server
Stars: ✭ 462 (+755.56%)
Mutual labels:  language-server, language-server-protocol, lsp
camel-language-server
The Apache Camel LSP server implementation
Stars: ✭ 31 (-42.59%)
Mutual labels:  language-server, language-server-protocol, lsp
Elm Language Client Vscode
Improving your Elm experience since 2019
Stars: ✭ 162 (+200%)
Mutual labels:  language-server, language-server-protocol, lsp
Nvim Lspconfig
Quickstart configurations for the Nvim LSP client
Stars: ✭ 3,410 (+6214.81%)
Mutual labels:  language-server, language-server-protocol, lsp
groovy-language-server
A language server for Groovy
Stars: ✭ 132 (+144.44%)
Mutual labels:  language-server, language-server-protocol, lsp
Fsautocomplete
F# language server using Language Server Protocol
Stars: ✭ 208 (+285.19%)
Mutual labels:  language-server, language-server-protocol, lsp
Glsl Language Server
Language server implementation for GLSL
Stars: ✭ 53 (-1.85%)
Mutual labels:  language-server, language-server-protocol, lsp
Dockerfile Language Server Nodejs
A language server for Dockerfiles powered by Node.js, TypeScript, and VSCode technologies.
Stars: ✭ 170 (+214.81%)
Mutual labels:  language-server, language-server-protocol, lsp
Csharp Language Server Protocol
Language Server Protocol in C#
Stars: ✭ 230 (+325.93%)
Mutual labels:  language-server, language-server-protocol, lsp
sublime-reason
Official Reason plugin for Sublime Text
Stars: ✭ 42 (-22.22%)
Mutual labels:  language-server, lsp
tower-lsp
Language Server Protocol implementation written in Rust
Stars: ✭ 455 (+742.59%)
Mutual labels:  language-server-protocol, lsp
LspCpp
A Language Server Protocol implementation in C++
Stars: ✭ 40 (-25.93%)
Mutual labels:  language-server-protocol, lsp
vscode
The Visual Studio Code Extension for the Erlang Language Server
Stars: ✭ 62 (+14.81%)
Mutual labels:  language-server-protocol, lsp
Spyglass
Development tools for vanilla Minecraft: Java Edition data pack developers.
Stars: ✭ 163 (+201.85%)
Mutual labels:  language-server, lsp

Minimalistic language server (LSP) implementation

Language server protocol example for a toy language implemented in Haskell, using the lsp Haskell library under the hood.

The "language" itself is very minimal to keep the implementation simple, but the LSP support aims to be somewhat realistic.

IDE features

  • parsing, scope and type errors
  • variable scope highlighting, shadowing info
  • scope-aware renaming
  • type information on hovering
  • completion (colors + LaTeX style greek letters)
  • jump to definition
  • ad-hoc diagnostic (warnings for large numbers and rainbow color)

Syntax highlighting

Syntax highlighting was not supported by the Language Server Protocol when this was originally written... which is quite a serious instance of What. The. Fuck. Apparently semantic highlighting finally comes with 3.16, but lsp does not support that yet.

Instead, we have rudimentary syntax highlighting (in VS Code only) via TextMate grammars, which are an abomination on earth if I've seen one...

The language

Our toy language consists of top-level declarations. Each declaration starts on a new line, and has the format:

indentifier : type = expression

There are three built-in types:

  • Bool
  • Nat
  • Color

Expressions are built up from literal constants, variables, a built-in infix operator (plus), and can use parentheses. Declarations are checked against the type. For colors, we have a fixed list of pre-defined colors. Color names are prefixed by a hash # character.

Example "program"

the_truth  : Bool  = True
the_lie    : Bool  = the_truth
one        : Nat   = 1
fiftyfive  : Nat   = 50 + 4 + one
too_big    : Nat   = 12345
bad_number : Nat   = (((666)))
ugly_col   : Color = #black
nice_col   : Color = #rainbow

Installation instructions (for VS Code)

  1. Install lsp and megaparsec:
$ cabal install lsp
$ cabal install megaparsec
  1. Build the server executable. This will hopefully build an executable ToyLang-IDE.exe and put it somewhere in the path:
$ cabal install
  1. Install npm (if not already installed)
  2. run the following (in the project directory!):
$ npm i vscode-languageclient 
  1. Install VS Code (if not already installed)
  2. Open the project directory in VS Code
  3. Press F5 to test the language server
  4. Open a new text file and paste the example program above. NB: You have to first save the file for the extension to be activated. And choose the file extension .toy, otherwise nothing will happen!
  5. Play around! For example, F2 does scope-aware renaming, and F12 is jump to definition.

You should see something like this:

screenshot

To permanently install the extension, copy the whole project into the extension folder (?):

  • On Windows: %USERPROFILE%\.vscode\extensions
  • On macOs / Linux: ~/.vscode/extensions
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].