Page 6 of 7

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

Posted: Tue 16 Jun, 2015 12:36
by John Doe
Luacheck это статический анализатор для Lua.
Luacheck может обнаруживать разнообразные проблемы, такие как использование неопределённых глобальных переменных, неиспользованные переменные и значения, доступ к неинициализированным переменным, недостижимый код и многое другое.

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

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

Требования:
  • FAR 3 не старше b4831
  • luacheck не ниже v0.19

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

Posted: Thu 26 Oct, 2017 09:04
by John Doe

Latest post of the previous page:

IgorZ wrote:
Thu 26 Oct, 2017 06:10
MacroComplete от 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

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

Posted: Thu 26 Oct, 2017 11:11
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". Авторская позиция понятна, но раз уж есть возможность иметь несколько конфигураций, почему бы не сделать и такой вариант?

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

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

В частности, напоминаю, что std это не единственный способ задать глобальные идентификаторы.

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

Posted: Thu 26 Oct, 2017 12:50
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 и далее сохраняется неизменной. Хотя лично меня вполне устроило бы старое поведение.

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

Posted: Thu 26 Oct, 2017 13:33
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-свойство).

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

Posted: Thu 26 Oct, 2017 13:39
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}
Но боюсь, это не то, чего вы хотели)

Развиваем мысль дальше:

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

Posted: Sat 28 Oct, 2017 16:59
by John Doe
Реализуя не связанную идею подошёл к вопросу с другой стороны: можно ведь дополнительно анализировать список, полученный от luacheck.
Так что заодно и ваше пожелание осуществил.

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

Posted: Fri 18 May, 2018 04:00
by buniak_a_h
Здравствуйте!
У меня предложение: сделать мелкое, но (как показал опыт) полезное дополнение к скрипту - "подсказка" для вставки в текст слов (ключевых слов языка или имена полей/пропертей таблиц). Первый маленький скрипт на эту тему я сделал; естественно, там много недоделок (не подставляются известные в контексте имена переменных, имена методов (например, запросить тип переменной и дать выбрать).
P/S. Я знаю о существовании скрипта WordComplee в пакете Rh_Scripts. НО! (а) Одна инструкция по установке осложняет даже ознакомление; (б) Требует установки плагина LuaFAR for Editor, а его функции во многом пересекаются (дублируют) то, что у меня реализовано скриптами, и сделано удобнее (и гибче, т.к. доступен текст). От этого плагина мне (ПОКА) пришлось отказаться.. (в) да и вообще - не хочется устанавливать ещё один плагин, если вопрос решается скриптом. А в вашей системе LuaCheck есть практически вся информация, необходимая для выдачи подсказок (в т.ч и информация о видимости переменных) .

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

Posted: Fri 18 May, 2018 08:39
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
(если не верите, что это - удобно)]
Конечно верю, сам хотел написать такой скрипт.

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

Posted: Fri 18 May, 2018 11:16
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...

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

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

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

Posted: Tue 22 May, 2018 12:57
by HaRT
1. В название файла luaсheck_far_v1.4.7z, вложенного в заглавное сообщение, вскралась кириллическая ‘с’.

2. Распаковал все файлы в папку Scripts, открыл lua-файл в редакторе, вызвал LuaCheck, в меню с сообщениями нажал F1. Файл luacheck_editor.lua лежит рядом с luacheck_far.ru.hlf, язык Справки “Russian (Русский)”. ЧЯДНТ?

3. Если нажать F1 из кратковременного серенького окошка No warnings (где, между прочим, F1 фигурирует в числе доступных клавиш), то почему-то открывается Help - BufferScroll. :shock:

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

Posted: Tue 22 May, 2018 13:31
by John Doe
> Requested help topic not found: Editor

В редакторе откройте файл справки и поищите раздел @Editor
Если не найдёте, значит ваш файл не соответствует тому, что в шапке.

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

Posted: Tue 22 May, 2018 13:38
by HaRT
John Doe wrote:
Tue 22 May, 2018 13:31
поищите раздел @Editor
из того же, архива, что и скрипты, раздел @Editor там, разумеется, есть. Может ли дело быть в том, что у меня язык Фара английский, а язык Справки — русский?

P.S.
4. Также неплохо бы включить в Справку описание клавиши CtrlPgDn (как возврат после CtrlPgUp).

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

Posted: Tue 22 May, 2018 14:41
by John Doe
На днях обновлю весь архив, а пока прилагаю свой luacheck_far.ru.hlf.
HaRT wrote:
Tue 22 May, 2018 13:38
Также неплохо бы включить в Справку описание клавиши CtrlPgDn (как возврат после CtrlPgUp).
А нет такой функциональности.
Вместо "возврата" следует вернуться на выбранный пункт списка, возможно при нажатии CtrlPgDn генерируется соответствующее событие, но это не более чем совпадение, справедливое и для каких-то других комбинаций.

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

Posted: Tue 22 May, 2018 15:05
by HaRT
John Doe wrote:
Tue 22 May, 2018 14:41
На днях обновлю весь архив, а пока прилагаю свой luacheck_far.ru.hlf.
Спасибо, однако в плане вызова из редактора ничего не изменилось — ни из списка предупреждений, ни из окна об их отсутствии.
John Doe wrote:
Tue 22 May, 2018 14:41
возможно при нажатии CtrlPgDn генерируется соответствующее событие
Тогда это очень ценный побочный эффект, который надо беречь, потому что иногда нажимаешь CtrlPgUp и понимаешь, что хочется перейти всё-таки по основному месту. И вот тут непонятно, как вернуться, особенно если в списке единственный элемент.

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

Posted: Tue 22 May, 2018 15:18
by John Doe
HaRT wrote:
Tue 22 May, 2018 15:05
Тогда это очень ценный побочный эффект
Посмотрел, всё-таки не побочный эффект.
В разделе @EditorMore сказано
...чтобы синхронизировать позицию редактора с текущим предупреждением можно
воспользоваться #Ctrl-Enter#...
А в коде к этому добавлены ещё и клавиши CtrlPgDn CtrlNum3 Ctrl3
HaRT wrote:
Tue 22 May, 2018 15:05
в плане вызова из редактора ничего не изменилось — ни из списка предупреждений, ни из окна об их отсутствии.
Ну тогда пробуйте luacheck_editor.lua