Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Здесь выкладываются готовые к использованию макросы и скрипты.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe »

Luacheck это статический анализатор для Lua.
Luacheck может обнаруживать разнообразные проблемы, такие как использование неопределённых глобальных переменных, неиспользованные переменные и значения, доступ к неинициализированным переменным, недостижимый код и многое другое.

А для удобной работы с luacheck в фаре предлагаю данный пакет скриптов, обеспечивающий работу Luacheck в редакторе и в командной строке.
Кроме того, в редакторе для Luacheck обеспечивается прозрачная "трансляция" MoonScript, что позволяет анализировать и *.moon-файлы.

Инструкции по установке, настройке, и работе — во встроенной справке.

Требования:
  • FAR 3 не старше b5106
  • luacheck не ниже v0.19
Attachments
far_standards.lua.cfg_v1.5.7z
Обновлённые определения (far 6114 / lm 772)
(8.5 KiB) Downloaded 87 times
luaсheck_far_v1.4.3.7z
far5505.lm712
(23.38 KiB) Downloaded 335 times
Last edited by John Doe on Sat 09 Nov, 2019 16:08, edited 3 times in total.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by zg »

Latest post of the previous page:

John Doe wrote: Sun 08 Oct, 2017 16:04Жму F5, чтобы вставить шаблон, сохраняю, закрываю.
у меня сохранился в %FARPROFILE%\Macros\scripts\.luacheckrc
John Doe wrote: Sun 08 Oct, 2017 16:04Расписал так же и в справке (будет в следующей версии).
я-то справку читал. но у меня например связи между far_standards.lua.cfg и тем, что его надо включить в .luacheckrc — не возникло, хотя это там и описано.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe »

zg wrote: Wed 11 Oct, 2017 17:57у меня сохранился в %FARPROFILE%\Macros\scripts\.luacheckrc
Могу предположить, что вы его создали там ранее. Существующий подхватывается, поэтому и написал первым шагом удалить все конфиги.
или в папке luacheck (тогда он будет умолчательный).
Уточню, что здесь имеется в виду не папка модуля, а место, куда установлен данный пакет макросов.
zg wrote: Wed 11 Oct, 2017 17:57я-то справку читал. но у меня например связи между far_standards.lua.cfg и тем, что его надо включить в .luacheckrc — не возникло, хотя это там и описано.
Last edited by John Doe on Wed 23 May, 2018 07:41, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by zg »

John Doe wrote: Wed 11 Oct, 2017 18:28Уточню, что здесь имеется в виду не папка модуля, а место, куда установлен данный пакет макросов.
тогда всё правильно.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe »

build 5067

MACROAREA_DESKTOP, MACROAREA_GRABBER
WTYPE_GRABBER, WTYPE_HMENU
Area.Desktop, Area.Grabber
Last edited by John Doe on Wed 23 May, 2018 07:41, edited 1 time in total.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by IgorZ »

При проверке получил вот такое
package.moonpath - "искаропки";
LE - сам добавляю глобальную функцию из _macroinit.lua;
DUMMY - не существует (добавил для проверки).
Хотелось бы видеть только предупреждения третьего типа.
Может, сделать вариант, когда глобальные переменные проверяются динамически, по наличию поля с таким именем в таблице _G? MacroComplete от SimSU работает динамически, очень удобно.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe »

IgorZ wrote: Thu 26 Oct, 2017 06:10MacroComplete от SimSU работает динамически, очень удобно.
Согласен, но тут у нас немного другая ситуация.
IgorZ wrote: Thu 26 Oct, 2017 06:10Может, сделать вариант, когда глобальные переменные проверяются динамически, по наличию поля с таким именем в таблице _G?
Так и было по умолчанию в luacheck до версии 0.19.
Теперь же всё должно целиком определяться конфигом, и это принципиальная позиция автора: результат проверки не должен зависеть от текущего окружения.
(Для примера: при запуске из командной строки ваших добавлений в _G не будет.)

Поэтому рекомендую добавить нужные вам идентификаторы в конфиг. Более того, можно написать и "умный" конфиг, учитывающий все "добавления" автоматически. Но подумайте, действительно ли вам это надо?
Что представляют собой эти идентификаторы? Если это функции, используемые для отладки, то их не должно остаться в финальной версии, а значит и хорошо, что luacheck предупреждает.

