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

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
John Doe
Бюрократ
Posts: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 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 87 times
Last edited by John Doe on Sat 09 Nov, 2019 16:08, edited 3 times in total.
User avatar
John Doe
Бюрократ
Posts: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

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

Post by John Doe »

Latest post of the previous page:

готового luajit.exe не нашёл. Что посоветуете?
А в справке не указано? Был в репозитории фара, кажется.
Last edited by John Doe on Fri 08 Nov, 2019 18:25, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

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

Post by John Doe »

Версия значения особого не имеет, т.к. предполагается что DLL будут подхвачены те, что используются фаром.
citRiks
Posts: 807
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 256 times
Been thanked: 46 times

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

Post by citRiks »

John Doe wrote: Fri 08 Nov, 2019 17:48
готового luajit.exe не нашёл. Что посоветуете?
А в справке не указано? Был в репозитории фара, кажется
Ссылка в справке указана. Но самое большее, что я по ней нашёл, это "No results found".
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
skipik
Posts: 205
Joined: Wed 03 Jun, 2015 15:24
Has thanked: 33 times
Been thanked: 22 times

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

Post by skipik »

HaRT wrote: Fri 08 Nov, 2019 16:56 Спасибо. А какая это конкретно версия LuaJit и какой версией компилятора собрана?
Не могу точно сказать, нашёл на пк в архивах. Но, судя по "linker version 2.27", собрано в GCC.
User avatar
John Doe
Бюрократ
Posts: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

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

Post by John Doe »

1.4.3
- обновление списка идентификаторов в соответствии с окружением, доступным в far 5505.
- учитывается package.nounload
- коррекция ссылок в справке
- исправления в обработке необъявленных переменных
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

Почему-то выдаётся диагностика:

Code: Select all

accessing undefined field 'BeginSelection' of global 'panel'
accessing undefined field 'EndSelection' of global 'panel'
Такие функции в таблице panel имеются. И даже описание есть. Что делать, шеф? Усё пропало!©
User avatar
John Doe
Бюрократ
Posts: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

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

Post by John Doe »

buniak_a_h wrote: Thu 21 Nov, 2019 22:57 Что делать, шеф?
Убедиться что версия скрипта соответствует выложенной в шапке.
buniak_a_h
Posts: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

Версия ФАР начтная с 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: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

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

Post by John Doe »

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

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

Post by buniak_a_h »

Вот скрипт (не маерос - выполняется просто по lua:@…
DrawTree.lua.7z
(1.9 KiB) Downloaded 20 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: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 times
Contact:

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

Post by buniak_a_h »

Добавлю.
На самом деле проверка ничего, кроме красного сообщения об ошибке, не выводит. Т.е. вроде как находит ошибку, но ничего о ней не говорит. То, что я процитировал в моём сообщении - это я вставил в модуль вывод аргумента вызова функции error
User avatar
John Doe
Бюрократ
Posts: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 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: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 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: 2044
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 129 times
Been thanked: 200 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: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

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

Post by John Doe »

Нужен скрин списка предупреджений, который выдаётся скриптом штатно.
Т.е. возьмите для проверки любой другой файл с макросами (на котором скрипт не падает).
https://t.me/FarManager — Telegram чат
Post Reply

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