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

Здесь выкладываются готовые к использованию макросы и скрипты.
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
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 »

Latest post of the previous page:

Версия ФАР начтная с 5580.
Скрипт - последний из шапки.
При проверке синтаксиса скрипт падает.
Путём вывода сообщений получено место: модуль check.lua, функция error.
Сообщение, которое туда приходит (на моём скрипте):

Code: Select all

 ...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:60: invalid UTF-8 code
 stack traceback:
 	...ng\Far Manager\Profile\Macros\modules\luacheck\utils.lua:186: in function <...ng\Far Manager\Profile\Macros\modules\luacheck\utils.lua:182>
 	[C]: in function 'token_body_or_line'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:60: in function 'skip_token'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:181: in function 'parse_id'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:359: in function 'parse_simple_expression'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:449: in function 'parse_subexpression'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:472: in function 'parse_expression'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:171: in function 'parse_expression_list'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:645: in function 'parse_statement'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:723: in function 'parse_block'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:284: in function 'parse_function'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:594: in function 'parse_statement'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:723: in function 'parse_block'
 	...g\Far Manager\Profile\Macros\modules\luacheck\parser.lua:752: in function 'parse'
 	...ng\Far Manager\Profile\Macros\modules\luacheck\check.lua:230: in function <...ng\Far Manager\Profile\Macros\modules\luacheck\check.lua:229>
 	[C]: in function 'try'
 	...ng\Far Manager\Profile\Macros\modules\luacheck\check.lua:258: in function 'get_report'
 	...ing\Far Manager\Profile\Macros\modules\luacheck\init.lua:101: in function 'check_strings'
 	...file\Macros\scripts\luacheck_scripts\luacheck_editor.lua:611: in function <...file\Macros\scripts\luacheck_scripts\luacheck_editor.lua:566>
В версии ФАР-а ранее 5580 ошибки не было. Файл - в кодировке UTF-8, набран во встроенном редакторе ФАР-а.
Совет из предыдущего Вашего сообщения не помогает.
Что делать, шеф? ©Лёлик
--
P/S. Пример проверяемого скрипта нужен? Он, кстати, рабочий!
Last edited by buniak_a_h on Tue 14 Apr, 2020 16:45, 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 »

Конечно нужен
https://t.me/FarManager — Telegram чат
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 »