Кроме того, рекомендую присмотреться к inline-опциям, позволяющим тонко менять настройки локально.

P.S.
package.moonpath я добавлю, а пока используйте конфиг, или инлайн-опцию.

Code: Select all

--luacheck: read globals package.moonpath
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by IgorZ »

John Doe wrote: Thu 26 Oct, 2017 09:04
IgorZ wrote: Thu 26 Oct, 2017 06:10Может, сделать вариант, когда глобальные переменные проверяются динамически, по наличию поля с таким именем в таблице _G?
Так и было по умолчанию в luacheck до версии 0.19.
Теперь же всё должно целиком определяться конфигом, и это принципиальная позиция автора: результат проверки не должен зависеть от текущего окружения.
А как опцию? К примеру, std = "dynamic". Авторская позиция понятна, но раз уж есть возможность иметь несколько конфигураций, почему бы не сделать и такой вариант?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe »

IgorZ wrote: Thu 26 Oct, 2017 11:11почему бы не сделать и такой вариант?
Главный вопрос: зачем?
Я верю что надо, но от обоснования зависит в какой форме это лучше реализовать.

В частности, напоминаю, что std это не единственный способ задать глобальные идентификаторы.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by IgorZ »

John Doe wrote: Thu 26 Oct, 2017 11:42
IgorZ wrote: Thu 26 Oct, 2017 11:11почему бы не сделать и такой вариант?
Главный вопрос: зачем?
Я верю что надо, но от обоснования зависит в какой форме это лучше реализовать.

В частности, напоминаю, что std это не единственный способ задать глобальные идентификаторы.
Ну, например, у меня есть активно используемая таблица far.Guids.Plugins. Во-первых, её содержание достаточно объёмно, и забивать всё это вручную, как минимум, неохота. Во-вторых, оно ещё и различается для разных экземпляров Far (а у меня их несколько). Это тоже прибавит головной боли.
Ещё одно преимущество - отсутствие необходимости вносить изменения в список при появлении новых глобальных переменных в новых версиях LuaFar. И гарантия отсутствия ошибок и опечаток в списке.

Кстати, можно, наверное, сделать компромиссный вариант: скажем, таблица глобальных имён заполняется при вызове специальной функции из _macroinit.lua и далее сохраняется неизменной. Хотя лично меня вполне устроило бы старое поведение.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe »

IgorZ wrote: Thu 26 Oct, 2017 12:50Ну, например, у меня есть активно используемая таблица far.Guids.Plugins. Во-первых, её содержание достаточно объёмно, и забивать всё это вручную, как минимум, неохота. Во-вторых, оно ещё и различается для разных экземпляров Far (а у меня их несколько).
То что отличается это не страшно, можно забить максимально полный (и не обязательно вручную).
Хотя в вашем случае мне кажется строгий контроль содержания Plugins не требуется, а значит можно "задекларировать" саму таблицу без содержимого.
IgorZ wrote: Thu 26 Oct, 2017 12:50Ещё одно преимущество - отсутствие необходимости вносить изменения в список при появлении новых глобальных переменных в новых версиях LuaFar.
Сомнительное преимущество. Во-первых, это не позволит выявить ваши персональные идентификаторы, что важно, если скрипты не только на этой машине должны запускаться.
Во-вторых, это никак не поможет учесть идентификаторы, отсутствующих в _G (например загрузочные функции).
И в-третьих, добавить-то не сложно на самом деле.
IgorZ wrote: Thu 26 Oct, 2017 12:50И гарантия отсутствия ошибок и опечаток в списке.
В моём списке я гарантирую отсутствие опечаток, поскольку изначально получал его из _G, а затем сверял с мануалами.
Могут оставаться конечно какие-то неточности, но совсем в других аспектах (может чего-то ещё не хватать, или неправильно определёно RO/RW-свойство).
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe »

IgorZ wrote: Thu 26 Oct, 2017 12:50Хотя лично меня вполне устроило бы старое поведение.
Старое поведение таково, что элементы _G учитывались в один уровень, не рекурсивно, и по умолчанию считались доступными для записи.
Т.е. luacheck знал, что есть таблица far, а дальше ему всё равно, хоть far.Plugins, хоть far.Qwerty, хоть far = Far.

Вернуть его не просто, а очень просто, например как вы там предлагали в _macroinit:

