“Go, please”:
language server
под микроскопом

Илья Данилкин

@nezorflame

GopherCon Russia 2020

09.08.2020

Содержание

Language Server Protocol

LSP и Go

GoLand vs VSCode

Демонстрация работы

gopls

01

02

03

04

05

Итоги

06

Language Server Protocol

Секция 01

Language Server Protocol

  • открытый протокол
  • основан на JSON-RPC
  • клиент - редактор кода / IDE
  • сервер - language server
  • фокус на фичах редактора вместо языка
  • много языков - одна среда разработки

Language Server Protocol

Language Server Protocol

LSIF

  • надстройка над LSP
  • отображение информации без checkout'а
  • уже есть для нескольких языков

Language Server Index Format

Подробности в блоге и на https://lsif.dev/

Language Server

  • имплементация фич языка
  • объединение массы утилит в одной
  • кэширование
  • нет зависимости от IDE

LSP-протокол - интерфейс

Language Server - его реализация

LSP и Go

Секция 02

Sourcegraph

  • платформа для разработчиков
  • навигация, анализ, ревью кода и алерты
  • под капотом - language server
  • первый LSP для Go

...и все было хорошо...

...до появления Go modules

bingo

  • форк sourcegraph-go
  • поддержка модулей
  • портированы фичи из guru:
    rename, go to implementation, etc.

gopls

Секция 03

Go, please!

  • официальный LSP от Go core team
  • живет в golang.org/x/tools
  • "one tool to rule them all"
  • поддержка фич языка до релиза нового функционала (привет, модули!)

GopherCon Russia 2019:
Go, pls stop breaking my editor

gopls

Небольшой бинарник...

gopls

...и большая библиотека

gopls

Пакет Описание
gopls исполняемый файл, плагины и тесты
internal/lsp основной пакет для обработки сообщений
internal/lsp/cache кэш
internal/lsp/cmd обработка командной строки
internal/lsp/debug вспомогательные функции для дебага
internal/lsp/protocol обработка функций протокола
internal/lsp/source реализация фич сервера
internal/span управление адресацией файлов в пакете
internal/memoize кэш вызова функций
internal/jsonrpc2 реализация JSON RPC2

Структура

  • Кэш: глобальная информация
    (файловая система, ее содержимое и т.п.)
  • Сессия: подключение к редактору / IDE
    (открытые файлы / overlays)
  • Отображение: конфигурация, маппинг на пакеты

Cache

Session

View

Feature list

  • Автокомплит
  • Переход к определению / имплементации
  • Документация по наведению
  • Ссылки
  • Рефакторинг (WIP)

Текущий статус, v1.0 milestone (61 issue)

 Поддержка редакторов

  • VSCode
  • Vim / Neovim
  • Emacs
  • Acme
  • Sublime Text
  • Atom

 

GoLand
vs
VSCode

Секция 04

GoLand

  • полноценная "классическая" IDE
  • родилась из IDEA + плагин для Go
  • проприетарная
  • Java

Возможности

  • полная совместимость с модулями
  • продвинутый рефакторинг
  • поддержка всех фич дебаггера
  • кэш всего GOPATH
  • полноценный SQL клиент
  • HTTP-клиент
  • расширяемость

VSCode

Возможности

  • расширяемость
  • удаленная работа (тонкий клиент + сервер)
  • глобальные и локальные настройки
  • IntelliSense (расширенный автокомплит)

vscode-go - расширение от Microsoft

nezorflame/vscode-config

Сравнение фич

Feature GoLand VSCode
Автокомплит
Быстрые фиксы ⚠️
Рефакторинг ⚠️
Документация по наведению
Кодогенерация
Определение рекурсий
Поиск использования
Поиск имплементации ⚠️
Работа с go.mod-файлом ⚠️

Популярность в мире

Использование в Avito

GoLand + LSP! (soon?)

Feature
Demo

Секция 05

Feature Demo

Итоги

Секция 06

Итоги

  • LSP упрощает поддержку языков в IDE / редакторах 
  • 1 IDE - all languages
  • Для Go: gopls
    (PR'ы приветствуются!)
  • GoLand vs VSCode = 🏁 🚴‍♀️ 🚴‍♂️

Полезные ссылки

Вопросы?

Илья Данилкин

@nezorflame

GopherCon Russia 2020

09.08.2020

20200809_gophercon

By Ilya Danilkin

20200809_gophercon

“Go, please”: language server под микроскопом. GopherCon Russia 2020, 09.08.2020.

  • 1,344