Вот скрипт (не маерос - выполняется просто по lua:@…
DrawTree.lua.7z
(1.9 KiB) Downloaded 117 times
  1. local F = far.Flags
  2.  
  3. ----[[*D*]]local TabUtils=require"Bax.TabUtils"
  4.  
  5. ----[[*D*]]local TabToStr=TabUtils.TableToString
  6.  
  7. --[[*D*]]local le=require"le"
  8.  
  9. ------------------------------------------------------
  10.  
  11. local function ListSubdirs(Root)
  12.  
  13.  local FromRoot = Root:match('^[a-zA-Z]:%\\$')
  14.  
  15.  local lenRoot = FromRoot and 4 or ( Root:len() + (Root:sub(-1)=='\\' and 1 or 2) )
  16.  
  17.  local PanItems = {}
  18.  
  19.  local function AddOneDir(FF,f)
  20.  
  21.   FF.FileName = f:sub(lenRoot)
  22.  
  23.   table.insert(PanItems, FF)
  24.  
  25.  end
  26.  
  27.  far.RecursiveSearch(Root, "*.*>>d", AddOneDir, bor(F.FRS_RECUR, F.FRS_NONE))
  28.  
  29.  table.sort(PanItems, function(a1,a2) return a1.FileName:gsub('\\','\1') < a2.FileName:gsub('\\','\1') end)
  30.  
  31.  return PanItems
  32.  
  33. end -- ListSubdirs
  34.  
  35. ------------------------------------------------------
  36.  
  37. local function ListArchive(Root)
  38.  
  39.  local PanItems = {}
  40.  
  41.  local hf = io.popen('7z.exe l "'..Root..'"')
  42.  
  43.  if hf then
  44.  
  45.   local function StrDateTimeToFileTime(s)
  46.  
  47.    -- wDay=8;wMonth=4,wYear=2020,wHour=0,wMinute=36;wSecond=16
  48.  
  49.    local ftime={wYear=tonumber(s:sub(1,4));
  50.  
  51.                 wMonth=tonumber(s:sub(6,7));
  52.  
  53.                 wDay=tonumber(s:sub(9,10));
  54.  
  55.                 wHour=tonumber(s:sub(12,13));
  56.  
  57.                 wMinute=tonumber(s:sub(15,16));
  58.  
  59.                 wSecond=tonumber(s:sub(18,19))
  60.  
  61.                }
  62.  
  63.    return win.SystemTimeToFileTime(ftime)
  64.  
  65.   end
  66.  
  67.   local bNeed = false
  68.  
  69.   for l in hf:lines() do
  70.  
  71.    l = win.OemToUtf8(l)
  72.  
  73.    if l == '------------------- ----- ------------ ------------  ------------------------' then
  74.  
  75.     if bNeed then break else bNeed = true end
  76.  
  77.    elseif bNeed then
  78.  
  79.     if l:sub(21,25):match"D" then
  80.  
  81.      local FTime=StrDateTimeToFileTime(l)
  82.  
  83.      PanItems[#PanItems+1] = {FileName=l:sub(54); FileAttributes='dc'; LastAccessTime=FTime; LastWriteTime=FTime}
  84.  
  85.     end
  86.  
  87.    end -- bNeed
  88.  
  89.   end -- for l
  90.  
  91.   hf:close()
  92.  
  93.  end -- if hf
  94.  
  95.  return PanItems
  96.  
  97.  --far.Message('Не готово','Tree',nil,'w')
  98.  
  99. end
  100.  
  101. ------------------------------------------------------
  102.  
  103. local function Tree(PanItems)
  104.  
  105.  local aTree, i_Tree = {SubTree={}}, {} -- Древовидная структура и индекс для ускорения поиска
  106.  
  107.  -----------------------------------------------------
  108.  
  109.  local function AddDir(i)
  110.  
  111.   local Source = PanItems[i]
  112.  
  113.   local fName = Source.FileName .. '\\' --fName .. '\\'
  114.  
  115.   local FullName=''
  116.  
  117.   local Parent = aTree
  118.  
  119.   for w in fName:gmatch("([^%\\]*)%\\") do -- Последний каталог войдёт
  120.  
  121.    FullName = FullName .. ((FullName:sub(-1)=='\\' or FullName == '') and '' or '\\') .. w
  122.  
  123.    if i_Tree[FullName] then
  124.  
  125.     Parent = i_Tree[FullName]
  126.  
  127.    else
  128.  
  129.     local NewItem = {FileName=FullName; SubTree={}; Source=Source}
  130.  
  131.     table.insert(Parent.SubTree, NewItem)
  132.  
  133.     i_Tree[FullName] = NewItem
  134.  
  135.    end
  136.  
  137.   end
  138.  
  139.  end -- AddDir
  140.  
  141.  -----------------------------------------------------
  142.  
  143.  for i=1, #PanItems do
  144.  
  145.   AddDir(i)
  146.  
  147.  end
  148.  
  149.  
  150.  
  151.  -- Собственно составление дерева
  152.  
  153.  
  154.  
  155.  ----[[*D*]]local StrTree={} -- Для вывода на экран
  156.  
  157.  local function Tree1Dir(OneDir, Last, sPref)
  158.  
  159.   local ThisPref, NextPref
  160.  
  161.   if not Last then
  162.  
  163.    ThisPref, NextPref = sPref .. '├───', sPref .. '│   '
  164.  
  165.   else
  166.  
  167.    ThisPref, NextPref = sPref .. '└───', sPref .. '    '
  168.  
  169.   end
  170.  
  171.   OneDir.ShowDir = ThisPref .. mf.fsplit(OneDir.FileName, 12)
  172.  
  173.   OneDir.Source.ShowDir = OneDir.ShowDir
  174.  
  175.   if OneDir.SubTree then
  176.  
  177.    for i=1, #OneDir.SubTree do
  178.  
  179.     Tree1Dir(OneDir.SubTree[i], i==#OneDir.SubTree, NextPref)
  180.  
  181.    end
  182.  
  183.   end
  184.  
  185.  end
  186.  
  187.  
  188.  
  189.  for i,v in ipairs(aTree.SubTree) do
  190.  
  191.   Tree1Dir(v, i==#aTree.SubTree, '')
  192.  
  193.  end
  194.  
  195.  
  196.  
  197.  return aTree
  198.  
  199.  
  200.  
  201. end -- function Tree
  202.  
  203.  
  204.  
  205. ------------------------------------------------------
  206.  
  207.  
  208.  
  209. local Root = far.InputBox(nil, 'Дерево', 'Введите имя корня', nil,
  210.  
  211.          ----[[C:\Users\PC\AppData\Roaming\Far Manager\Profile\Macros\Bax.Test\Tree\200309\Test.7z]],
  212.  
  213.              [[C:\Users\PC\AppData\Roaming\Far Manager\Profile\Macros\Bax.Test\Tree]],
  214.  
  215.          ----[[C:\Users\PC\AppData\Roaming\Far Manager\Profile\Macros\Bax.Test\Tree\200309\Test.Тест\Test\Test2\Test2_1]],
  216.  
  217.              nil,nil,bor(F.FIB_EDITPATH, F.FIB_EXPANDENV) )
  218.  
  219. if not Root then return end
  220.  
  221. if not win.GetFileAttr(Root) then return end
  222.  
  223. local PanItems
  224.  
  225. if win.GetFileAttr(Root):find'd' then
  226.  
  227.  PanItems = ListSubdirs(Root)
  228.  
  229. else
  230.  
  231.  PanItems = ListArchive(Root)
  232.  
  233. end
  234.  
  235.  
  236.  
  237. local aTree = Tree(PanItems)
  238.  
  239.  
  240.  
  241.  
  242.  
  243. --*D* {
  244.  
  245. le(aTree, '123: aTree')
  246.  
  247. do
  248.  
  249.  local hf=io.open('deb.tree.lua', 'w')
  250.  
  251.  if hf then
  252.  
  253.   local qqq=mf.serialize(aTree)
  254.  
  255.   hf:write(qqq)
  256.  
  257.   hf:close()
  258.  
  259.  end
  260.  
  261. end
  262.  
  263. local aDeb={Root}
  264.  
  265. local function DrawSubTree(Node)
  266.  
  267.  table.insert(aDeb, Node.ShowDir)
  268.  
  269.  for _,v in ipairs(Node.SubTree) do
  270.  
  271.   DrawSubTree(v)
  272.  
  273.  end
  274.  
  275. end -- function DrawSubTree
  276.  
  277. for _,v in ipairs(aTree.SubTree) do
  278.  
  279.  DrawSubTree(v)
  280.  
  281. end
  282.  
  283. far.Show(table.concat(aDeb, '\n'))
  284.  
  285. --*D* }
  286.  
  287.  
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 »

Добавлю.
На самом деле проверка ничего, кроме красного сообщения об ошибке, не выводит. Т.е. вроде как находит ошибку, но ничего о ней не говорит. То, что я процитировал в моём сообщении - это я вставил в модуль вывод аргумента вызова функции error
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 »

Временное решение: local ConvertToAnsi = false.
При этом в некоторых случаях строковые позиции могут расходиться с реальными (https://github.com/mpeterv/luacheck/issues/45).
Посмотрю что можно сделать.
https://t.me/FarManager — Telegram чат
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, а покажите версии, которые отображаются в заголовке списка предупреждений.
John Doe wrote: Wed 15 Apr, 2020 08:42 При этом в некоторых случаях строковые позиции могут расходиться с реальными (https://github.com/mpeterv/luacheck/issues/45).
Это было "исправлено" в последнем доступном релизе (https://github.com/mpeterv/luacheck/releases).
Совместимо ли это с нашим окружением я ещё не проверял.
https://t.me/FarManager — Telegram чат
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 »

Я, наверно, как всегда не владею терминологией.Что такое "список предупреждений" и где там версии?
На всякий случай присылаю то, что выводит luacheck без моих доделок (я добавил только строчку
--[[*D*]]far.Show('check.lua.272: before error', res)
непосредственно перед вызовом error(res, 0))

Code: Select all

╔════════════════════════════════════════════════ LuaMacro ════════════════════════════════════════════════╗
║ (error object is not a string)                                                                           ║
║ stack traceback:                                                                                         ║
║    [C]: in function 'error'                                                                              ║
║    E:\FarPort\Profile\Macros\modules\luacheck\check.lua:273: in function 'get_report'                    ║
║    E:\FarPort\Profile\Macros\modules\luacheck\init.lua:101: in function 'check_strings'                  ║
║    ...file\Macros\scripts\luacheck_scripts\luacheck_editor.lua:611: in function <...file\Macros\scripts\ ║
║ luacheck_scripts\luacheck_editor.lua:566>                                                                ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║                                                  { OK }                                                  ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════╝
P/S. Вот только что обновился до версии 5586 (плагином Update). Вылет остался
Last edited by buniak_a_h on Wed 15 Apr, 2020 10:39, 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 »

Нужен скрин списка предупреджений, который выдаётся скриптом штатно.
Т.е. возьмите для проверки любой другой файл с макросами (на котором скрипт не падает).
https://t.me/FarManager — Telegram чат
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 »

1. Н один МОЙ файл не проходит проверки (кошмар!)
2. Пробовал на искаробочном AltMenu.lua
3. Проблемы были со штатным liaCheck-ом: в символьном виде снять экран мне не удалось без крупных переделок (там mf.waitkwey стоит, который снимает вывеску, что ошибок нет. Посему
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

buniak_a_h wrote: Wed 15 Apr, 2020 10:59в символьном виде снять экран мне не удалось
Есть же штатные средства консоли.
Фар есть инструмент, а не нянька. © 2009 DrKnS
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 »

1. Прежде всего используйте приведённое выше временное решение.
2. Убедитесь, что в некоторых случаях смещения тображаются неверно (например в случае вашего DrawTree.lua - за пределами строки)
3. Попробуйте обновить библиотеку по ссылке приведённой выше.
Я ещё не пробовал, поэтому не гарантирую что проблем не будет.
4. Сравните результат.
https://t.me/FarManager — Telegram чат
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 »

1. Не успевал
2. Заменил на бессрочное mf.waitkey - получилось что-то совершенно кошмарное. Одна строка длиной .... Даже и не знаю. Ну, в общем, не получилось.
3. Можно было просто в строке

Code: Select all

far.Message(msg,title or "","",flags)
занести title в буфер. Поздно сообразил. Ещё надо?
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: Wed 15 Apr, 2020 11:27 1. Прежде всего используйте приведённое выше временное решение.
Помогло - ошибок не найдено, вылета тоже нет.
John Doe wrote: Wed 15 Apr, 2020 11:27 2. Убедитесь, что в некоторых случаях смещения отображаются неверно (например в случае вашего DrawTree.lua - за пределами строки)
А где они (смещения) должны отображаться? Ошибок не найдено…
John Doe wrote: Wed 15 Apr, 2020 11:27 3. Попробуйте обновить библиотеку по ссылке приведённой выше.
Я ещё не пробовал, поэтому не гарантирую что проблем не будет.
Вы не написали, что оттуда брать. Если luacheck.exe, то что с ним делать, куда записать. Тот вылет, что я Вам присылал, получен на установленном с нуля ФАРе, там этой программы (luacheck.exe) вообще нет.
John Doe wrote: Wed 15 Apr, 2020 11:27 4. Сравните результат.
См. п. 1 .
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 »

Значит ничего не делайте.
Долго объяснять то что в справке и так сказано.
А с новой библиотекой я проверю сам когда-нибудь.
https://t.me/FarManager — Telegram чат
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 »

2. Если имеется в виду смещение, отображаемое в статусной строке редактора - как Вы себе такую проверку представляете? Вставать на конец строки и считать символы - соответствует ли? Для всех строк? Проверил на 5-6 - нет расхождения старого и нового FAR-ов (считать я, есессно, не стал).
3. программа luacheck.exe совпадает с той, что у меня.
1. Ничего не делаю - дома сижу. :blum:
Last edited by buniak_a_h on Wed 15 Apr, 2020 12:29, edited 1 time in total.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

На случай, если об этом ещё не сообщалось:
Версия библиотеки 0.23.0 правильно определяет номера колонок при формировании строки ошибки, с учётом UTF-8. Более ранние версии дают смещение в байтах.
Post Reply

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