Code: Select all

local G = {}
for k,v in pairs(_G) do G[#G+1] = k end
require "luacheck.builtin_standards".G = {globals=G}
Но боюсь, это не то, чего вы хотели)

Развиваем мысль дальше:
Last edited by John Doe on Sat 28 Oct, 2017 11:32, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe »

Реализуя не связанную идею подошёл к вопросу с другой стороны: можно ведь дополнительно анализировать список, полученный от luacheck.
Так что заодно и ваше пожелание осуществил.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by buniak_a_h »

Здравствуйте!
У меня предложение: сделать мелкое, но (как показал опыт) полезное дополнение к скрипту - "подсказка" для вставки в текст слов (ключевых слов языка или имена полей/пропертей таблиц). Первый маленький скрипт на эту тему я сделал; естественно, там много недоделок (не подставляются известные в контексте имена переменных, имена методов (например, запросить тип переменной и дать выбрать).
P/S. Я знаю о существовании скрипта WordComplee в пакете Rh_Scripts. НО! (а) Одна инструкция по установке осложняет даже ознакомление; (б) Требует установки плагина LuaFAR for Editor, а его функции во многом пересекаются (дублируют) то, что у меня реализовано скриптами, и сделано удобнее (и гибче, т.к. доступен текст). От этого плагина мне (ПОКА) пришлось отказаться.. (в) да и вообще - не хочется устанавливать ещё один плагин, если вопрос решается скриптом. А в вашей системе LuaCheck есть практически вся информация, необходимая для выдачи подсказок (в т.ч и информация о видимости переменных) .
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by John Doe »

buniak_a_h wrote: Fri 18 May, 2018 04:00полезное дополнение к скрипту - "подсказка" для вставки в текст слов (ключевых слов языка или имена полей/пропертей таблиц). Первый маленький скрипт на эту тему я сделал
...
А в вашей системе LuaCheck есть практически вся информация, необходимая для выдачи подсказок (в т.ч и информация о видимости переменных)
В ближайшее время я не планирую включать такое дополнение в пакет, но вы вполне можете развивать свой скрипт, "эксплуатируя" данные LuaCheck (удобнее будет в отдельной теме).
buniak_a_h wrote: Fri 18 May, 2018 04:00Требует установки плагина LuaFAR for Editor
Рекомендую использовать LuaMacro-версии: viewtopic.php?f=60&t=10954, viewtopic.php?f=60&t=10315

Кроме того, существует и независимая от LuaFAR реализация, Editor_WordComplete: viewtopic.php?f=60&t=7075
(если не верите, что это - удобно)]
Конечно верю, сам хотел написать такой скрипт.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by buniak_a_h »

John Doe wrote: Fri 18 May, 2018 08:39 Рекомендую использовать LuaMacro-версию: viewtopic.php?f=60&t=10954

Кроме того, существует и независимая от LuaFAR реализация, Editor_WordComplete
Возможно, я неточно описал то, что делает мой макрос...
В отличие от плагина WordComlete и указанного Вами макроса, мой не использует те слова, которые уже имеются в тексте! Правда, Word Comlete из пакета Rh_Scripts я не проверял, но есть у меня подозрение, что он делает тоже самое.
Мой:
(а) заточен на написание макросов на LUA (и, возможно, moon - не знаю) и
(б) для поиска не использует имеющийся текст, а берёт список keywords из Вашего модуля, а также список доступных полей и пропертей таблицы _G (со всеми вложенными).
Это больше похоже на сервис IDE (например, в Delphi-7 настройка, включающая такой сервис, называется Code Insight -> Code completion). Дело за определением доступности имён переменных в конкретном контексте. Ваша LuaCheck это умеет делать совершенно точно (диагностирует же обращение к неопределённой переменной!). И это было бы кузяво - накладывать такой фильтр на список слов, поставляемых тем же WordComplete...
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Luacheck FAR scripts — статический анализатор для Lua/MoonScript

Post by buniak_a_h »

John Doe wrote: Fri 18 May, 2018 08:39 вы вполне можете развивать свой скрипт, "эксплуатируя" данные LuaCheck (удобнее будет в отдельной теме).
Воспользовался Вашим советом. LuaComplete - завершение слов макроса на LUA
Post Reply

Return to “Полезные макросы и скрипты”