Распечатать модуль подписи файла с помощью 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.