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

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

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

Post by John Doe »

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

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

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

Требования:
  • FAR 3 не старше b5106
  • luacheck не ниже v0.19
Attachments
luaсheck_far_v1.4.3.7z
far5505.lm712
(23.38 KiB) Downloaded 89 times
Last edited by John Doe on Sat 09 Nov, 2019 16:08, edited 3 times in total.
buniak_a_h
Posts: 2095
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 207 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: 12888
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 295 times

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

Post by John Doe »

Конечно нужен
https://t.me/FarManager — Telegram чат
buniak_a_h
Posts: 2095
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 207 times
Contact:

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

Post by buniak_a_h »

Вот скрипт (не маерос - выполняется просто по lua:@…
DrawTree.lua.7z
(1.9 KiB) Downloaded 24 times
  1. local F = far.Flags
  2. ----[[*D*]]local TabUtils=require"Bax.TabUtils"
  3. ----[[*D*]]local TabToStr=TabUtils.TableToString
  4. --[[*D*]]local le=require"le"
  5. ------------------------------------------------------
  6. local function ListSubdirs(Root)
  7.  local FromRoot = Root:match('^[a-zA-Z]:%\\$')
  8.  local lenRoot = FromRoot and 4 or ( Root:len() + (Root:sub(-1)=='\\' and 1 or 2) )
  9.  local PanItems = {}
  10.  local function AddOneDir(FF,f)
  11.   FF.FileName = f:sub(lenRoot)
  12.   table.insert(PanItems, FF)
  13.  end
  14.  far.RecursiveSearch(Root, "*.*>>d", AddOneDir, bor(F.FRS_RECUR, F.FRS_NONE))
  15.  table.sort(PanItems, function(a1,a2) return a1.FileName:gsub('\\','\1') < a2.FileName:gsub('\\','\1') end)
  16.  return PanItems
  17. end -- ListSubdirs
  18. ------------------------------------------------------
  19. local function ListArchive(Root)
  20.  local PanItems = {}
  21.  local hf = io.popen('7z.exe l "'..Root..'"')
  22.  if hf then
  23.   local function StrDateTimeToFileTime(s)
  24.    -- wDay=8;wMonth=4,wYear=2020,wHour=0,wMinute=36;wSecond=16
  25.    local ftime={wYear=tonumber(s:sub(1,4));
  26.                 wMonth=tonumber(s:sub(6,7));
  27.                 wDay=tonumber(s:sub(9,10));
  28.                 wHour=tonumber(s:sub(12,13));
  29.                 wMinute=tonumber(s:sub(15,16));
  30.                 wSecond=tonumber(s:sub(18,19))
  31.                }
  32.    return win.SystemTimeToFileTime(ftime)
  33.   end
  34.   local bNeed = false
  35.   for l in hf:lines() do
  36.    l = win.OemToUtf8(l)
  37.    if l == '------------------- ----- ------------ ------------  ------------------------' then
  38.     if bNeed then break else bNeed = true end
  39.    elseif bNeed then
  40.     if l:sub(21,25):match"D" then
  41.      local FTime=StrDateTimeToFileTime(l)
  42.      PanItems[#PanItems+1] = {FileName=l:sub(54); FileAttributes='dc'; LastAccessTime=FTime; LastWriteTime=FTime}
  43.     end
  44.    end -- bNeed
  45.   end -- for l
  46.   hf:close()
  47.  end -- if hf
  48.  return PanItems
  49.  --far.Message('Не готово','Tree',nil,'w')
  50. end
  51. ------------------------------------------------------
  52. local function Tree(PanItems)
  53.  local aTree, i_Tree = {SubTree={}}, {} -- Древовидная структура и индекс для ускорения поиска
  54.  -----------------------------------------------------
  55.  local function AddDir(i)
  56.   local Source = PanItems[i]
  57.   local fName = Source.FileName .. '\\' --fName .. '\\'
  58.   local FullName=''
  59.   local Parent = aTree
  60.   for w in fName:gmatch("([^%\\]*)%\\") do -- Последний каталог войдёт
  61.    FullName = FullName .. ((FullName:sub(-1)=='\\' or FullName == '') and '' or '\\') .. w
  62.    if i_Tree[FullName] then
  63.     Parent = i_Tree[FullName]
  64.    else
  65.     local NewItem = {FileName=FullName; SubTree={}; Source=Source}
  66.     table.insert(Parent.SubTree, NewItem)
  67.     i_Tree[FullName] = NewItem
  68.    end
  69.   end
  70.  end -- AddDir
  71.  -----------------------------------------------------
  72.  for i=1, #PanItems do
  73.   AddDir(i)
  74.  end
  75.  
  76.  -- Собственно составление дерева
  77.  
  78.  ----[[*D*]]local StrTree={} -- Для вывода на экран
  79.  local function Tree1Dir(OneDir, Last, sPref)
  80.   local ThisPref, NextPref
  81.   if not Last then
  82.    ThisPref, NextPref = sPref .. '├───', sPref .. '│   '
  83.   else
  84.    ThisPref, NextPref = sPref .. '└───', sPref .. '    '
  85.   end
  86.   OneDir.ShowDir = ThisPref .. mf.fsplit(OneDir.FileName, 12)
  87.   OneDir.Source.ShowDir = OneDir.ShowDir
  88.   if OneDir.SubTree then
  89.    for i=1, #OneDir.SubTree do
  90.     Tree1Dir(OneDir.SubTree[i], i==#OneDir.SubTree, NextPref)
  91.    end
  92.   end
  93.  end
  94.  
  95.  for i,v in ipairs(aTree.SubTree) do
  96.   Tree1Dir(v, i==#aTree.SubTree, '')
  97.  end
  98.  
  99.  return aTree
  100.  
  101. end -- function Tree
  102.  
  103. ------------------------------------------------------
  104.  
  105. local Root = far.InputBox(nil, 'Дерево', 'Введите имя корня', nil,
  106.          ----[[C:\Users\PC\AppData\Roaming\Far Manager\Profile\Macros\Bax.Test\Tree\200309\Test.7z]],
  107.              [[C:\Users\PC\AppData\Roaming\Far Manager\Profile\Macros\Bax.Test\Tree]],
  108.          ----[[C:\Users\PC\AppData\Roaming\Far Manager\Profile\Macros\Bax.Test\Tree\200309\Test.Тест\Test\Test2\Test2_1]],
  109.              nil,nil,bor(F.FIB_EDITPATH, F.FIB_EXPANDENV) )
  110. if not Root then return end
  111. if not win.GetFileAttr(Root) then return end
  112. local PanItems
  113. if win.GetFileAttr(Root):find'd' then
  114.  PanItems = ListSubdirs(Root)
  115. else
  116.  PanItems = ListArchive(Root)
  117. end
  118.  
  119. local aTree = Tree(PanItems)
  120.  
  121.  
  122. --*D* {
  123. le(aTree, '123: aTree')
  124. do
  125.  local hf=io.open('deb.tree.lua', 'w')
  126.  if hf then
  127.   local qqq=mf.serialize(aTree)
  128.   hf:write(qqq)
  129.   hf:close()
  130.  end
  131. end
  132. local aDeb={Root}
  133. local function DrawSubTree(Node)
  134.  table.insert(aDeb, Node.ShowDir)
  135.  for _,v in ipairs(Node.SubTree) do
  136.   DrawSubTree(v)
  137.  end
  138. end -- function DrawSubTree
  139. for _,v in ipairs(aTree.SubTree) do
  140.  DrawSubTree(v)
  141. end
  142. far.Show(table.concat(aDeb, '\n'))
  143. --*D* }
  144.  
buniak_a_h
Posts: 2095
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 207 times
Contact:

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

Post by buniak_a_h »

Добавлю.
На самом деле проверка ничего, кроме красного сообщения об ошибке, не выводит. Т.е. вроде как находит ошибку, но ничего о ней не говорит. То, что я процитировал в моём сообщении - это я вставил в модуль вывод аргумента вызова функции error
User avatar
John Doe
Бюрократ
Posts: 12888
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 295 times

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: 12888
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 295 times

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 чат
buniak_a_h
Posts: 2095
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 207 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: 12888
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 295 times

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

Post by John Doe »

Нужен скрин списка предупреджений, который выдаётся скриптом штатно.
Т.е. возьмите для проверки любой другой файл с макросами (на котором скрипт не падает).
https://t.me/FarManager — Telegram чат
buniak_a_h
Posts: 2095
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 207 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: 9561
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 111 times
Been thanked: 232 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: 12888
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 295 times

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

Post by John Doe »

1. Прежде всего используйте приведённое выше временное решение.
2. Убедитесь, что в некоторых случаях смещения тображаются неверно (например в случае вашего DrawTree.lua - за пределами строки)
3. Попробуйте обновить библиотеку по ссылке приведённой выше.
Я ещё не пробовал, поэтому не гарантирую что проблем не будет.
4. Сравните результат.
https://t.me/FarManager — Telegram чат
buniak_a_h
Posts: 2095
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 207 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 в буфер. Поздно сообразил. Ещё надо?
buniak_a_h
Posts: 2095
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 207 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: 12888
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 295 times

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

Post by John Doe »

Значит ничего не делайте.
Долго объяснять то что в справке и так сказано.
А с новой библиотекой я проверю сам когда-нибудь.
https://t.me/FarManager — Telegram чат
buniak_a_h
Posts: 2095
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 207 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: 6167
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 330 times

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

Post by Shmuel »

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

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