Распечатать модуль подписи файла с помощью Merlin

Как использовать Merlin 2.5.4, как правильно напечатать подпись файла OCaml в моем проекте? Например, предположим, у меня есть:

(* foo.ml *)
let x = 1

И я хочу получить:

val x : int

Какова правильная команда (или последовательность команд)?

Что я пробовал:

Я временно завернул файл в подмодуль: module Foo = struct let x = 1 endзатем побежал:

$ ocamlmerlin
["type","expression","Foo","at",{"line":1,"col":7}]

Но я получаю:

["error",{"start":{"line":1,"col":0},"end":{"line":1,"col":3},"type":"type","sub":[],"valid":true,"message":"Error: Unbound constructor Foo"}]

Это имеет смысл, потому что я на самом деле не упомянул, какой файл я запрашиваю, и нет запроса ( https://github.com/ocaml/merlin/blob/master/doc/dev/OLD-PROTOCOL.md#type-checking) разрешите.

E Я должен упомянуть, что я использую BuckleScript, а не ocamlc, а также ocamlc -i работает, только если я укажу не только мой модуль, но и все его зависимости от модуля; Я ищу что-то, что автоматически управляет этими зависимостями.

1 ответ

Один из способов заставить Мерлина вывести выводимую подпись модуля - это передать ему последовательность команд (как описано в протоколе на https://github.com/ocaml/merlin/blob/master/doc/dev/OLD-PROTOCOL.md#type-checking), которые сначала определяют модуль, а затем запрашивают его подпись. Мы можем подготовить временный файл, содержащий эту последовательность команд, и передать его Merlin в качестве стандартного ввода.

Сложные моменты: упаковка ввода правильными командами; экранирование символов двойной кавычки во входном файле, чтобы они не смешивались с форматом ввода Мерлина; и развернуть вывод, чтобы отбросить форматирование протокола Мерлина. Вот ключевые команды:

it=~/tmp/it

echo '["tell","start","end","module It = struct' >$it
sed 's/"/\\"/g' ${1%i} >>$it
echo ' end let () = ()"]' >>$it
echo '["type","expression","It","at","end"]' >>$it

ocamlmerlin <$it | sed -e '/^\["return",true\]$/d' -e 's/^\["return","sig *//' -e 's/ *end"\]$//' -e 's/\\"/"/g' -e 's/\\n/\
/g' | sed -e '/^ *$/d' -e 's/^  //'

Предостережения:

  • Выше предполагается, что система Unix-Y с touch а также sed, а также ocamlmerlin в командной строке
  • Мерлин не сохраняет атрибуты OCaml ([@...]) в своем выводе
  • Работает только для синтаксиса OCaml, но может быть адаптирован к синтаксису Reason

Более полноценный скрипт можно найти по адресу https://gist.github.com/yawaramin/b86557ae81cbd019fcb9e071abe594de.

Другие вопросы по тегам