No description, website, or topics provided.
Clone or download
Latest commit f330946 Nov 2, 2018

README.md

F# Language Server

This project is an implementation of the language server protocol using the F# Compiler Service.

CircleCI

Features

Hover

Hover

Autocomplete

Autocomplete

Method signature help

Signature help

Find symbols in document

Document symbols

Find symbols in workspace

Workspace symbols

Go-to-definition

Go to definition

Find references

Find references

Rename symbol

Rename symbol

Show errors on save

Show errors

Run & Debug tests

Debug test

Code structure

The language server protocol (LSP) is very similar to the API defined by the F# compiler service (FCS); most of the implementation is devoted to translating between the types used by FCS and the JSON representation of LSP.

  • client/extension.ts: Client-side VSCode launcher
  • sample: Example projects used by tests
  • scripts: Scripts for building and testing
  • src/LSP: Server-side implementation of language server protocol
  • src/ProjectCracker: Figures out F# compiler options using Buildalyzer and the MSBuild API.
  • src/FSharpLanguageServer: F# language server
  • tests/LSP.Tests
  • tests/ProjectCracker.Tests
  • tests/FSharpLanguageServer.Tests
  • videos: Animated GIFs on this page

Installation

VSCode

Install from the VSCode extension marketplace

Vim

Clone this repo to your system and build it:

npm install
dotnet build -c Release

Install LanguageClient-neovim

Update your vim config to point LanguageClient-neovim to the FSharp Language Server for fsharp filetypes:

let g:LanguageClient_serverCommands = {
    \ 'fsharp': ['dotnet', '/Users/name/code/fsharp-language-server/src/FSharpLanguageServer/bin/Release/netcoreapp2.0/target/FSharpLanguageServer.dll']
    \ }

Open an fsharp file, move the cursor, and call functions. Mappings are up to you:

  • Hover call LanguageClient#textDocument_hover()
  • Rename: call LanguageClient#textDocument_rename()
  • Definition: call LanguageClient#textDocument_definition()
  • etc...

Neovim with Deoplete completion:
VimDeoplete

(alternatively there is another vim language server plugin vim-lsp but this one hasn't been tried.

Emacs

Help wanted--should be straightforward with emacs-lsp, a PR with instructions here would be appreciated.

How is this project different than Ionide?

Ionide is a suite of F# plugins for VSCode; F# language server is analagous to the FSAC component. While FSAC is based on a custom JSON protocol; F#LS is based on the language server protocol standard.

The implementation is a thin wrapper around F# Compiler Service and is heavily focused on performance. For example, autocompleting in medium-sized file in F# Language Server (left) and Ionide (right):

Autocomplete warm