From 2cb6ff0315ad6670d12f1904002cb6dcf3277dbc Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Mon, 24 Jun 2019 21:16:46 +0800 Subject: [PATCH 001/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86getInfo?= =?UTF-8?q?=E7=9A=84=E4=BF=A1=E6=81=AF=EF=BC=8C=E4=BE=BF=E4=BA=8E=E5=AE=9A?= =?UTF-8?q?=E4=BD=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 93 ++++++++++++++++++++++++++++++------------- 1 file changed, 66 insertions(+), 27 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 1f3399b..b4c5aac 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -23,7 +23,7 @@ API: 用户可以调用或在调试控制台中输出这个函数,返回帮助设置CWD的路径。比如 cwd: F:/1/2/3/4/5 getinfo: @../../../../../unreal_10/slua-unreal_1018/Content//Lua/TestArray.lua - format: F:/unreal_10/slua-unreal_1018/Content/Lua/TestArray.lua + format: f:/unreal_10/slua-unreal_1018/Content/Lua/TestArray.lua cwd是vscode传来的配置路径。getinfo是通过getinfo获取到的正在运行的文件路径。format是经过 cwd + getinfo 整合后的格式化路径。 format是传给VSCode的最终路径。 如果format路径和文件真实路径不符,导致VSCode找不到文件,通过调整工程中launch.json的cwd,使format路径和真实路径一致。 @@ -44,7 +44,7 @@ local consoleLogLevel = 2; --打印在控制台(print)的日志等级a local connectTimeoutSec = 0.005; --等待连接超时时间, 单位s. 时间过长等待attach时会造成卡顿,时间过短可能无法连接。建议值0.005 - 0.05 --用户设置项END -local debuggerVer = "2.1.0"; --debugger版本号 +local debuggerVer = "2.1.1"; --debugger版本号 LuaPanda = {}; local this = LuaPanda; local tools = require("DebugTools"); --引用的开源工具,包括json解析和table展开工具 @@ -119,6 +119,10 @@ local stopConnectTime = 0; --用来临时记录stop断开连接的时间 local isInMainThread; local receiveMsgTimer = 0; local pathFormatCache = {}; +--VSCodeSetting +local stopOnEntry; +local loadclibErrReason = 'launch.json 文件中,配置项 useCHook 被设置为 false.'; + --5.1/5.3兼容 if _VERSION == "Lua 5.1" then debugger_loadString = loadstring; @@ -272,12 +276,16 @@ function this.getCWD() end --返回版本号等配置 -function this.getInfo() +function this.getBaseInfo() local retStr = "Lua Ver:" .. _VERSION .." | Debugger Ver:"..tostring(debuggerVer); + local moreInfoStr = ""; if hookLib ~= nil then local clibVer, forluaVer = hookLib.sync_getLibVersion(); local clibStr = forluaVer ~= nil and tostring(clibVer) .. " for " .. tostring(math.ceil(forluaVer)) or tostring(clibVer); retStr = retStr.. " | hookLib Ver:" .. clibStr; + moreInfoStr = moreInfoStr .. "说明: 已加载 libpdebug 库."; + else + moreInfoStr = moreInfoStr .. "说明: 未能加载 libpdebug 库。原因是 ".. loadclibErrReason; end local outputIsUseLoadstring = false @@ -285,8 +293,37 @@ function this.getInfo() outputIsUseLoadstring = true; end - retStr = retStr .." | supportREPL:".. tostring(outputIsUseLoadstring); - retStr = retStr .." | attachMode:".. tostring(openAttachMode); + retStr = retStr .. " | supportREPL:".. tostring(outputIsUseLoadstring); + retStr = retStr .. " | codeEnv:" .. OSType .. '\n'; + retStr = retStr .. moreInfoStr; + return retStr; +end + +--返回一些信息,帮助用户定位问题 +function this.getInfo() + --用户设置项 + local retStr = "\n--- Base Info ---\n"; + retStr = retStr .. this.getBaseInfo(); + --已经加载C库,x86/64 未能加载,原因 + retStr = retStr .. "\n--- User Setting ---\n"; + retStr = retStr .. "stopOnEntry:" .. tostring(stopOnEntry) .. ' | ' ; + -- retStr = retStr .. "luaFileExtension:" .. luaFileExtension .. ' | ' ; + retStr = retStr .. "logLevel:" .. logLevel .. ' | ' ; + retStr = retStr .. "pathCaseSensitivity:" .. pathCaseSensitivity .. ' | ' ; + retStr = retStr .. "attachMode:".. tostring(openAttachMode).. ' | ' ; + + if hookLib ~= nil then + retStr = retStr .. "useCHook:true"; + else + retStr = retStr .. "useCHook:false"; + end + + --此处记录 + retStr = retStr .. "\n--- Path Info ---\n"; + retStr = retStr .. "clibPath: " .. clibPath .. '\n'; + retStr = retStr .. this.getCWD(); + retStr = retStr .. "\n--- Breaks Info ---\n"; + retStr = retStr .. this.printTable(this.getBreaks()) .. '\n'; return retStr; end @@ -310,13 +347,17 @@ function this.tryRequireClib(libName , libPath) this.printToVSCode("tryRequireClib success : [" .. libName .. "] in "..libPath); return true; else + loadclibErrReason = "tryRequireClib fail : require success, but member function num <= 0; [" .. libName .. "] in "..libPath; this.printToVSCode("tryRequireClib fail : require success, but member function num <= 0; [" .. libName .. "] in "..libPath); hookLib = nil; return false; end else -- 此处考虑到tryRequireClib会被调用两次,日志级别设置为0,防止输出不必要的信息。 - this.printToVSCode("[Require clib error]: " .. err, 0); + if not string.match(err, "%%1 is not a valid Win32 application") then + loadclibErrReason = err; + this.printToVSCode("[Require clib error]: " .. err, 0); + end end package.cpath = save_cpath; return false @@ -656,9 +697,7 @@ function this.dataProcess( dataStr ) local msgTab = this.getMsgTable("setBreakPoint", this.getCallbackId()); this.sendMsg(msgTab); -- 打印调试信息 - this.printToVSCode("LuaPanda.getInfo()\n" .. LuaPanda.getInfo()) - this.printToVSCode("LuaPanda.getCWD()\n" .. LuaPanda.getCWD()) - this.printToVSCode("LuaPanda.getBreaks()\n" .. tools.serializeTable(LuaPanda.getBreaks())); + this.printToVSCode("LuaPanda.getInfo()\n" .. this.getInfo()) this.debugger_wait_msg(); elseif dataTable.cmd == "setVariable" then if currentRunState == runState.STOP_ON_ENTRY or @@ -824,6 +863,7 @@ function this.dataProcess( dataStr ) msgTab.info = tab; this.sendMsg(msgTab); --上面getBK中会判断当前状态是否WAIT_CMD, 所以最后再切换状态。 + stopOnEntry = dataTable.info.stopOnEntry; if dataTable.info.stopOnEntry == "true" then this.changeRunState(runState.STOP_ON_ENTRY); --停止在STOP_ON_ENTRY再接收breaks消息 else @@ -1121,27 +1161,21 @@ function this.getPath( info ) end --拼路径 - --若在Mac下以/开头,或者在Win下以*:开头,说明是绝对路径,不需要再拼。直接返回 - if filePath:sub(1,1) == [[/]] then - return this.genUnifiedPath(filePath); - end - - if filePath:sub(1,2):match("%a:") then - return this.genUnifiedPath(filePath); - end - - --需要拼接 local retPath = filePath; - if cwd ~= "" then - --查看filePath中是否包含cwd - local matchRes = string.find(filePath, cwd, 1, true); - if matchRes == nil then - retPath = cwd.."/"..filePath; + --若在Mac下以/开头,或者在Win下以*:开头,说明是绝对路径,不需要再拼。 + if filePath:sub(1,1) == [[/]] or filePath:sub(1,3):match("^.:/") then + + else + --需要拼接 + if cwd ~= "" then + --查看filePath中是否包含cwd + local matchRes = string.find(filePath, cwd, 1, true); + if matchRes == nil then + retPath = cwd.."/"..filePath; + end end - --检查一下是否出现/./ - retPath = this.genUnifiedPath(retPath); end - + retPath = this.genUnifiedPath(retPath); --放入Cache中缓存 this.setPathToCache(originalPath, retPath); return retPath; @@ -1391,6 +1425,11 @@ function this.debug_hook(event, line) info = debug.getinfo(co, 2, "Slf") end info.event = event; + + if string.match(info.source, "^.:/") then + info.source = info.source:gsub("^.:/", string.upper); + end + this.real_hook_process(info); end From 550fa7d85580a72467092471dd209f4137a13f77 Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Mon, 24 Jun 2019 21:40:45 +0800 Subject: [PATCH 002/431] update --- Debugger/LuaPanda.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index b4c5aac..7c8a993 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -107,6 +107,8 @@ local pathCaseSensitivity = 1; --路径是否发大小写敏感,这个选项 local recvMsgQueue = {}; --接收的消息队列 local coroutinePool = {}; --保存用户协程的队列 local winDiskSymbolUpper = false;--设置win下盘符的大小写。以此确保从VSCode中传入的断点路径,cwd和从lua虚拟机获得的文件路径盘符大小写一致 +local stopOnEntry; +local loadclibErrReason = 'launch.json 文件中,配置项 useCHook 被设置为 false.'; --Step控制标记位 local stepOverCounter = 0; --STEPOVER over计数器 local stepOutCounter = 0; --STEPOVER out计数器 @@ -119,9 +121,6 @@ local stopConnectTime = 0; --用来临时记录stop断开连接的时间 local isInMainThread; local receiveMsgTimer = 0; local pathFormatCache = {}; ---VSCodeSetting -local stopOnEntry; -local loadclibErrReason = 'launch.json 文件中,配置项 useCHook 被设置为 false.'; --5.1/5.3兼容 if _VERSION == "Lua 5.1" then From c2b238fd0013bb3d9cf5167f2929cb39bb67bcd3 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Mon, 24 Jun 2019 22:38:59 +0800 Subject: [PATCH 003/431] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86Debugger?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 7c8a993..0132b96 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -301,10 +301,10 @@ end --返回一些信息,帮助用户定位问题 function this.getInfo() --用户设置项 - local retStr = "\n--- Base Info ---\n"; + local retStr = "\n- Base Info: \n"; retStr = retStr .. this.getBaseInfo(); --已经加载C库,x86/64 未能加载,原因 - retStr = retStr .. "\n--- User Setting ---\n"; + retStr = retStr .. "\n\n- User Setting: \n"; retStr = retStr .. "stopOnEntry:" .. tostring(stopOnEntry) .. ' | ' ; -- retStr = retStr .. "luaFileExtension:" .. luaFileExtension .. ' | ' ; retStr = retStr .. "logLevel:" .. logLevel .. ' | ' ; @@ -317,12 +317,15 @@ function this.getInfo() retStr = retStr .. "useCHook:false"; end - --此处记录 - retStr = retStr .. "\n--- Path Info ---\n"; - retStr = retStr .. "clibPath: " .. clibPath .. '\n'; + -- --此处记录 + retStr = retStr .. "\n\n- Path Info: \n"; + retStr = retStr .. "clibPath: " .. tostring(clibPath) .. '\n'; + retStr = retStr .. "debugger: " .. this.getPath(DebuggerFileName) .. '\n'; retStr = retStr .. this.getCWD(); - retStr = retStr .. "\n--- Breaks Info ---\n"; - retStr = retStr .. this.printTable(this.getBreaks()) .. '\n'; + retStr = retStr .. "\n说明: 请确定format路径下的文件是存在的,如format文件路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。"; + + retStr = retStr .. "\n\n- Breaks Info: \n"; + retStr = retStr .. this.printTable(this.getBreaks()); return retStr; end @@ -353,10 +356,10 @@ function this.tryRequireClib(libName , libPath) end else -- 此处考虑到tryRequireClib会被调用两次,日志级别设置为0,防止输出不必要的信息。 - if not string.match(err, "%%1 is not a valid Win32 application") then + if not (string.match(err, "%%1 is not a valid Win32 application") or string.match(err, "module 'libpdebug' not found")) then loadclibErrReason = err; - this.printToVSCode("[Require clib error]: " .. err, 0); end + this.printToVSCode("[Require clib error]: " .. err, 0); end package.cpath = save_cpath; return false @@ -835,7 +838,7 @@ function this.dataProcess( dataStr ) hookLib = luapanda_chook; else if not(this.tryRequireClib("libpdebug", x64Path) or this.tryRequireClib("libpdebug", x86Path)) then - this.printToVSCode("Require clib failed, use Lua to continue debug. Set logLevel to 0 and view the debugger log for more information.", 1); + this.printToVSCode("Require clib failed, use Lua to continue debug, use LuaPanda.getInfo() for more information.", 1); end end end From 9381dd02e8ac0430d63ce1283acad356e64e1af1 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Tue, 25 Jun 2019 10:53:19 +0800 Subject: [PATCH 004/431] bugfix --- Debugger/LuaPanda.lua | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 0132b96..3a424fc 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -317,7 +317,6 @@ function this.getInfo() retStr = retStr .. "useCHook:false"; end - -- --此处记录 retStr = retStr .. "\n\n- Path Info: \n"; retStr = retStr .. "clibPath: " .. tostring(clibPath) .. '\n'; retStr = retStr .. "debugger: " .. this.getPath(DebuggerFileName) .. '\n'; @@ -350,7 +349,7 @@ function this.tryRequireClib(libName , libPath) return true; else loadclibErrReason = "tryRequireClib fail : require success, but member function num <= 0; [" .. libName .. "] in "..libPath; - this.printToVSCode("tryRequireClib fail : require success, but member function num <= 0; [" .. libName .. "] in "..libPath); + this.printToVSCode(loadclibErrReason); hookLib = nil; return false; end @@ -1166,7 +1165,7 @@ function this.getPath( info ) local retPath = filePath; --若在Mac下以/开头,或者在Win下以*:开头,说明是绝对路径,不需要再拼。 if filePath:sub(1,1) == [[/]] or filePath:sub(1,3):match("^.:/") then - + --绝对路径 else --需要拼接 if cwd ~= "" then @@ -1428,10 +1427,6 @@ function this.debug_hook(event, line) end info.event = event; - if string.match(info.source, "^.:/") then - info.source = info.source:gsub("^.:/", string.upper); - end - this.real_hook_process(info); end From c07f7d1e79a87fb7ba82bf268c22c9a664547c60 Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Tue, 25 Jun 2019 11:48:36 +0800 Subject: [PATCH 005/431] =?UTF-8?q?2.1.1luapanda=20,=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 3a424fc..5b77665 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -109,6 +109,8 @@ local coroutinePool = {}; --保存用户协程的队列 local winDiskSymbolUpper = false;--设置win下盘符的大小写。以此确保从VSCode中传入的断点路径,cwd和从lua虚拟机获得的文件路径盘符大小写一致 local stopOnEntry; local loadclibErrReason = 'launch.json 文件中,配置项 useCHook 被设置为 false.'; +local winDiskSymbolTip = ""; +local isAbsolutePath = false; --Step控制标记位 local stepOverCounter = 0; --STEPOVER over计数器 local stepOutCounter = 0; --STEPOVER out计数器 @@ -321,8 +323,11 @@ function this.getInfo() retStr = retStr .. "clibPath: " .. tostring(clibPath) .. '\n'; retStr = retStr .. "debugger: " .. this.getPath(DebuggerFileName) .. '\n'; retStr = retStr .. this.getCWD(); - retStr = retStr .. "\n说明: 请确定format路径下的文件是存在的,如format文件路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。"; - + if isAbsolutePath then + retStr = retStr .. "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。" .. winDiskSymbolTip; + else + retStr = retStr .. "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。如format文件路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。也可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。" .. winDiskSymbolTip; + end retStr = retStr .. "\n\n- Breaks Info: \n"; retStr = retStr .. this.printTable(this.getBreaks()); return retStr; @@ -518,9 +523,11 @@ function this.genUnifiedPath(path) --win下按照winDiskSymbolUpper的设置修改盘符大小 if "Windows_NT" == OSType then if winDiskSymbolUpper then - newpath = newpath:gsub("^.:/", string.upper); + newpath = newpath:gsub("^%a:", string.upper); + winDiskSymbolTip = "路径中Windows盘符已转为大写。" else - newpath = newpath:gsub("^.:/", string.lower); + newpath = newpath:gsub("^%a:", string.lower); + winDiskSymbolTip = "路径中Windows盘符已转为小写。" end end @@ -1164,9 +1171,10 @@ function this.getPath( info ) --拼路径 local retPath = filePath; --若在Mac下以/开头,或者在Win下以*:开头,说明是绝对路径,不需要再拼。 - if filePath:sub(1,1) == [[/]] or filePath:sub(1,3):match("^.:/") then - --绝对路径 + if filePath:sub(1,1) == [[/]] or filePath:sub(1,2):match("^%a:") then + isAbsolutePath = true; else + isAbsolutePath = false; --需要拼接 if cwd ~= "" then --查看filePath中是否包含cwd From c9e6d1ed33255ede3537a9ef1992538996a0ba79 Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Tue, 25 Jun 2019 12:03:56 +0800 Subject: [PATCH 006/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 5b77665..4f9ec93 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -310,6 +310,7 @@ function this.getInfo() retStr = retStr .. "stopOnEntry:" .. tostring(stopOnEntry) .. ' | ' ; -- retStr = retStr .. "luaFileExtension:" .. luaFileExtension .. ' | ' ; retStr = retStr .. "logLevel:" .. logLevel .. ' | ' ; + retStr = retStr .. "consoleLogLevel:" .. consoleLogLevel .. ' | ' ; retStr = retStr .. "pathCaseSensitivity:" .. pathCaseSensitivity .. ' | ' ; retStr = retStr .. "attachMode:".. tostring(openAttachMode).. ' | ' ; @@ -318,6 +319,10 @@ function this.getInfo() else retStr = retStr .. "useCHook:false"; end + + if logLevel == 0 or consoleLogLevel == 0 then + retStr = retStr .. "\n说明:日志等级过低,会影响执行效率。请调整logLevel和consoleLogLevel值 >= 1"; + end retStr = retStr .. "\n\n- Path Info: \n"; retStr = retStr .. "clibPath: " .. tostring(clibPath) .. '\n'; From d4ef4f64e6b75cdc88011c205609ae2c41cec8c1 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Tue, 25 Jun 2019 20:32:28 +0800 Subject: [PATCH 007/431] =?UTF-8?q?=E5=85=BC=E5=AE=B9=E4=BA=86ostype?= =?UTF-8?q?=E5=8F=96=E4=B8=8D=E5=88=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 4f9ec93..b496d98 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -295,7 +295,7 @@ function this.getBaseInfo() end retStr = retStr .. " | supportREPL:".. tostring(outputIsUseLoadstring); - retStr = retStr .. " | codeEnv:" .. OSType .. '\n'; + retStr = retStr .. " | codeEnv:" .. tostring(OSType) .. '\n'; retStr = retStr .. moreInfoStr; return retStr; end @@ -815,13 +815,16 @@ function this.dataProcess( dataStr ) end TempFilePath_luaString = TempFilePath; - cwd = this.genUnifiedPath(dataTable.info.cwd); - logLevel = tonumber(dataTable.info.logLevel) or 1; - OSType = dataTable.info.OSType; - clibPath = dataTable.info.clibPath; + if type(dataTable.info.OSType) == "string" then + if nil == OSType then OSType = dataTable.info.OSType end + else + if nil == OSType then OSType = "Windows_NT" end + end + + clibPath = tostring(dataTable.info.clibPath); if tostring(dataTable.info.pathCaseSensitivity) == "false" then pathCaseSensitivity = 0; @@ -833,6 +836,7 @@ function this.dataProcess( dataStr ) if tostring(dataTable.info.useCHook) == "true" then local clibExt, platform; if OSType == "Darwin" then clibExt = "/?.so;"; platform = "mac"; + elseif OSType == "Linux" then clibExt = "/?.so;"; platform = "linux"; else clibExt = "/?.dll;"; platform = "win"; end local lua_ver; From 948affa639b7605c56fb06c223063a03d40b8189 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Wed, 26 Jun 2019 11:16:04 +0800 Subject: [PATCH 008/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86clib?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=EF=BC=8C=E7=94=A8=E6=88=B7=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E8=87=AA=E8=AE=BEclib=E6=89=80=E5=9C=A8=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index b496d98..e6e9329 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -108,7 +108,8 @@ local recvMsgQueue = {}; --接收的消息队列 local coroutinePool = {}; --保存用户协程的队列 local winDiskSymbolUpper = false;--设置win下盘符的大小写。以此确保从VSCode中传入的断点路径,cwd和从lua虚拟机获得的文件路径盘符大小写一致 local stopOnEntry; -local loadclibErrReason = 'launch.json 文件中,配置项 useCHook 被设置为 false.'; +local loadclibErrReason = '未能在clibpath路径下找到libpdebug 或 launch.json文件的配置项useCHook被设置为false.'; +local pathErrTip = "" local winDiskSymbolTip = ""; local isAbsolutePath = false; --Step控制标记位 @@ -333,6 +334,11 @@ function this.getInfo() else retStr = retStr .. "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。如format文件路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。也可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。" .. winDiskSymbolTip; end + + if pathErrTip ~= nil and pathErrTip ~= '' then + retStr = retStr .. '\n' .. pathErrTip; + end + retStr = retStr .. "\n\n- Breaks Info: \n"; retStr = retStr .. this.printTable(this.getBreaks()); return retStr; @@ -348,12 +354,10 @@ end -- path lib的cpath路径 function this.tryRequireClib(libName , libPath) this.printToVSCode("tryRequireClib search : [" .. libName .. "] in "..libPath); - - local save_cpath = package.cpath; - package.cpath = libPath; + package.cpath = package.cpath .. ';' .. libPath; + this.printToVSCode("package.cpath:" .. package.cpath); local status, err = pcall(function() hookLib = require(libName) end); if status then - package.cpath = save_cpath; if type(hookLib) == "table" and this.getTableMemberNum(hookLib) > 0 then this.printToVSCode("tryRequireClib success : [" .. libName .. "] in "..libPath); return true; @@ -370,7 +374,6 @@ function this.tryRequireClib(libName , libPath) end this.printToVSCode("[Require clib error]: " .. err, 0); end - package.cpath = save_cpath; return false end ------------------------字符串处理------------------------- @@ -824,7 +827,11 @@ function this.dataProcess( dataStr ) if nil == OSType then OSType = "Windows_NT" end end - clibPath = tostring(dataTable.info.clibPath); + if type(dataTable.info.clibPath) == "string" then + if nil == clibPath then clibPath = dataTable.info.clibPath end + else + if nil == clibPath then clibPath = ""; pathErrTip = "未能正确获取libpdebug库所在位置, 可能无法加载libpdebug库。" end + end if tostring(dataTable.info.pathCaseSensitivity) == "false" then pathCaseSensitivity = 0; From 6f02ac514f1ffe7d76b3daaf476e1ef617d3f967 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Wed, 26 Jun 2019 11:46:38 +0800 Subject: [PATCH 009/431] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=AF=B9?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=87=AA=E5=AE=9A=E4=B9=89lib=E5=BA=93?= =?UTF-8?q?=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 58 ++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index e6e9329..e0a7330 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -827,10 +827,18 @@ function this.dataProcess( dataStr ) if nil == OSType then OSType = "Windows_NT" end end - if type(dataTable.info.clibPath) == "string" then - if nil == clibPath then clibPath = dataTable.info.clibPath end + local isUserSetClibPath = false; + if nil == clibPath then + --用户未设置clibPath, 接收VSCode传来的数据 + if type(dataTable.info.clibPath) == "string" then + clibPath = dataTable.info.clibPath; + else + clibPath = ""; + pathErrTip = "未能正确获取libpdebug库所在位置, 可能无法加载libpdebug库。"; + end else - if nil == clibPath then clibPath = ""; pathErrTip = "未能正确获取libpdebug库所在位置, 可能无法加载libpdebug库。" end + --用户自设clibPath + isUserSetClibPath = true; end if tostring(dataTable.info.pathCaseSensitivity) == "false" then @@ -841,26 +849,36 @@ function this.dataProcess( dataStr ) --查找c++的hook库是否存在 if tostring(dataTable.info.useCHook) == "true" then - local clibExt, platform; - if OSType == "Darwin" then clibExt = "/?.so;"; platform = "mac"; - elseif OSType == "Linux" then clibExt = "/?.so;"; platform = "linux"; - else clibExt = "/?.dll;"; platform = "win"; end - - local lua_ver; - if _VERSION == "Lua 5.1" then - lua_ver = "501"; + if isUserSetClibPath == true then + if luapanda_chook ~= nil then + hookLib = luapanda_chook; + else + if not(this.tryRequireClib("libpdebug", clibPath)) then + this.printToVSCode("Require clib failed, use Lua to continue debug, use LuaPanda.getInfo() for more information.", 1); + end + end else - lua_ver = "503"; - end + local clibExt, platform; + if OSType == "Darwin" then clibExt = "/?.so;"; platform = "mac"; + elseif OSType == "Linux" then clibExt = "/?.so;"; platform = "linux"; + else clibExt = "/?.dll;"; platform = "win"; end + + local lua_ver; + if _VERSION == "Lua 5.1" then + lua_ver = "501"; + else + lua_ver = "503"; + end - local x86Path = clibPath.. platform .."/x86/".. lua_ver .. clibExt; - local x64Path = clibPath.. platform .."/x86_64/".. lua_ver .. clibExt; + local x86Path = clibPath.. platform .."/x86/".. lua_ver .. clibExt; + local x64Path = clibPath.. platform .."/x86_64/".. lua_ver .. clibExt; - if luapanda_chook ~= nil then - hookLib = luapanda_chook; - else - if not(this.tryRequireClib("libpdebug", x64Path) or this.tryRequireClib("libpdebug", x86Path)) then - this.printToVSCode("Require clib failed, use Lua to continue debug, use LuaPanda.getInfo() for more information.", 1); + if luapanda_chook ~= nil then + hookLib = luapanda_chook; + else + if not(this.tryRequireClib("libpdebug", x64Path) or this.tryRequireClib("libpdebug", x86Path)) then + this.printToVSCode("Require clib failed, use Lua to continue debug, use LuaPanda.getInfo() for more information.", 1); + end end end end From f277a8036f8442dcb1df084d434d2032c6d8c895 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Wed, 26 Jun 2019 15:29:56 +0800 Subject: [PATCH 010/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=87=AA=E8=AE=BEclib=E7=9A=84=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index e0a7330..b01d3c6 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -95,8 +95,8 @@ local TempFilePath_luaString = ""; --VSCode端配置的临时文件存放路径 local connectHost; --记录连接端IP local connectPort; --记录连接端口号 local sock; --tcp socket -local OSType; --VSCode识别出的系统类型 -local clibPath; --chook库在VScode端的路径 +local OSType; --VSCode识别出的系统类型,也可以自行设置。Windows_NT | Linux | Darwin +local clibPath; --chook库在VScode端的路径,也可自行设置。 local hookLib; --chook库的引用实例 --标记位 local logLevel = 1; --日志等级all/info/error. 此设置对应的是VSCode端设置的日志等级. @@ -109,6 +109,7 @@ local coroutinePool = {}; --保存用户协程的队列 local winDiskSymbolUpper = false;--设置win下盘符的大小写。以此确保从VSCode中传入的断点路径,cwd和从lua虚拟机获得的文件路径盘符大小写一致 local stopOnEntry; local loadclibErrReason = '未能在clibpath路径下找到libpdebug 或 launch.json文件的配置项useCHook被设置为false.'; +local OSTypeErrTip = ""; local pathErrTip = "" local winDiskSymbolTip = ""; local isAbsolutePath = false; @@ -298,6 +299,9 @@ function this.getBaseInfo() retStr = retStr .. " | supportREPL:".. tostring(outputIsUseLoadstring); retStr = retStr .. " | codeEnv:" .. tostring(OSType) .. '\n'; retStr = retStr .. moreInfoStr; + if OSTypeErrTip ~= nil and OSTypeErrTip ~= '' then + retStr = retStr .. '\n' ..OSTypeErrTip; + end return retStr; end @@ -821,10 +825,17 @@ function this.dataProcess( dataStr ) cwd = this.genUnifiedPath(dataTable.info.cwd); logLevel = tonumber(dataTable.info.logLevel) or 1; - if type(dataTable.info.OSType) == "string" then - if nil == OSType then OSType = dataTable.info.OSType end + if nil == OSType then + --用户未主动设置OSType, 接收VSCode传来的数据 + if type(dataTable.info.OSType) == "string" then + OSType = dataTable.info.OSType; + else + OSType = "Windows_NT"; + --tips + OSTypeErrTip = "未能检测出OSType, 可能是node os库未能加载,系统使用默认设置Windows_NT" + end else - if nil == OSType then OSType = "Windows_NT" end + --用户自设OSType, 使用用户的设置 end local isUserSetClibPath = false; From f13f0878e1b36b628215bc10fa9e7afc69a0f6f1 Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Mon, 1 Jul 2019 10:42:04 +0800 Subject: [PATCH 011/431] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0base64?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E8=A7=A3=E7=A0=81=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/DebugTools.lua | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Debugger/DebugTools.lua b/Debugger/DebugTools.lua index 8acba23..0bee0a3 100644 --- a/Debugger/DebugTools.lua +++ b/Debugger/DebugTools.lua @@ -542,4 +542,42 @@ function this.createJson() end return json end + +-- Sourced from http://lua-users.org/wiki/BaseSixtyFour + +-- Lua 5.1+ base64 v3.0 (c) 2009 by Alex Kloss +-- licensed under the terms of the LGPL2 + +-- character table string +local base64CharTable='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + +-- encoding +function this.base64encode(data) + return ((data:gsub('.', function(x) + local r,b='',x:byte() + for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end + return r; + end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) + if (#x < 6) then return '' end + local c=0 + for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end + return base64CharTable:sub(c+1,c+1) + end)..({ '', '==', '=' })[#data%3+1]) +end + +-- decoding +function this.base64decode(data) + data = string.gsub(data, '[^'..base64CharTable..'=]', '') + return (data:gsub('.', function(x) + if (x == '=') then return '' end + local r,f='',(base64CharTable:find(x)-1) + for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end + return r; + end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) + if (#x ~= 8) then return '' end + local c=0 + for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end + return string.char(c) + end)) +end return this; From 62899e3e64da070c592e3a1316c500a62b0bffda Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Mon, 1 Jul 2019 10:42:33 +0800 Subject: [PATCH 012/431] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E4=B8=AD=E6=9C=89=E7=89=B9=E6=AE=8A=E5=80=BC?= =?UTF-8?q?=E6=97=B6=E5=AF=BC=E8=87=B4=E8=B0=83=E8=AF=95=E5=99=A8=E5=A5=94?= =?UTF-8?q?=E6=BA=83=E6=97=A0=E6=B3=95=E8=BF=9E=E6=8E=A5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bug原因是JS中解析json异常。将字符串用base64编码,解析json之后再解base64。 --- Debugger/LuaPanda.lua | 8 ++++++++ src/dataProcesser.ts | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index b01d3c6..6a129c6 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -626,6 +626,14 @@ end -- 向adapter发消息 -- @sendTab 消息体table function this.sendMsg( sendTab ) + if sendTab["info"] ~= nil then + for _, v in ipairs(sendTab["info"]) do + if v["type"] == "string" then + v["value"] = tools.base64encode(v["value"]) + end + end + end + local sendStr = json.encode(sendTab); if currentRunState == runState.DISCONNECT then this.printToConsole("[debugger error] disconnect but want sendMsg:" .. sendStr, 2); diff --git a/src/dataProcesser.ts b/src/dataProcesser.ts index db55799..10faf43 100644 --- a/src/dataProcesser.ts +++ b/src/dataProcesser.ts @@ -67,6 +67,13 @@ export class dataProcesser { data = this.getDataJsonCatch + data; } cmdInfo = JSON.parse(data); + if (cmdInfo.info !== undefined) { + for (let i = 0, len = cmdInfo.info.length; i < len; i++) { + if (cmdInfo.info[i].type === "string") { + cmdInfo.info[i].value = Buffer.from(cmdInfo.info[i].value, 'base64').toString() + } + } + } this.getDataJsonCatch = ""; } catch(e){ From 384e056afddc609e75bb8527c42e00893a7b6b57 Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Tue, 2 Jul 2019 14:49:54 +0800 Subject: [PATCH 013/431] =?UTF-8?q?feat:=20launch=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD=E6=B7=BB=E5=8A=A0isNeedB64EncodeStr=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=A1=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/package.json b/package.json index e131730..add2a24 100755 --- a/package.json +++ b/package.json @@ -102,6 +102,11 @@ "description": "设置运行时的工程路径", "default": "${workspaceFolder}" }, + "isNeedB64EncodeStr": { + "type": "boolean", + "description": "是否使用base64编码传输字符串,默认请开启。", + "default": true + }, "luaFileExtension": { "type": "string", "description": "Lua文件后缀", @@ -163,6 +168,7 @@ "name": "LuaPanda", "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", + "isNeedB64EncodeStr": true, "luaFileExtension": "", "pathCaseSensitivity": true, "connectionPort": 8818, @@ -178,6 +184,7 @@ "name": "LuaPanda-DebugFile", "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", + "isNeedB64EncodeStr": true, "luaFileExtension": "", "pathCaseSensitivity": true, "connectionPort": 8818, From 3d3d2d5317bccabd1cfabd070880175b200cf687 Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Tue, 2 Jul 2019 15:15:50 +0800 Subject: [PATCH 014/431] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E6=97=B6adapter=E4=B8=8Edebugger=E9=80=9A=E4=BF=A1=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E6=98=AF=E5=90=A6=E5=90=AF=E7=94=A8base64=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E5=AD=97=E7=AC=A6=E4=B8=B2=EF=BC=8C=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E8=80=81=E7=89=88=E6=9C=AC=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 10 +++++++--- src/dataProcesser.ts | 3 ++- src/luaDebug.ts | 7 +++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 6a129c6..c8c88ae 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -107,6 +107,7 @@ local pathCaseSensitivity = 1; --路径是否发大小写敏感,这个选项 local recvMsgQueue = {}; --接收的消息队列 local coroutinePool = {}; --保存用户协程的队列 local winDiskSymbolUpper = false;--设置win下盘符的大小写。以此确保从VSCode中传入的断点路径,cwd和从lua虚拟机获得的文件路径盘符大小写一致 +local isNeedB64EncodeStr = false;-- 记录是否使用base64编码字符串 local stopOnEntry; local loadclibErrReason = '未能在clibpath路径下找到libpdebug 或 launch.json文件的配置项useCHook被设置为false.'; local OSTypeErrTip = ""; @@ -324,7 +325,7 @@ function this.getInfo() else retStr = retStr .. "useCHook:false"; end - + if logLevel == 0 or consoleLogLevel == 0 then retStr = retStr .. "\n说明:日志等级过低,会影响执行效率。请调整logLevel和consoleLogLevel值 >= 1"; end @@ -626,7 +627,7 @@ end -- 向adapter发消息 -- @sendTab 消息体table function this.sendMsg( sendTab ) - if sendTab["info"] ~= nil then + if isNeedB64EncodeStr and sendTab["info"] ~= nil then for _, v in ipairs(sendTab["info"]) do if v["type"] == "string" then v["value"] = tools.base64encode(v["value"]) @@ -823,6 +824,9 @@ function this.dataProcess( dataStr ) end elseif dataTable.cmd == "initSuccess" then --初始化会传过来一些变量,这里记录这些变量 + if dataTable.info.isNeedB64EncodeStr == "true" then + isNeedB64EncodeStr = true + end luaFileExtension = dataTable.info.luaFileExtension local TempFilePath = dataTable.info.TempFilePath; if TempFilePath:sub(-1, -1) == [[\]] or TempFilePath:sub(-1, -1) == [[/]] then @@ -920,7 +924,7 @@ function this.dataProcess( dataStr ) isUseLoadstring = 1; end end - local tab = { debuggerVer = tostring(debuggerVer) , UseHookLib = tostring(isUseHookLib) , UseLoadstring = tostring(isUseLoadstring) }; + local tab = { debuggerVer = tostring(debuggerVer) , UseHookLib = tostring(isUseHookLib) , UseLoadstring = tostring(isUseLoadstring), isNeedB64EncodeStr = tostring(isNeedB64EncodeStr) }; msgTab.info = tab; this.sendMsg(msgTab); --上面getBK中会判断当前状态是否WAIT_CMD, 所以最后再切换状态。 diff --git a/src/dataProcesser.ts b/src/dataProcesser.ts index 10faf43..20f9a5d 100644 --- a/src/dataProcesser.ts +++ b/src/dataProcesser.ts @@ -1,6 +1,7 @@ import { luaDebugRuntime } from './luaDebugRuntime'; import { Socket } from 'net'; import { DebugLogger } from './LogManager'; +import { LuaDebugSession } from './luaDebug'; //网络收发消息,记录回调 export class dataProcesser { @@ -67,7 +68,7 @@ export class dataProcesser { data = this.getDataJsonCatch + data; } cmdInfo = JSON.parse(data); - if (cmdInfo.info !== undefined) { + if (LuaDebugSession.isNeedB64EncodeStr && cmdInfo.info !== undefined) { for (let i = 0, len = cmdInfo.info.length; i < len; i++) { if (cmdInfo.info[i].type === "string") { cmdInfo.info[i].value = Buffer.from(cmdInfo.info[i].value, 'base64').toString() diff --git a/src/luaDebug.ts b/src/luaDebug.ts index fbe3f39..e324911 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -22,6 +22,7 @@ import { StatusBarManager } from './StatusBarManager'; import { LineBreakpoint, ConditionBreakpoint, LogPoint } from './BreakPoint'; import { Tools } from './Tools'; export class LuaDebugSession extends LoggingDebugSession { + public static isNeedB64EncodeStr: boolean = false; private static THREAD_ID = 1; //调试器不支持多线程,硬编码THREAD_ID为1 public static TCPPort = 0; //和客户端连接的端口号,通过VScode的设置赋值 private static breakpointsArray; //在socket连接前临时保存断点的数组 @@ -139,6 +140,7 @@ export class LuaDebugSession extends LoggingDebugSession { sendArgs["stopOnEntry"] = !!args.stopOnEntry; sendArgs["luaFileExtension"] = args.luaFileExtension; sendArgs["cwd"] = args.cwd; + sendArgs["isNeedB64EncodeStr"] = !!args.isNeedB64EncodeStr; sendArgs["TempFilePath"] = args.TempFilePath; sendArgs["logLevel"] = args.logLevel; sendArgs["debugMode"] = args.DebugMode; @@ -174,6 +176,11 @@ export class LuaDebugSession extends LoggingDebugSession { } else { this.UseLoadstring = false; } + if (info.isNeedB64EncodeStr === "true") { + LuaDebugSession.isNeedB64EncodeStr = true; + } else { + LuaDebugSession.isNeedB64EncodeStr = false; + } if (info.UseHookLib == "1") { } //已建立连接,并完成初始化 let ins = arr[0]; From 275843f9643f6a4cc403295fcf48e34215aad957 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Tue, 2 Jul 2019 16:36:34 +0800 Subject: [PATCH 015/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=96=AD?= =?UTF-8?q?=E5=BC=80=E8=BF=9E=E6=8E=A5=E6=97=B6=E6=B8=85=E7=A9=BA=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 4 +++- Debugger/debugger_lib/libpdebug.cpp | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 6a129c6..ebf143a 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -235,9 +235,11 @@ end function this.clearData() -- reset breaks breaks = {}; + pathFormatCache = {}; this.breaks = breaks; if hookLib ~= nil then - hookLib.sync_breakpoints(); -- 这个函数不能兼容空breaks + hookLib.sync_breakpoints(); --清空断点信息 + hookLib.clear_pathcache(); --清空路径缓存 end end diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index e9970ce..62eb1a4 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -211,6 +211,13 @@ void call_lua_function(lua_State *L, const char * lua_function_name, int retCoun //------------Lua同步数据接口------------ +//lua层主动清除路径缓存 +extern "C" int clear_pathcache(lua_State *L) +{ + path_cache_list.clear(); + return 0; +} + //lua主动调用从c获取current_hook_state状态 extern "C" int get_libhook_state(lua_State *L) { @@ -753,6 +760,7 @@ static luaL_Reg libpdebug[] = { { "endHook", endHook }, //结束hook,停止调试 { "get_libhook_state", get_libhook_state }, { "get_last_source", get_last_source }, + { "clear_pathcache", clear_pathcache }, { NULL, NULL } }; From 9e02891a9034ecc9dca6aa10b3b2ffbe33e6cf38 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Thu, 4 Jul 2019 12:02:26 +0800 Subject: [PATCH 016/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86doctor?= =?UTF-8?q?=E5=92=8C=E4=B8=80=E4=BA=9B=E5=B8=AE=E5=8A=A9=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 171 +++++++++++++++++++++++++++++++++++++----- Docs/Manual/update.md | 19 +++++ src/luaDebug.ts | 18 +++++ 3 files changed, 191 insertions(+), 17 deletions(-) create mode 100644 Docs/Manual/update.md diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index f537d60..26ef732 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -19,6 +19,12 @@ API: LuaPanda.getInfo() 返回获取调试器信息。包括版本号,是否使用lib库,系统是否支持loadstring(load方法) + LuaPanda.help() + 返回一些帮助信息。 + + LuaPanda.doctor() + 返回对当前环境的诊断信息,提示可能存在的问题。 + LuaPanda.getCWD() 用户可以调用或在调试控制台中输出这个函数,返回帮助设置CWD的路径。比如 cwd: F:/1/2/3/4/5 @@ -36,18 +42,17 @@ API: ]] --用户设置项 -local openAttachMode = true; --是否开启attach模式。attach模式开启后可以在任意时刻启动vscode连接调试。缺点是不调试时也会略降低lua执行效率(会不断进行attach请求) +local openAttachMode = true; --是否开启attach模式。attach模式开启后可以在任意时刻启动vscode连接调试。缺点是没有连接调试时也会略降低lua执行效率(会不断进行attach请求) local attachInterval = 1; --attach间隔时间(s) -local TCPSplitChar = "|*|"; --json协议分隔符,如果用户传输的数据中包含相同符号会造成协议被错误分割,保证和传输内容不同即可,如无问题不必修改 local customGetSocketInstance = nil; --支持用户实现一个自定义调用luasocket的函数,函数返回值必须是一个socket实例。例: function() return require("socket.core").tcp() end; -local consoleLogLevel = 2; --打印在控制台(print)的日志等级all/info/error. +local consoleLogLevel = 2; --打印在控制台(print)的日志等级 0 : all/ 1: info/ 2: error. local connectTimeoutSec = 0.005; --等待连接超时时间, 单位s. 时间过长等待attach时会造成卡顿,时间过短可能无法连接。建议值0.005 - 0.05 --用户设置项END local debuggerVer = "2.1.1"; --debugger版本号 LuaPanda = {}; local this = LuaPanda; -local tools = require("DebugTools"); --引用的开源工具,包括json解析和table展开工具 +local tools = require("DebugTools"); --引用的开源工具,包括json解析和table展开工具等 this.tools = tools; this.curStackId = 0; --json处理 @@ -74,6 +79,7 @@ local runState = { HIT_BREAKPOINT = 10 }; +local TCPSplitChar = "|*|"; --json协议分隔符,请不要修改 local MAX_TIMEOUT_SEC = 3600 * 24; --网络最大超时等待时间 --当前运行状态 local currentRunState; @@ -98,6 +104,7 @@ local sock; --tcp socket local OSType; --VSCode识别出的系统类型,也可以自行设置。Windows_NT | Linux | Darwin local clibPath; --chook库在VScode端的路径,也可自行设置。 local hookLib; --chook库的引用实例 +local adapterVer; --VScode传来的adapter版本号 --标记位 local logLevel = 1; --日志等级all/info/error. 此设置对应的是VSCode端设置的日志等级. local variableRefIdx = 1; --变量索引 @@ -108,12 +115,13 @@ local recvMsgQueue = {}; --接收的消息队列 local coroutinePool = {}; --保存用户协程的队列 local winDiskSymbolUpper = false;--设置win下盘符的大小写。以此确保从VSCode中传入的断点路径,cwd和从lua虚拟机获得的文件路径盘符大小写一致 local isNeedB64EncodeStr = false;-- 记录是否使用base64编码字符串 -local stopOnEntry; -local loadclibErrReason = '未能在clibpath路径下找到libpdebug 或 launch.json文件的配置项useCHook被设置为false.'; +local loadclibErrReason = 'launch.json文件的配置项useCHook被设置为false.'; local OSTypeErrTip = ""; local pathErrTip = "" local winDiskSymbolTip = ""; local isAbsolutePath = false; +local stopOnEntry; --用户在VSCode端设置的是否打开stopOnEntry +local userSetUseClib; --用户在VSCode端设置的是否是用clib库 --Step控制标记位 local stepOverCounter = 0; --STEPOVER over计数器 local stepOutCounter = 0; --STEPOVER out计数器 @@ -126,7 +134,7 @@ local stopConnectTime = 0; --用来临时记录stop断开连接的时间 local isInMainThread; local receiveMsgTimer = 0; local pathFormatCache = {}; - +local isUserSetClibPath = false; --用户是否在本文件中自设了clib路径 --5.1/5.3兼容 if _VERSION == "Lua 5.1" then debugger_loadString = loadstring; @@ -283,7 +291,7 @@ end --返回版本号等配置 function this.getBaseInfo() - local retStr = "Lua Ver:" .. _VERSION .." | Debugger Ver:"..tostring(debuggerVer); + local retStr = "Lua Ver:" .. _VERSION .." | adapterVer:" .. tostring(adapterVer) .. " | Debugger Ver:"..tostring(debuggerVer); local moreInfoStr = ""; if hookLib ~= nil then local clibVer, forluaVer = hookLib.sync_getLibVersion(); @@ -291,7 +299,7 @@ function this.getBaseInfo() retStr = retStr.. " | hookLib Ver:" .. clibStr; moreInfoStr = moreInfoStr .. "说明: 已加载 libpdebug 库."; else - moreInfoStr = moreInfoStr .. "说明: 未能加载 libpdebug 库。原因是 ".. loadclibErrReason; + moreInfoStr = moreInfoStr .. "说明: 未能加载 libpdebug 库。原因请使用 LuaPanda.doctor() 查看"; end local outputIsUseLoadstring = false @@ -308,6 +316,127 @@ function this.getBaseInfo() return retStr; end +--返回一些帮助信息 +function this.help() + local retStr = '\nFAQ:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/FAQ.md'; + retStr = retStr .. '\n真机调试:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; + retStr = retStr .. '\n升级指引:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; + retStr = retStr .. '\n调试器原理:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; + return retStr; +end + +--自动诊断当前环境的错误,并输出信息 +function this.doctor() + local retStr = ''; + if debuggerVer ~= adapterVer then + retStr = retStr .. "\n- 建议更新版本\nLuaPanda VSCode插件版本是" .. adapterVer .. ", LuaPanda.lua文件版本是" .. debuggerVer .. "。建议检查并更新到最新版本。"; + retStr = retStr .. "\n更新帮助: https://github.com/Tencent/LuaPanda"; + retStr = retStr .. "\n下载地址: https://github.com/Tencent/LuaPanda/releases"; + end + --plibdebug + if hookLib == nil then + retStr = retStr .. "\n\n- libpdebug 库没有加载\n"; + if userSetUseClib then + --用户允许使用clib插件 + if isUserSetClibPath == true then + --用户自设了clib地址 + retStr = retStr .. "用户使用 LuaPanda.lua 中 clibPath 变量指定了 plibdebug 的位置: " .. clibPath; + if this.tryRequireClib("libpdebug", clibPath) then + retStr = retStr .. "\n引用成功"; + else + retStr = retStr .. "\n引用错误:" .. loadclibErrReason; + end + else + --使用默认clib地址 + local clibExt, platform; + if OSType == "Darwin" then clibExt = "/?.so;"; platform = "mac"; + elseif OSType == "Linux" then clibExt = "/?.so;"; platform = "linux"; + else clibExt = "/?.dll;"; platform = "win"; end + local lua_ver; + if _VERSION == "Lua 5.1" then + lua_ver = "501"; + else + lua_ver = "503"; + end + local x86Path = clibPath.. platform .."/x86/".. lua_ver .. clibExt; + local x64Path = clibPath.. platform .."/x86_64/".. lua_ver .. clibExt; + + retStr = retStr .. "尝试引用x64库: ".. x64Path; + if this.tryRequireClib("libpdebug", x64Path) then + retStr = retStr .. "\n引用成功"; + else + retStr = retStr .. "\n引用错误:" .. loadclibErrReason; + retStr = retStr .. "\n尝试引用x86库: ".. x86Path; + if this.tryRequireClib("libpdebug", x86Path) then + retStr = retStr .. "\n引用成功"; + else + retStr = retStr .. "\n引用错误:" .. loadclibErrReason; + end + end + end + else + retStr = retStr .. "原因是" .. loadclibErrReason; + end + end + + --path + --尝试直接读当前getinfo指向的文件,看能否找到。如果能,提示正确,如果找不到,给出提示,建议玩家在这个文件中打一个断点 + --检查断点,文件和当前文件的不同,给出建议 + local runSource = lastRunFilePath; + if hookLib ~= nil then + runSource = this.getPath(tostring(hookLib.get_last_source())); + end + if runSource and runSource ~= "" then + -- 读文件 + local isFileExist = this.fileExists(runSource); + if not isFileExist then + retStr = retStr .. "\n\n- 路径存在问题\n"; + --解析路径,得到文件名,到断点路径中查这个文件名 + local pathArray = this.stringSplit(runSource, '/'); + --如果pathArray和断点能匹配上 + local fileMatch= false; + for key, value in pairs(this.getBreaks()) do + local xx = string.find(key, pathArray[#pathArray], 1, true); + if xx then + --和断点匹配了 + fileMatch = true; + -- retStr = retStr .. "\n请对比如下路径:\n"; + retStr = retStr .. this.getCWD(); + retStr = retStr .. "\nfilepath: " .. key; + if isAbsolutePath then + retStr = retStr .. "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。" .. winDiskSymbolTip; + else + retStr = retStr .. "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。" .. winDiskSymbolTip; + end + retStr = retStr .. "\nfilepath是VSCode通过获取到的文件正确路径 , 对比format和filepath,调整launch.json中CWD,或改变VSCode打开文件夹的位置。使format和filepath一致即可。"; + end + end + + if fileMatch == false then + --未能和断点匹配 + retStr = retStr .. "\n找不到文件:" .. runSource .. ", 请检查路径是否正确。\n或者在VSCode文件" .. pathArray[#pathArray] .. "中打一个断点后,再执行一次doctor命令,查看路径分析结果。"; + end + end + end + + --日志等级对性能的影响 + if logLevel < 1 or consoleLogLevel < 1 then + retStr = retStr .. "\n\n- 日志等级\n"; + if logLevel < 1 then + retStr = retStr .. "当前日志等级是" .. logLevel .. ", 过低的日志等级会降低调试速度,建议调整launch.json中的logLevel选项"; + end + if consoleLogLevel < 1 then + retStr = retStr .. "当前console日志等级是" .. consoleLogLevel .. ", 过低的日志等级会降低调试速度,建议调整LuaPanda.lua头部的consoleLogLevel选项"; + end + end + return retStr; +end + +function this.fileExists(path) + local f=io.open(path,"r"); + if f~= nil then io.close(f) return true else return false end + end + --返回一些信息,帮助用户定位问题 function this.getInfo() --用户设置项 @@ -322,7 +451,7 @@ function this.getInfo() retStr = retStr .. "pathCaseSensitivity:" .. pathCaseSensitivity .. ' | ' ; retStr = retStr .. "attachMode:".. tostring(openAttachMode).. ' | ' ; - if hookLib ~= nil then + if userSetUseClib then retStr = retStr .. "useCHook:true"; else retStr = retStr .. "useCHook:false"; @@ -361,26 +490,28 @@ end -- path lib的cpath路径 function this.tryRequireClib(libName , libPath) this.printToVSCode("tryRequireClib search : [" .. libName .. "] in "..libPath); + local savedCpath = package.cpath; package.cpath = package.cpath .. ';' .. libPath; this.printToVSCode("package.cpath:" .. package.cpath); local status, err = pcall(function() hookLib = require(libName) end); if status then if type(hookLib) == "table" and this.getTableMemberNum(hookLib) > 0 then this.printToVSCode("tryRequireClib success : [" .. libName .. "] in "..libPath); + package.cpath = savedCpath; return true; else loadclibErrReason = "tryRequireClib fail : require success, but member function num <= 0; [" .. libName .. "] in "..libPath; this.printToVSCode(loadclibErrReason); hookLib = nil; + package.cpath = savedCpath; return false; end else -- 此处考虑到tryRequireClib会被调用两次,日志级别设置为0,防止输出不必要的信息。 - if not (string.match(err, "%%1 is not a valid Win32 application") or string.match(err, "module 'libpdebug' not found")) then - loadclibErrReason = err; - end + loadclibErrReason = err; this.printToVSCode("[Require clib error]: " .. err, 0); end + package.cpath = savedCpath; return false end ------------------------字符串处理------------------------- @@ -852,7 +983,8 @@ function this.dataProcess( dataStr ) --用户自设OSType, 使用用户的设置 end - local isUserSetClibPath = false; + --检测用户是否自设了clib路径 + isUserSetClibPath = false; if nil == clibPath then --用户未设置clibPath, 接收VSCode传来的数据 if type(dataTable.info.clibPath) == "string" then @@ -874,7 +1006,8 @@ function this.dataProcess( dataStr ) --查找c++的hook库是否存在 if tostring(dataTable.info.useCHook) == "true" then - if isUserSetClibPath == true then + userSetUseClib = true; --用户确定使用clib + if isUserSetClibPath == true then --如果用户自设了clib路径 if luapanda_chook ~= nil then hookLib = luapanda_chook; else @@ -906,8 +1039,12 @@ function this.dataProcess( dataStr ) end end end + else + userSetUseClib = false; end - --设置是否stopOnEntry + + --adapter版本信息 + adapterVer = tostring(dataTable.info.adapterVersion); local msgTab = this.getMsgTable("initSuccess", this.getCallbackId()); --回传是否使用了lib,是否有loadstring函数 local isUseHookLib = 0; @@ -926,7 +1063,7 @@ function this.dataProcess( dataStr ) isUseLoadstring = 1; end end - local tab = { debuggerVer = tostring(debuggerVer) , UseHookLib = tostring(isUseHookLib) , UseLoadstring = tostring(isUseLoadstring), isNeedB64EncodeStr = tostring(isNeedB64EncodeStr) }; + local tab = { debuggerVer = tostring(debuggerVer) , UseHookLib = tostring(isUseHookLib) , UseLoadstring = tostring(isUseLoadstring), isNeedB64EncodeStr = tostring(isNeedB64EncodeStr), debuggerVer = tostring(debuggerVer) }; msgTab.info = tab; this.sendMsg(msgTab); --上面getBK中会判断当前状态是否WAIT_CMD, 所以最后再切换状态。 diff --git a/Docs/Manual/update.md b/Docs/Manual/update.md new file mode 100644 index 0000000..077bfea --- /dev/null +++ b/Docs/Manual/update.md @@ -0,0 +1,19 @@ +#升级说明 + +调试器框架分为三部分 + ++ VSCode 扩展 : https://marketplace.visualstudio.com/items?itemName=stuartwang.luapanda + + 如有更新,VSCode 会有提示。 + ++ lua文件 : LuaPanda.lua,DebugTools.lua + + 需要用户手动下载最新的文件,替换工程中原有文件。 + ++ 调试器c库 : plibdebug + + plibdebug默认放置在VSCode 扩展中,无需用户手动更新。如果使用源码编译的方式,需要更新代码重新编译。 + + + +通常用户只要手动更新lua文件即可。 \ No newline at end of file diff --git a/src/luaDebug.ts b/src/luaDebug.ts index e324911..762f360 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -148,6 +148,9 @@ export class LuaDebugSession extends LoggingDebugSession { sendArgs["OSType"] = os.type(); sendArgs["clibPath"] = clibPath; sendArgs["useCHook"] = args.useCHook; + let pkg = require("../package.json"); + let adapterVersion = pkg.version; + sendArgs["adapterVersion"] = String(adapterVersion); if(args.docPathReplace instanceof Array && args.docPathReplace.length == 2 ){ LuaDebugSession.replacePath = new Array( Tools.genUnifiedPath(String(args.docPathReplace[0])), Tools.genUnifiedPath(String(args.docPathReplace[1]))); @@ -171,6 +174,21 @@ export class LuaDebugSession extends LoggingDebugSession { this._runtime.start((arr, info) => { DebugLogger.AdapterInfo("已建立连接,发送初始化协议和断点信息!"); //设置标记位 + if (typeof info.debuggerVer == "string"){ + //转数字 + let DVerArr = info.debuggerVer.split("."); + let AVerArr = String(adapterVersion).split("."); + if (DVerArr.length == AVerArr.length && DVerArr.length == 3 ){ + //比较大版本,大版本相差1就提示 + if ( parseInt(AVerArr[0]) > parseInt(DVerArr[0]) ){ + this._runtime.showTip("调试器Lua文件较旧, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda "); + } + //比较小版本,小版本相差20就提示 + if ( ( parseInt(AVerArr[1]) - parseInt(DVerArr[1]) ) >= 20 ){ + this._runtime.showTip("调试器Lua文件较旧, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda "); + } + } + } if (info.UseLoadstring == "1") { this.UseLoadstring = true; } else { From 8bae939c0659bc852851013e3a7ed2705913aa4e Mon Sep 17 00:00:00 2001 From: stuartwang Date: Fri, 5 Jul 2019 15:52:35 +0800 Subject: [PATCH 017/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E5=90=8E?= =?UTF-8?q?=E7=BC=80=E6=9B=BF=E6=8D=A2=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8gsub=E5=8F=AF=E4=BB=A5=E5=85=BC=E5=AE=B9=E9=AD=94?= =?UTF-8?q?=E6=B3=95=E5=AD=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 26ef732..82a90d8 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -1348,20 +1348,14 @@ function this.getPath( info ) end local originalPath = filePath; - --判断@ + --如果路径头部有@,去除 if filePath:sub(1,1) == '@' then filePath = filePath:sub(2); end --后缀处理 if luaFileExtension ~= "" then - local checkExtension = string.sub(filePath, -6, -1) - local ExtensionMatchRes = this.revFindString(checkExtension, "%."); - if ExtensionMatchRes ~= nil then - --去后缀.这里的完整公式是(-1)*(6 - ExtensionMatchRes + 2) - filePath = string.sub(filePath, 1 , -6 - 2 + ExtensionMatchRes); - end - filePath = filePath.."."..luaFileExtension; + filePath = string.gsub(filePath, "%.%w+$", luaFileExtension); end --拼路径 @@ -1371,7 +1365,6 @@ function this.getPath( info ) isAbsolutePath = true; else isAbsolutePath = false; - --需要拼接 if cwd ~= "" then --查看filePath中是否包含cwd local matchRes = string.find(filePath, cwd, 1, true); From 70204973f83d4b5ee5d38120eadad83126a8415e Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Fri, 5 Jul 2019 17:28:48 +0800 Subject: [PATCH 018/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=90=8E?= =?UTF-8?q?=E7=BC=80=E4=B8=AD=E5=AF=B9=E9=AD=94=E6=B3=95=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 82a90d8..4c6d277 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -395,9 +395,8 @@ function this.doctor() local pathArray = this.stringSplit(runSource, '/'); --如果pathArray和断点能匹配上 local fileMatch= false; - for key, value in pairs(this.getBreaks()) do - local xx = string.find(key, pathArray[#pathArray], 1, true); - if xx then + for key, _ in pairs(this.getBreaks()) do + if string.find(key, pathArray[#pathArray], 1, true) then --和断点匹配了 fileMatch = true; -- retStr = retStr .. "\n请对比如下路径:\n"; @@ -1355,7 +1354,12 @@ function this.getPath( info ) --后缀处理 if luaFileExtension ~= "" then - filePath = string.gsub(filePath, "%.%w+$", luaFileExtension); + --判断后缀中是否包含%1等魔法字符 + if string.find(luaFileExtension, "%%%d") then + filePath = string.gsub(filePath, "%.%w+$", luaFileExtension); + else + filePath = string.gsub(filePath, "%.%w+$", '.' .. luaFileExtension); + end end --拼路径 From db0896a24423df9d38cd56f9f07ccd1e034bf52b Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Tue, 9 Jul 2019 12:15:02 +0800 Subject: [PATCH 019/431] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=90=8E?= =?UTF-8?q?=E7=BC=80=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 4c6d277..07943cd 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -1354,11 +1354,12 @@ function this.getPath( info ) --后缀处理 if luaFileExtension ~= "" then - --判断后缀中是否包含%1等魔法字符 + --判断后缀中是否包含%1等魔法字符.用于从lua虚拟机获取到的路径含.的情况 if string.find(luaFileExtension, "%%%d") then filePath = string.gsub(filePath, "%.%w+$", luaFileExtension); else - filePath = string.gsub(filePath, "%.%w+$", '.' .. luaFileExtension); + filePath = string.gsub(filePath, "%.%w+$", ""); + filePath = filePath .. "." .. luaFileExtension; end end From 7322189795d46087094c1acf227beb2e009ce1ea Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Tue, 9 Jul 2019 17:52:16 +0800 Subject: [PATCH 020/431] =?UTF-8?q?feat:=20call=5Flua=5Ffunction=E8=B0=83?= =?UTF-8?q?=E7=94=A8Lua=E5=87=BA=E9=94=99=E6=97=B6=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=E5=88=B0VSCode=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E5=8F=96=E6=B6=88=E7=BB=93=E6=9D=9F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/debugger_lib/libpdebug.cpp | 36 +++++++++++++++++++---------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index 62eb1a4..8b463a3 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -185,28 +185,34 @@ void push_args(lua_State *L, T value ,ARGS... args){ //push_args End template -void call_lua_function(lua_State *L, const char * lua_function_name, int retCount , ARGS... args){ +int call_lua_function(lua_State *L, const char * lua_function_name, int retCount , ARGS... args){ lua_getglobal(L, LUA_DEBUGGER_NAME); if (!lua_istable(L, -1)) { - printf("[Debug Lib Error]:call_lua_function get LUA_DEBUGGER_NAME error\n"); - exit(1001); - return; + const char *err_msg = "[Debug Lib Error]:call_lua_function Get LUA_DEBUGGER_NAME error.\n"; + print_to_vscode(L, err_msg, 2); + return -1; } lua_getfield(L, -1, lua_function_name); if (!lua_isfunction(L, -1)) { - printf("[Debug Lib Error]:call_lua_function get lua function %s error\n", lua_function_name); - exit(1002); - return; + char err_msg[100]; + snprintf(err_msg, sizeof(err_msg), "[Debug Lib Error]:call_lua_function Get lua function %s error\n.", lua_function_name); + print_to_vscode(L, err_msg, 2); + return -1; } push_args(L, args...); int run_result = lua_pcall(L, sizeof...(args), retCount, 0); if (run_result) { - printf("[Debug Lib Error]:call_lua_function call lua function %s error %d\n", lua_function_name, run_result); - exit(1003); - return; + char err_msg[500]; + const char *lua_error = lua_tostring(L, -1); + snprintf(err_msg, sizeof(err_msg), "[Debug Lib Error]:call_lua_function Call lua function %s error code: %d, error message: %s.\n", lua_function_name, run_result, lua_error); + print_to_vscode(L, err_msg, 2); + lua_pop(L, 1); + return run_result; } + + return 0; } @@ -353,7 +359,10 @@ const char* getPath(lua_State *L,const char* source){ } //若缓存中没有,到lua中转换 - call_lua_function(L, "getPath", 1 , source); + int lua_ret = call_lua_function(L, "getPath", 1 , source); + if (lua_ret != 0) { + return nullptr; + } const char* retSource = lua_tostring(L, -1); //加入缓存,返回 path_transfer_node *nd = new path_transfer_node(source, retSource ); @@ -465,7 +474,10 @@ int debug_ishit_bk(lua_State *L, const char * curPath, int current_line) { // 条件断点 if (const_iter2->second.type == CONDITION_BREAKPOINT) { std::string condition = const_iter2->second.info; - call_lua_function(L, "IsMeetCondition", 1, condition.c_str()); + int lua_ret = call_lua_function(L, "IsMeetCondition", 1, condition.c_str()); + if (lua_ret != 0) { + return 0; + } // if (!lua_isboolean(L, -1)) { // print_to_vscode(L, "[Debug Lib Error] debug_ishit_bk process condition expression result error!", 2); // return 0; From 44a2adeaf32b28409acb076baf6d84b773c9b636 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Wed, 10 Jul 2019 11:14:03 +0800 Subject: [PATCH 021/431] =?UTF-8?q?optimization=EF=BC=8C=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=89=93=E5=BC=80base64?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 13 ++++++++----- src/extension.ts | 4 ++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 07943cd..2969195 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -956,26 +956,29 @@ function this.dataProcess( dataStr ) end elseif dataTable.cmd == "initSuccess" then --初始化会传过来一些变量,这里记录这些变量 + --Base64 if dataTable.info.isNeedB64EncodeStr == "true" then - isNeedB64EncodeStr = true + isNeedB64EncodeStr = true; + else + isNeedB64EncodeStr = false; end + --path luaFileExtension = dataTable.info.luaFileExtension local TempFilePath = dataTable.info.TempFilePath; if TempFilePath:sub(-1, -1) == [[\]] or TempFilePath:sub(-1, -1) == [[/]] then TempFilePath = TempFilePath:sub(1, -2); end - TempFilePath_luaString = TempFilePath; cwd = this.genUnifiedPath(dataTable.info.cwd); + --logLevel logLevel = tonumber(dataTable.info.logLevel) or 1; - + --OS type if nil == OSType then --用户未主动设置OSType, 接收VSCode传来的数据 if type(dataTable.info.OSType) == "string" then OSType = dataTable.info.OSType; else OSType = "Windows_NT"; - --tips OSTypeErrTip = "未能检测出OSType, 可能是node os库未能加载,系统使用默认设置Windows_NT" end else @@ -1062,7 +1065,7 @@ function this.dataProcess( dataStr ) isUseLoadstring = 1; end end - local tab = { debuggerVer = tostring(debuggerVer) , UseHookLib = tostring(isUseHookLib) , UseLoadstring = tostring(isUseLoadstring), isNeedB64EncodeStr = tostring(isNeedB64EncodeStr), debuggerVer = tostring(debuggerVer) }; + local tab = { debuggerVer = tostring(debuggerVer) , UseHookLib = tostring(isUseHookLib) , UseLoadstring = tostring(isUseLoadstring), isNeedB64EncodeStr = tostring(isNeedB64EncodeStr) }; msgTab.info = tab; this.sendMsg(msgTab); --上面getBK中会判断当前状态是否WAIT_CMD, 所以最后再切换状态。 diff --git a/src/extension.ts b/src/extension.ts index 6b693a6..4239a96 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -135,6 +135,10 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { config.useCHook = true; } + if (config.isNeedB64EncodeStr == undefined) { + config.isNeedB64EncodeStr = true; + } + if (!this._server) { this._server = Net.createServer(socket => { const session = new LuaDebugSession(); From 59d31a334728389eacc24936fe9ab16b23295282 Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Wed, 10 Jul 2019 11:48:00 +0800 Subject: [PATCH 022/431] =?UTF-8?q?feat:=20BaseInfo=E4=B8=AD=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0useBase64EncodeString=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 07943cd..c27de25 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -291,7 +291,7 @@ end --返回版本号等配置 function this.getBaseInfo() - local retStr = "Lua Ver:" .. _VERSION .." | adapterVer:" .. tostring(adapterVer) .. " | Debugger Ver:"..tostring(debuggerVer); + local retStr = "Lua Ver:" .. _VERSION .. " | adapterVer:" .. tostring(adapterVer) .. " | Debugger Ver:" .. tostring(debuggerVer) .. " | useBase64EncodeString:" .. tostring(isNeedB64EncodeStr); local moreInfoStr = ""; if hookLib ~= nil then local clibVer, forluaVer = hookLib.sync_getLibVersion(); From dc56b87242158df1e02d3317fc97d02e4fd9235c Mon Sep 17 00:00:00 2001 From: stuartwang Date: Wed, 10 Jul 2019 15:24:27 +0800 Subject: [PATCH 023/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86c=E5=BA=93?= =?UTF-8?q?=EF=BC=8C=E5=81=9A=E4=BA=86getPath=E8=BF=94=E5=9B=9E=E5=80=BC?= =?UTF-8?q?=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/debugger_lib/libpdebug.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index 8b463a3..98b2960 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -202,14 +202,14 @@ int call_lua_function(lua_State *L, const char * lua_function_name, int retCount } push_args(L, args...); - int run_result = lua_pcall(L, sizeof...(args), retCount, 0); - if (run_result) { - char err_msg[500]; + int err_code = lua_pcall(L, sizeof...(args), retCount, 0); + if (err_code) { + char err_msg[1024]; const char *lua_error = lua_tostring(L, -1); - snprintf(err_msg, sizeof(err_msg), "[Debug Lib Error]:call_lua_function Call lua function %s error code: %d, error message: %s.\n", lua_function_name, run_result, lua_error); + snprintf(err_msg, sizeof(err_msg), "[Debug Lib Error]:call_lua_function Call lua function %s error code: %d, error message: %s.\n", lua_function_name, err_code, lua_error); print_to_vscode(L, err_msg, 2); lua_pop(L, 1); - return run_result; + return err_code; } return 0; @@ -346,8 +346,8 @@ const char* getPath(lua_State *L,const char* source){ debug_auto_stack _tt(L); if(source == nullptr){ - //报错 - return nullptr; + print_to_vscode(L, "[Debug Lib Error]:function getPath source == nullptr"); + return ""; } //检查缓存 @@ -361,7 +361,7 @@ const char* getPath(lua_State *L,const char* source){ //若缓存中没有,到lua中转换 int lua_ret = call_lua_function(L, "getPath", 1 , source); if (lua_ret != 0) { - return nullptr; + return ""; } const char* retSource = lua_tostring(L, -1); //加入缓存,返回 @@ -633,9 +633,8 @@ int hook_process_code_section(lua_State *L, lua_Debug *ar){ int checkHasBreakpoint(lua_State *L, const char * src1, int current_line, int sline , int eline){ debug_auto_stack tt(L); //先检查行号,再置换路径 - const char * src = getPath(L, src1); - if(src == nullptr){ - printf("checkHasBreakpoint error "); + const char *src = getPath(L, src1); + if(!strcmp(src,"")){ return 3; } From 53003e69efa42877b9e00c5908e7f5fa482dbd40 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Wed, 10 Jul 2019 16:13:08 +0800 Subject: [PATCH 024/431] bugfix --- Debugger/debugger_lib/libpdebug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index 98b2960..faa29c9 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -346,7 +346,7 @@ const char* getPath(lua_State *L,const char* source){ debug_auto_stack _tt(L); if(source == nullptr){ - print_to_vscode(L, "[Debug Lib Error]:function getPath source == nullptr"); + print_to_vscode(L, "[Debug Lib Error]:function getPath source == nullptr", 2); return ""; } From 261782e020ff4830294130d952ce81f02c1d33fd Mon Sep 17 00:00:00 2001 From: stuartwang Date: Wed, 10 Jul 2019 17:04:33 +0800 Subject: [PATCH 025/431] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BA=86=E9=BB=98?= =?UTF-8?q?=E8=AE=A4launch.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index add2a24..2afb814 100755 --- a/package.json +++ b/package.json @@ -169,13 +169,13 @@ "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", "isNeedB64EncodeStr": true, - "luaFileExtension": "", "pathCaseSensitivity": true, + "docPathReplace": [], + "luaFileExtension": "", "connectionPort": 8818, "stopOnEntry": true, "useCHook": true, - "logLevel": 1, - "docPathReplace": [] + "logLevel": 1 }, { "type": "lua", @@ -185,14 +185,13 @@ "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", "isNeedB64EncodeStr": true, - "luaFileExtension": "", "pathCaseSensitivity": true, + "luaPath" : "", + "luaFileExtension": "", "connectionPort": 8818, "stopOnEntry": true, "useCHook": true, "logLevel": 1, - "luaPath" : "", - "packagePath": [] } ] } From 7d4c91f6f6477930c86896d91e529341e214ecef Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Wed, 10 Jul 2019 17:47:36 +0800 Subject: [PATCH 026/431] =?UTF-8?q?refactor:=20=E4=BD=BF=E7=94=A8table.con?= =?UTF-8?q?cat=E6=9B=BF=E4=BB=A3=E5=A4=A7=E9=87=8F=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E6=8B=BC=E6=8E=A5=E6=93=8D=E4=BD=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 117 +++++++++++++++++++++--------------------- 1 file changed, 59 insertions(+), 58 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 3369382..ce79be5 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -327,24 +327,24 @@ end --自动诊断当前环境的错误,并输出信息 function this.doctor() - local retStr = ''; - if debuggerVer ~= adapterVer then - retStr = retStr .. "\n- 建议更新版本\nLuaPanda VSCode插件版本是" .. adapterVer .. ", LuaPanda.lua文件版本是" .. debuggerVer .. "。建议检查并更新到最新版本。"; - retStr = retStr .. "\n更新帮助: https://github.com/Tencent/LuaPanda"; - retStr = retStr .. "\n下载地址: https://github.com/Tencent/LuaPanda/releases"; + local strTable = {}; + if debuggerVer ~= adapterVer then + strTable[#strTable + 1] = "\n- 建议更新版本\nLuaPanda VSCode插件版本是" .. adapterVer .. ", LuaPanda.lua文件版本是" .. debuggerVer .. "。建议检查并更新到最新版本。"; + strTable[#strTable + 1] = "\n更新帮助: https://github.com/Tencent/LuaPanda"; + strTable[#strTable + 1] = "\n下载地址: https://github.com/Tencent/LuaPanda/releases"; end --plibdebug if hookLib == nil then - retStr = retStr .. "\n\n- libpdebug 库没有加载\n"; - if userSetUseClib then + strTable[#strTable + 1] = "\n\n- libpdebug 库没有加载\n"; + if userSetUseClib then --用户允许使用clib插件 - if isUserSetClibPath == true then + if isUserSetClibPath == true then --用户自设了clib地址 - retStr = retStr .. "用户使用 LuaPanda.lua 中 clibPath 变量指定了 plibdebug 的位置: " .. clibPath; - if this.tryRequireClib("libpdebug", clibPath) then - retStr = retStr .. "\n引用成功"; + strTable[#strTable + 1] = "用户使用 LuaPanda.lua 中 clibPath 变量指定了 plibdebug 的位置: " .. clibPath; + if this.tryRequireClib("libpdebug", clibPath) then + strTable[#strTable + 1] = "\n引用成功"; else - retStr = retStr .. "\n引用错误:" .. loadclibErrReason; + strTable[#strTable + 1] = "\n引用错误:" .. loadclibErrReason; end else --使用默认clib地址 @@ -358,24 +358,24 @@ function this.doctor() else lua_ver = "503"; end - local x86Path = clibPath.. platform .."/x86/".. lua_ver .. clibExt; - local x64Path = clibPath.. platform .."/x86_64/".. lua_ver .. clibExt; - - retStr = retStr .. "尝试引用x64库: ".. x64Path; + local x86Path = clibPath .. platform .."/x86/".. lua_ver .. clibExt; + local x64Path = clibPath .. platform .."/x86_64/".. lua_ver .. clibExt; + + strTable[#strTable + 1] = "尝试引用x64库: ".. x64Path; if this.tryRequireClib("libpdebug", x64Path) then - retStr = retStr .. "\n引用成功"; + strTable[#strTable + 1] = "\n引用成功"; else - retStr = retStr .. "\n引用错误:" .. loadclibErrReason; - retStr = retStr .. "\n尝试引用x86库: ".. x86Path; + strTable[#strTable + 1] = "\n引用错误:" .. loadclibErrReason; + strTable[#strTable + 1] = "\n尝试引用x86库: ".. x86Path; if this.tryRequireClib("libpdebug", x86Path) then - retStr = retStr .. "\n引用成功"; + strTable[#strTable + 1] = "\n引用成功"; else - retStr = retStr .. "\n引用错误:" .. loadclibErrReason; + strTable[#strTable + 1] = "\n引用错误:" .. loadclibErrReason; end end end else - retStr = retStr .. "原因是" .. loadclibErrReason; + strTable[#strTable + 1] = "原因是" .. loadclibErrReason; end end @@ -389,8 +389,8 @@ function this.doctor() if runSource and runSource ~= "" then -- 读文件 local isFileExist = this.fileExists(runSource); - if not isFileExist then - retStr = retStr .. "\n\n- 路径存在问题\n"; + if not isFileExist then + strTable[#strTable + 1] = "\n\n- 路径存在问题\n"; --解析路径,得到文件名,到断点路径中查这个文件名 local pathArray = this.stringSplit(runSource, '/'); --如果pathArray和断点能匹配上 @@ -400,35 +400,35 @@ function this.doctor() --和断点匹配了 fileMatch = true; -- retStr = retStr .. "\n请对比如下路径:\n"; - retStr = retStr .. this.getCWD(); - retStr = retStr .. "\nfilepath: " .. key; + strTable[#strTable + 1] = this.getCWD(); + strTable[#strTable + 1] = "\nfilepath: " .. key; if isAbsolutePath then - retStr = retStr .. "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。" .. winDiskSymbolTip; + strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。" .. winDiskSymbolTip; else - retStr = retStr .. "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。" .. winDiskSymbolTip; + strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。" .. winDiskSymbolTip; end - retStr = retStr .. "\nfilepath是VSCode通过获取到的文件正确路径 , 对比format和filepath,调整launch.json中CWD,或改变VSCode打开文件夹的位置。使format和filepath一致即可。"; + strTable[#strTable + 1] = "\nfilepath是VSCode通过获取到的文件正确路径 , 对比format和filepath,调整launch.json中CWD,或改变VSCode打开文件夹的位置。使format和filepath一致即可。"; end end if fileMatch == false then --未能和断点匹配 - retStr = retStr .. "\n找不到文件:" .. runSource .. ", 请检查路径是否正确。\n或者在VSCode文件" .. pathArray[#pathArray] .. "中打一个断点后,再执行一次doctor命令,查看路径分析结果。"; + strTable[#strTable + 1] = "\n找不到文件:" .. runSource .. ", 请检查路径是否正确。\n或者在VSCode文件" .. pathArray[#pathArray] .. "中打一个断点后,再执行一次doctor命令,查看路径分析结果。"; end end end --日志等级对性能的影响 if logLevel < 1 or consoleLogLevel < 1 then - retStr = retStr .. "\n\n- 日志等级\n"; - if logLevel < 1 then - retStr = retStr .. "当前日志等级是" .. logLevel .. ", 过低的日志等级会降低调试速度,建议调整launch.json中的logLevel选项"; + strTable[#strTable + 1] = "\n\n- 日志等级\n"; + if logLevel < 1 then + strTable[#strTable + 1] = "当前日志等级是" .. logLevel .. ", 过低的日志等级会降低调试速度,建议调整launch.json中的logLevel选项"; end - if consoleLogLevel < 1 then - retStr = retStr .. "当前console日志等级是" .. consoleLogLevel .. ", 过低的日志等级会降低调试速度,建议调整LuaPanda.lua头部的consoleLogLevel选项"; + if consoleLogLevel < 1 then + strTable[#strTable + 1] = "当前console日志等级是" .. consoleLogLevel .. ", 过低的日志等级会降低调试速度,建议调整LuaPanda.lua头部的consoleLogLevel选项"; end end - return retStr; + return table.concat(strTable); end function this.fileExists(path) @@ -439,44 +439,45 @@ function this.fileExists(path) --返回一些信息,帮助用户定位问题 function this.getInfo() --用户设置项 - local retStr = "\n- Base Info: \n"; - retStr = retStr .. this.getBaseInfo(); + local strTable = {}; + strTable[#strTable + 1] = "\n- Base Info: \n"; + strTable[#strTable + 1] = this.getBaseInfo(); --已经加载C库,x86/64 未能加载,原因 - retStr = retStr .. "\n\n- User Setting: \n"; - retStr = retStr .. "stopOnEntry:" .. tostring(stopOnEntry) .. ' | ' ; - -- retStr = retStr .. "luaFileExtension:" .. luaFileExtension .. ' | ' ; - retStr = retStr .. "logLevel:" .. logLevel .. ' | ' ; - retStr = retStr .. "consoleLogLevel:" .. consoleLogLevel .. ' | ' ; - retStr = retStr .. "pathCaseSensitivity:" .. pathCaseSensitivity .. ' | ' ; - retStr = retStr .. "attachMode:".. tostring(openAttachMode).. ' | ' ; + strTable[#strTable + 1] = "\n\n- User Setting: \n"; + strTable[#strTable + 1] = "stopOnEntry:" .. tostring(stopOnEntry) .. ' | '; + -- strTable[#strTable + 1] = "luaFileExtension:" .. luaFileExtension .. ' | '; + strTable[#strTable + 1] = "logLevel:" .. logLevel .. ' | ' ; + strTable[#strTable + 1] = "consoleLogLevel:" .. consoleLogLevel .. ' | '; + strTable[#strTable + 1] = "pathCaseSensitivity:" .. pathCaseSensitivity .. ' | '; + strTable[#strTable + 1] = "attachMode:".. tostring(openAttachMode).. ' | '; if userSetUseClib then - retStr = retStr .. "useCHook:true"; + strTable[#strTable + 1] = "useCHook:true"; else - retStr = retStr .. "useCHook:false"; + strTable[#strTable + 1] = "useCHook:false"; end if logLevel == 0 or consoleLogLevel == 0 then - retStr = retStr .. "\n说明:日志等级过低,会影响执行效率。请调整logLevel和consoleLogLevel值 >= 1"; + strTable[#strTable + 1] = "\n说明:日志等级过低,会影响执行效率。请调整logLevel和consoleLogLevel值 >= 1"; end - retStr = retStr .. "\n\n- Path Info: \n"; - retStr = retStr .. "clibPath: " .. tostring(clibPath) .. '\n'; - retStr = retStr .. "debugger: " .. this.getPath(DebuggerFileName) .. '\n'; - retStr = retStr .. this.getCWD(); + strTable[#strTable + 1] = "\n\n- Path Info: \n"; + strTable[#strTable + 1] = "clibPath: " .. tostring(clibPath) .. '\n'; + strTable[#strTable + 1] = "debugger: " .. this.getPath(DebuggerFileName) .. '\n'; + strTable[#strTable + 1] = this.getCWD(); if isAbsolutePath then - retStr = retStr .. "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。" .. winDiskSymbolTip; + strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。" .. winDiskSymbolTip; else - retStr = retStr .. "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。如format文件路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。也可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。" .. winDiskSymbolTip; + strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。如format文件路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。也可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。" .. winDiskSymbolTip; end if pathErrTip ~= nil and pathErrTip ~= '' then - retStr = retStr .. '\n' .. pathErrTip; + strTable[#strTable + 1] = '\n' .. pathErrTip; end - retStr = retStr .. "\n\n- Breaks Info: \n"; - retStr = retStr .. this.printTable(this.getBreaks()); - return retStr; + strTable[#strTable + 1] = "\n\n- Breaks Info: \n"; + strTable[#strTable + 1] = this.printTable(this.getBreaks()); + return table.concat(strTable); end --判断是否在协程中 From 0d07962b7d65222d152f6597927c0a871b9ee7fd Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Wed, 10 Jul 2019 19:21:47 +0800 Subject: [PATCH 027/431] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4useBase64Encod?= =?UTF-8?q?eString=E9=A1=B9=E8=BE=93=E5=87=BA=E4=BD=8D=E7=BD=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index ce79be5..08a8fee 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -291,7 +291,7 @@ end --返回版本号等配置 function this.getBaseInfo() - local retStr = "Lua Ver:" .. _VERSION .. " | adapterVer:" .. tostring(adapterVer) .. " | Debugger Ver:" .. tostring(debuggerVer) .. " | useBase64EncodeString:" .. tostring(isNeedB64EncodeStr); + local retStr = "Lua Ver:" .. _VERSION .. " | adapterVer:" .. tostring(adapterVer) .. " | Debugger Ver:" .. tostring(debuggerVer); local moreInfoStr = ""; if hookLib ~= nil then local clibVer, forluaVer = hookLib.sync_getLibVersion(); @@ -308,6 +308,7 @@ function this.getBaseInfo() end retStr = retStr .. " | supportREPL:".. tostring(outputIsUseLoadstring); + retStr = retStr .. " | useBase64EncodeString:".. tostring(isNeedB64EncodeStr); retStr = retStr .. " | codeEnv:" .. tostring(OSType) .. '\n'; retStr = retStr .. moreInfoStr; if OSTypeErrTip ~= nil and OSTypeErrTip ~= '' then From 5facde6dbf442310fe777a2b0973d06991168113 Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Wed, 10 Jul 2019 19:35:11 +0800 Subject: [PATCH 028/431] =?UTF-8?q?refactor:=20=E4=BD=BF=E7=94=A8table.con?= =?UTF-8?q?cat=E6=9B=BF=E4=BB=A3=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=8B=BC?= =?UTF-8?q?=E6=8E=A5=E6=93=8D=E4=BD=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 08a8fee..7f3846f 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -291,39 +291,41 @@ end --返回版本号等配置 function this.getBaseInfo() - local retStr = "Lua Ver:" .. _VERSION .. " | adapterVer:" .. tostring(adapterVer) .. " | Debugger Ver:" .. tostring(debuggerVer); + local strTable = {}; + strTable[#strTable + 1] = "Lua Ver:" .. _VERSION .. " | adapterVer:" .. tostring(adapterVer) .. " | Debugger Ver:" .. tostring(debuggerVer); local moreInfoStr = ""; if hookLib ~= nil then local clibVer, forluaVer = hookLib.sync_getLibVersion(); local clibStr = forluaVer ~= nil and tostring(clibVer) .. " for " .. tostring(math.ceil(forluaVer)) or tostring(clibVer); - retStr = retStr.. " | hookLib Ver:" .. clibStr; + strTable[#strTable + 1] = " | hookLib Ver:" .. clibStr; moreInfoStr = moreInfoStr .. "说明: 已加载 libpdebug 库."; else moreInfoStr = moreInfoStr .. "说明: 未能加载 libpdebug 库。原因请使用 LuaPanda.doctor() 查看"; end local outputIsUseLoadstring = false - if type(isUseLoadstring) == "number" and isUseLoadstring == 1 then + if type(isUseLoadstring) == "number" and isUseLoadstring == 1 then outputIsUseLoadstring = true; end - retStr = retStr .. " | supportREPL:".. tostring(outputIsUseLoadstring); - retStr = retStr .. " | useBase64EncodeString:".. tostring(isNeedB64EncodeStr); - retStr = retStr .. " | codeEnv:" .. tostring(OSType) .. '\n'; - retStr = retStr .. moreInfoStr; + strTable[#strTable + 1] = " | supportREPL:".. tostring(outputIsUseLoadstring); + strTable[#strTable + 1] = " | useBase64EncodeString:".. tostring(isNeedB64EncodeStr); + strTable[#strTable + 1] = " | codeEnv:" .. tostring(OSType) .. '\n'; + strTable[#strTable + 1] = moreInfoStr; if OSTypeErrTip ~= nil and OSTypeErrTip ~= '' then - retStr = retStr .. '\n' ..OSTypeErrTip; + strTable[#strTable + 1] = '\n' ..OSTypeErrTip; end - return retStr; + return table.concat(strTable); end --返回一些帮助信息 function this.help() - local retStr = '\nFAQ:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/FAQ.md'; - retStr = retStr .. '\n真机调试:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; - retStr = retStr .. '\n升级指引:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; - retStr = retStr .. '\n调试器原理:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; - return retStr; + local strTable = {}; + strTable[#strTable + 1] = '\nFAQ:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/FAQ.md'; + strTable[#strTable + 1] = '\n真机调试:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; + strTable[#strTable + 1] = '\n升级指引:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; + strTable[#strTable + 1] = '\n调试器原理:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; + return table.concat(strTable); end --自动诊断当前环境的错误,并输出信息 From 11331cef951f6563d26a07d5ad4318072db154f8 Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Wed, 10 Jul 2019 20:20:42 +0800 Subject: [PATCH 029/431] =?UTF-8?q?fix:=20=E9=9A=90=E8=97=8Flaunch?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=ADisNeedB64EncodeStr=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 -- src/luaDebug.ts | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index add2a24..b1762fa 100755 --- a/package.json +++ b/package.json @@ -168,7 +168,6 @@ "name": "LuaPanda", "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", - "isNeedB64EncodeStr": true, "luaFileExtension": "", "pathCaseSensitivity": true, "connectionPort": 8818, @@ -184,7 +183,6 @@ "name": "LuaPanda-DebugFile", "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", - "isNeedB64EncodeStr": true, "luaFileExtension": "", "pathCaseSensitivity": true, "connectionPort": 8818, diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 762f360..3c17124 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -22,7 +22,7 @@ import { StatusBarManager } from './StatusBarManager'; import { LineBreakpoint, ConditionBreakpoint, LogPoint } from './BreakPoint'; import { Tools } from './Tools'; export class LuaDebugSession extends LoggingDebugSession { - public static isNeedB64EncodeStr: boolean = false; + public static isNeedB64EncodeStr: boolean = true; private static THREAD_ID = 1; //调试器不支持多线程,硬编码THREAD_ID为1 public static TCPPort = 0; //和客户端连接的端口号,通过VScode的设置赋值 private static breakpointsArray; //在socket连接前临时保存断点的数组 From 0218702698508cdc57310a5c5384fdbe0977254f Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Thu, 11 Jul 2019 12:36:04 +0800 Subject: [PATCH 030/431] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 2 +- Debugger/debugger_lib/libpdebug.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 3369382..e11cedd 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -217,7 +217,7 @@ function this.connectSuccess() this.printToVSCode("[debugger error]初始化未完成, 建立连接但接收初始化消息失败。请更换端口重试", 2); return; end - this.printToVSCode("初始化完成") + this.printToVSCode("debugger init success", 1); this.changeHookState(hookState.ALL_HOOK); if hookLib == nil then diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index faa29c9..7f5a2a3 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -196,7 +196,7 @@ int call_lua_function(lua_State *L, const char * lua_function_name, int retCount lua_getfield(L, -1, lua_function_name); if (!lua_isfunction(L, -1)) { char err_msg[100]; - snprintf(err_msg, sizeof(err_msg), "[Debug Lib Error]:call_lua_function Get lua function %s error\n.", lua_function_name); + snprintf(err_msg, sizeof(err_msg), "[Debug Lib Error]:call_lua_function Get lua function '%s' error\n.", lua_function_name); print_to_vscode(L, err_msg, 2); return -1; } @@ -206,7 +206,7 @@ int call_lua_function(lua_State *L, const char * lua_function_name, int retCount if (err_code) { char err_msg[1024]; const char *lua_error = lua_tostring(L, -1); - snprintf(err_msg, sizeof(err_msg), "[Debug Lib Error]:call_lua_function Call lua function %s error code: %d, error message: %s.\n", lua_function_name, err_code, lua_error); + snprintf(err_msg, sizeof(err_msg), "[Debug Lib Error]:call_lua_function Call '%s' error. ErrorCode: %d, ErrorMessage: %s.\n", lua_function_name, err_code, lua_error); print_to_vscode(L, err_msg, 2); lua_pop(L, 1); return err_code; @@ -346,7 +346,7 @@ const char* getPath(lua_State *L,const char* source){ debug_auto_stack _tt(L); if(source == nullptr){ - print_to_vscode(L, "[Debug Lib Error]:function getPath source == nullptr", 2); + print_to_vscode(L, "[Debug Lib Error]: getPath Exception: source == nullptr", 2); return ""; } @@ -383,7 +383,7 @@ extern "C" int sync_breakpoints(lua_State *L) { lua_getfield(L, -1, "breaks"); if (!lua_istable(L, -1)) { - print_to_vscode(L, "[Debug Lib Error]debug_ishit_bk get breaks error", 2); + print_to_vscode(L, "[Debug Lib Error] debug_ishit_bk get breaks error", 2); return -1; } From 5ab984a1052db9b4ae43dd1543dd90a1421c877f Mon Sep 17 00:00:00 2001 From: stuartwang Date: Thu, 11 Jul 2019 12:40:02 +0800 Subject: [PATCH 031/431] fix --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2afb814..d5c6aa6 100755 --- a/package.json +++ b/package.json @@ -191,7 +191,7 @@ "connectionPort": 8818, "stopOnEntry": true, "useCHook": true, - "logLevel": 1, + "logLevel": 1 } ] } From 5906369eccbf2b2411e8ed4cebeead9e4045297f Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Thu, 11 Jul 2019 14:47:31 +0800 Subject: [PATCH 032/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0win=E4=B8=8Bclib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/win/x86/501/libpdebug.dll | Bin 36864 -> 37888 bytes .../plugins/win/x86/503/libpdebug.dll | Bin 37888 -> 38912 bytes .../plugins/win/x86_64/501/libpdebug.dll | Bin 44544 -> 45568 bytes .../plugins/win/x86_64/503/libpdebug.dll | Bin 46080 -> 47104 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Debugger/debugger_lib/plugins/win/x86/501/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86/501/libpdebug.dll index ab28c17a8a9ded54ea0f71db117c3a98f493db56..d4cc4ff54afa338e2f1104ca76f1f158fab1981c 100644 GIT binary patch delta 17507 zcmdsedwf$>w*N^;AwVG!S}3JJfE0?9l1KA?l}9K-D=CGx$g4bxp<=<3@K7+-wAyl7 z1rE%haP*)EDHu@pr&)4nFqAWx&lhpAhIb-+WwvTW)T8gZMY!tP;v| zSFi9=8;tn#xEUr#(t9>@`jc^sqsSIUI=a7PAj7N#CNqM4wgga#t3oI%g=ZykjoIEI4_t`;Wgbivfqai#ILGJBWBM5-(Nqk_d0328EaiE+9+E3;X4B z^Z0ke;V>%?uagDOO7p^rrz#j_@N77EDy1r*5#}DKMXH%VX!q*SQneT)8Lg zSMo1GK=71&!Qzu#dR$U!653}^FA*3)TpISSzn@XA+=uQno?x52pm3kOo?9LFklLHd zFm-N~t-}{z8ZKo#>;-;4p>pN?dn$q|{%ua)dt~bNm;mrHO8wiOI`{RJ4J0!BfGn&H zC)V!gX7?WM?TAqZ+cHJs8h3ksL1B!A{nIstGHwq9tx`;m%c^FSipQ&D7>*?GrbifM zU2f=%yIBF*XWTS!%xQOs;cLfIxs%HK)Calqy+;&`9>*}~5a{_0(3{82o;$;_|s^ zA>@>-RPL?+S-tFIqI&g;>eZ^|j>|_*_%*yzGqdbp` zJf2(#IVEe|OG7Z!+d_(*Rgu{{dtV(>dWZKMVSXRM#9dXErg&c_%nK2WjK)2M282}bx152W{-If4!(YDSVUxZjTfCgL%7kKt7Po(j+$ zRaA}W#1z`vtgM?KDrFSY=7-pK`PXT@+|B4jutQlsgUtuww$d}fELgf^A)6a$*T2UrW}>AY^L!r#9#&q% z2oE(`vRHJo4WK&T&;nMQ$7hRj&)W=y^tH*A#ci z)Cf7@#3O_}72gQcalh|Bu>Zvaj8dow?dLA`Ps%1H#y751A|M-4`fPE>HAT9+17QYI zL!!92OJLN8x>QG-Xse5jn;bt}O|v|lNHT(_l%HJ^sVOcoBBAmiR~A2Hbi$)uN-#=_ z4@HOz-F4<(h#x;#i9UL~DWEM?d9R>(K7;#9{D=VI(WQn;G^7tjLgwv_MCvPg)Q7#3 z%en=}c*Ln6ML6~v`=|Vx#ckolL*QmRYPPl)4#n$7lhTj<;jfFn>AIzluEr>lNco}3K9FAgwcKq z*Xt+f`iQtd7qem%^V?yJ@+_{;aD9u58mC{6kwY(YBZ zI;byqZI&g7dSzZKr)McBVYIIYC)2W&5%p?o^~@ zEn*pVal7rb|9F0>C<8B4rt`&znC#apF5{NAP>e`u<)ed_9~v69HvvjZk0nkc`ci)tK3> zZLk2PVPSs@w8S!7rc4X`uDjtD{oFFURSu3WQy%bEpzGdmE`_PP^@4@5?&CQg3c(h^ zjyRtoI;IcN6!bu?t^r*Q*QA2&(x_Tc$&>)+y#@0>%0AnQNLRsTrtAjoZw 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 IzLg&NU)ClEYybcN delta 16754 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 diff --git a/Debugger/debugger_lib/plugins/win/x86/503/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86/503/libpdebug.dll index 239d7f82ff3102acd3d5e57920753be8a97e0107..8c8b72314f6e388a144bacbce1da23d8e2204afa 100644 GIT binary patch delta 16690 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 delta 16022 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

3E(|Sr{(`#-^~d>? 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 delta 19476 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

F4>iJeYIY;Bc9*IH={tg3Sp$usxJXa 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 delta 19827 zcmeHvd0bRw-}jjVgCjT%2*a+9h>9zth@rTEKpqSdcU%Eia7APcaT#p19FL>uWoBiG zwyABTEo$90rgvakdDmUpZBNpA4_S9)xo7iyf7f+JMxUPdzxVV0^PbP=I=}sQ{jPmE z12rvjjYqB>!df;4Zq3NBcl&N<&zb8lukfV>H|MM<1wHxPrK(~Mf2*qC@M2XNhgYiR z0=`o{bVUi^%=K4R6arp4=dGH>;bjh6&b3`3=-)X#wro}@zsDj;#eFMgmsFNW(n~!ds730HRK%c8pl&1?>1iatCj*kc<-(N5f|w)&(z9%{++Ft)dmZn3_LUslhC-7h9eY`hW>EoO zZwu7hpUah`l#@9r?v#%er}5ZZD7n-4E`Vos7I2sG^`*qpKSvVBiKOPEMUr%yKZ@h0 zB+tlEWDlDi!t@a`m4)dIVY|Oe$cF2wkcc)Lk>+`HJ6lY$dL2-^x49#<9 zCr0Oiw2YfL3He$T^_t?UOe{P?jo>w3tU+|@SBl8?0ZN-Z>d|={GCGa~&t) z*R80ZD(Xj`V6bZy^+QiTv=ERFJV`(l^|+$uC1xlor#%}cvmf-yy8BsVP?}}pix8%q zP@Fl*dFrpGNtZ90LiJ@YNzzPz0VeCIaE2F2{xt7V(ljrQ3VB$8b*g``Bd#X)u`HQLSA8n#^5u6cX=q)du$_5$Y zVrtfChQoW2d!OOfK5UU8U;fV&_LgCYc?gs|yV3hv6@Kl_jBWGd?wcY>>bN9iX7cQ~ z;q{`>XL!!e-ptl^O!sdlOHy+g+9LCC6dFWvnX^~J*E>D@eTDUAKesK4IlM{>W#nzr zM|-h3!P8>8_@o~v`P(M;LZF@5jo{v zrE=;WqVmvuii+e|-6k~86qR)n4V>ENIZ3Jr%XY3xwB(}8bR5Et7`tSb@Ql>Vt4jK@ ziZ)*J7*6+UR2au5TAa-(PW1QcD(Po^$5X$-U6)q~aF)!e>2N~EY? zc+GoXkR)_2qs*Q+4T}5@W=Ab(jy$yyW!hSg7KymTuA8>W^=WK#=$!DA5is<29s9f_ z(Wr5m4@a<|u+H+s5v)hp;9oJMYv*E}9}*=iF8uT@!p+14iIT=R42Bzda&BD#OBD(9xZTUj!< zmesT$XCDrUqQ*7f%{4yEJPb%ZX|0V^KlGeTqbL!@M_%=FFudkpXke)x*XT@7c|N(l zsyNpry17|)Vj2;RT5JU-ASve*=d?s+!?eV-wCR#fpRFFhV8S$E>LlfQ?e5I9_$1pE z8so0K#57OO&eQ=>u5z*^%hLC<6APu9VN#{BR`E8}3>hYo{`ou_`Ja(hq33rCtnyrx zy=#18VJ@bNl8ZE8e37Xg_9N^(*Crllo|uM?O_`&r`2?&3)k}TWxXXY(YabFQbO| z$ZJ;6&2k+dcr(>cIb8?ZaaCX0pC-0t82IS-`hY!>WO|?+iz9UnTDS7BmC~!drr!CdCsoEAbG)leHPK68UN(eQy3=e-KKS&kb&v- zRf*QQrcT+sPiDFbgi0M$6tyMKIXf{e&pGEIPjY|C4!wbU*aLq@X_RnkoaRpoK#k3X zvvueLyq@&N);cji3?uY=U#)b56&wy|^)n3$sK>9dz3?fO+-`Fb;}FYZt4R;Ym4+NI z^=!m><-MGLOY6^>*kh61<*C20*lj@(PQEd528{j7OFi9jWE}Q z-C|(=XApBoCw4b<@UP6HPa%6({=Yq)WBu9V_OXzdLFTGBl1_NXvt$5|Qc2h6?_-l= zhROCq_GnD+s7KIq?#S&qPr^X24}=ln__Mp|A&Kj>&<^2dF8d(1lkDEZcE?58@8*4wCYK|*{yl3rnuB`Q8)%N^ zy;#4z=EMaU0k(S`LtllWR5^lLG+Q-}1Up;Rw|!bO-@t~&ckgVu zge{!OYEA0(L&)@G`I$FkR*mc6iS_F#M$Rv#Z>r!6u%@#lQmaqdcNB3jj7djx>b zVV!bRkD~rdp-q=N#Y>eE_$VqRlon&mM!OecUbxr?>P{Q>ida!TMZujpAMt(Thn|rL z1sOz%`G2+Py&SJplZJ%@YsQ5rd#LwkW^XJ)&laB-t*Dt&!I=KMIar6TF@h zE5&tHQKx(J)YNngg531?Dkmwf0t8VVsyM2nLn{IlwLRLzi_Jq+sA9@Gm9GxZR~z!w zIi~#df9IP0W0Q#|^&8xR=w88+?;7Oemklg710u9*hPxbtR1{t^7GD z-aO}OQ}%|{-rV#*P3!jZK5ieGp{NQb)3e!WD`IRN#f+FesLZlDNKtb`FW~)!qP8Vz zrAJ9WTN#v{zQD2?r9BJEv~C*QWDi=IWLp1EYCYQ4HRN0o)6(i+klT6R*4veT-jjkV z#p0TO9<_7@TdXX5{`p(`gpbfMX~>z-ppN&k5kY%?@&xv+V&3EQA<$SBbFT0@E1)`4 z;Z4-rkjuw-wGEudtL@g_tQ)6W_hylt=6f^jG2065Mo(o9udQ3bzn61fYF>*{IaVg= zY)kJfSLR{tu25og62(oW>u#pt#Lo7-X9ddYU)22bG`JZidFsc#cA%l#znPEfldvbuYCH)47pm8PY`e?rcIuyoqS*L4uIo(e zw?dOn*xWPKHqq~&111OR2)OgpM-0i5H2_86GPP(f}yCXzIqo0h!n#8Mg`dg@(qj-htw%C`1L19)Xon_8zf$6a8oTc$k?GTKn% zRFQHLC(I(svqd$Ag1`QxEm^@)t(P$v6z%#=o4=>ZaG57l!=M)1b^~;#{)mCr{60j` zv5h20b==We$I$m6LO*?xS0ed(8w}y=QCYH+vkscGzjY;N9iAj-Yp90dXRE0F1hrgqv?dZhzL+TjTETs!PJxW?(aiC}xz~IJ?N1{mkwGezyCg5l^%u<*kCDW$Uz!Y_v1&x1dJG;@nQ`?U?NB{VC)+H%1fiF2O^MgF= z4?TZivqBlDP~wNz6*E~`QrwU^+=zF&7q5A}q%syP?cSx@#pkd0s#nZ+^re?J52+Eb6+0@lEGB1T7f7jDZgeJ?Wx+jJ z^iIr5Syrch9!CZ^_17_o)T|_@{s<6lGz4Fvc{Sx{$IvXO$+m&$Kc;nS;nk7O>^*|* zhoMUkGWiwZh?#FovB>VB1nB*#s~qjPsjD2Nx!g-G1JJQBbARN?#>9Og84Y!c+uUpM zY*6^566Z({v_-1=26S?V`;YxMFEQS*whr#4HlbP^Cd%2$UXvwUBoFw3w_h z20hy_cEX_iEe!Zl|DjHA7DZU z^%-Vs$VLllANg|W!vu9v$c_hb%~e8X6I7(2?iN&`pqlkubFiS^6x3|HaI;8|YXp@n zD1%V_ntGB`pCBlQpf(B396>D>)D@H(nvFEjT>AZj+9s$4f|@O;K7tC`YWH2A(q*io z8h^&77_Gjen5O)zg&J!bQJM;uZ0+5TyvwLhkW1A$miIl7wgl7riM& zyM(BN5PilS)(O$tEvSEFMzb2?c%IAF3)x&@Mw6V^yj1YU3SNj%&*SP7h3IY}l7vXd z14tL5cpd$bEEStXJQJs0TsN zL1|rLG5TT3$F5PhD}QVvo833T4n>T+DqM}xI;o(L3*pFXUQ8Z12P^p?urEy~_9SA1 z6G69L7Cu1pxC@*6LW+VFQbFjkh{)3cGtLDI4C8rVMm?Bba}?P-^&ZTyo(s5O#=&M2 zkBS!PH~T@j_Cz^?r28we=i&Q0ob7N+bqH3t%Tv_PX{ExZ#7g_9qUI}BYy$lC`C$+S z55Rz5+TCFgiHw9kTbCRuk8-hH$sOftD|;)sgB;>w=aM@PQ15g~2Tb_<5deMG zZ$V@?Yo_`|CLIGWDrz%!C|v&|v3YOIqy5OI9ETNA6-ydN@NOP`3nCVk>yzgT1SD}6@&Rbli$ zsyPc9e^t%T_hlEX9rYnT2lAVOaSBs44`V%-papKAXNyY9aV;PF0pmhvPtZ!0Bfv=+$M5B5Us zulm6V?$B3jnbC+A2S!$&5}np=9C>QJxc_4;(XEHWpE#{u+@I%!+UOb8kGWH7!W+>S zaMZJS!m;Wq>Ia@TtZdwXCGz&6?8Jb#4BIh-dCeUQ*oM^m<>^D1Zs0US0|qm;>Z945 zft?IA?Rd@YN3%@>`xvHj;`{s9v4O>MdOEbbvr%{7YoMWvW9fbDiMu-*CUfH3e0Kcq zB6;v&D8;eiX*s%lwm$8M{C=-P8H2KP_mw<^dPtXTqw~_=w_!uUZ%y;S^o+(13hQtN zaBU?|G4gojpI|0r`zJEIBJjE?>izXO+mtHSCG0 zJ(!$bBs*5KS=sl<>8sh+X}#EI**)a%S211AB6;~LR-Us^HmqV_E4?S7 z#~QkJbKPh0ocxJO^Py)EF;xAil>nIKf)#HgCZF_`?9e?g#t$P|qsJLTM&;Of{LrL0 z@40%x;8`BSR*g)TpXtetjO?6t6pH>m;Q*&wd%|O!)_Q_VC^vep#BRN>Q63@Z|Yt6ziB9D<6(xgL5tT068_c!G0hTLEua)uI+DiV0`;BKL?MQ_zFtj zeFE;sW{$2rurDei9GCIY*u9?1LK6;r)9XFbj17a=d@das;i@X$RZ*|!;)|Kf{0M9_>BbT*`dejdtfP^G zub`(g;kX+)76m;uh+0%_@Re~{d8=I%w+pI_qe8fhXUX)!;alaaB~zt{_WUT|0vM*a z`L}Z%A+qVh^%TE)cNOTo=I;>>21-ZXmd4NF2|hi$$(bl%Hh0F`QC*0|9+xo%yhT|_ zdNeO1&7m&y9<(?5t6%Ag2=_H(20|Q2UbSXSyS;RdC9S3F&h2iM&O@d*-ndn|Ix^J? zG!Z4j35tHI@-Y~;B7jQi1-BwH6nU6)u3EZ3Rk z&Qpz3z|E}Jd8+Bup}yDrosQO~p;=((rVqE>o$GL0a@Ef~?|;kwIc}J|@mm%#K2;v~ zExUKTMeg@4TQt5vKK~7SXZ#wu=$k{sC(Hp+h%#Za>%8uttm?uB6Sk9jP0x*|U`kJ+c!%9rM{uoAe z%jcwW%F{rHNtf}v{#2NWJr0!@?GBI^eZs)pr19Kotrbc$60I^JU37^7(0Re-509i^-JRYoAXTD-52KJ_kOA^rb*Bn!0Xf*XBMP zu^ekH1{*%kiw;;b^zpH5@4Q}jO)8*<_(FYONinC4W#{H~l*7le8}mLi_aB3vR~dYy z4S?rIyc_iKW7t=vgWC4#%nRSKGqaRMMclM->MH<`IfT?+E@1bT<;(jD*kfh=hgBkn zlykU54NP%gD4-kBnc#TJ@C_?tzZ}ix z&i`KS+==Bc*wFQncnTR4(heYAa}6gOkG2hz+`NeRxx(ytc6~t?`$zY|(*eX!#|wPy z*S|iRVkI0s9rQg!tNPspocd6xlV%3+2(TLTKjupk`EAgD2Mogvy#Hv}VRQjWS>UFA z@B?^CL!eFutCinXH9mMR1kSubi;t_r=vv`p!t%8a?AXG1`Q0_Ak;Of9Ch*CbQ1R1rd& zQ2Jmr`*lhGm`9riJW912Q?MU`^c|ZBgeeBorSb1#}GcJvmi=tTfrNiaO zC|0_3th_Cfy|uK{z^##@$Qk%<3KVDI;LGRY+@1BOsr%q7%Ne>AT6@9`Fr7Y8peNsq zVqp~t>A&Vcl78H_1ZRV2uX!waQgfmeXHF=7LjwvssD6YunK_OVgrLuw+2V>prK`yv zv#g?AIfLH4oJjPU>F7B>CE>G$4c{1t?v6saaMNdQfD`fC8pnyG(8R{!ZZUKX@)d99Q`J$8aiF{h_6mdR@fZAiQ0R`MZL@XGgG&w!ZcgZkqfz zT2V{QhXsy8NX;*_;)>&#rFj=<@$E&t71u^=6{O~Mr03dLNO+YWzR(XZ_QS{f;fmXv zb<22&pTO#eCjzG|eHlh4{m-4bPc71s#<8S|jsWYbv-D2e@tlRx5SyS87=)V2)=}69NJt5!C>DF^mcTQ{P zqS*Fq*ZtG)n$-Z$YMkO4ZS~y$HfvLr9x=ZbEYXYAjaWgX=A^gT#Hvd9;NRHks&4Yp zE$sKIWwQBitZc=Tvwt3i?x$kb$6Mb-gt&M9l+XtK#{l#w>5Y|E>bw?3jq#Lk_If=F z=rxyK|MfEkq2J40ox+DF8*X->>QP9VwV5rbj!#-mQrvM_^VPZuJx0f@0Tz4JYa;LM8hloRhc(!AM9AOM;6V-U(BK0aT&%$Y4Gz$tMT0>a zym(mnYj>1GyVOk}(q&CyghmTB{FYe@r2XrH^O;8bo~_XXHP}&uvIc)3J>)MP&7NpT8u?^`Hw_=0o9jf5{6k3dvc(J9ENCwDgA-XFTL> zKr4V2KzjZvr&Z9Wob~}GajjN8@@IKox{GgDGM*Pd->+p~KNM~zSM~cfeE=%t8P;z@ zIQ#vf2>ZSRt(lT@s)oO^I1CRK$m#I~M^$e1^Gre1fG!54$ERlizHc9A@fYcNKxc@t z)v8Ffm-H;x;V)7wgyNmGM-JW3wdxTq35T5N%b4sF{q)*`E&yH5wJ6^OqQunDm3|qM z!+Ow`TZ%&OuL4Yi-kkwbMv2d8#sJtRNabv)vwM%0r(3=H>YKvc1itT~XzJN9XG)>( zk4q@u3Zxh6kTw9p^ z*Nx%9rN_|apTz#|N&L;pU>)qQg7Q6v-9Ah}()K;LkoFRufzXo(zCFv=RPf)0wY`ee1_IZlJL8=bEK}8 zjoB2XJIn3duq%c%tq!pilK(1DzGs6UPCU}~J^nF}2j4SxT=qE2^bV62b)BFbncU{x zwjcF>bepTz-m*}V`c}@Vs!Uw8m~_imizfH+60KIL7Q6zqyWmwxO>5~F13r4iY@SCg zR#pVsw~YQYCoz?HXfyhSp48WBoi%qJkZoe9_strM>yfNXaK=goFu9UoP5@JizFlz& z@hrFTa>-aqx}C@MtgK{ncz)V#k^(NtxQ#cSdr)rYalHcYO3_h$f1q@j9ornFbq6j3tpO40fIR*AoA z+VBecF?r;4VijfL`-`l;bA%54WmX;Oi0bZ7I^~B@bFI9NDa70WreC`ZARcYe2C`SS zgm=i$!G-WBQU9-ll+%e7QWN`nOSoCtNL-*4H#Vv~vKU|NiffZ%s0V~UfX`D1 zy)$fX(QHp`xc#52P@pFyX#^zHAF2P)vkMRzO8WpY&ZSp1eodIrI|@khF91n?1CSN~ z+CtM~1tfnlMx7Km6U_npj3+QseEdO1saL6iC2x)4F+@XF4Lhmk5m#`~X z!-j2-oH7kAsbs7CT$4NBQ`bSLe*#F)mX1RIbHG5*#!iB^0MhdyAeEGLVxw4JJ@ukG zwwlG+&md-smuvaG>R~|qXDp(>`~XO_AwkeJfJ86uCg_cTL_gJC(Di^s#|#XSk_N;} z(Yp3hyO!W4!X+KOdy$ z&mN+{!+Hw(Uw~BLm|lYJ3)lu|Iw1KFO=*-O2DFocw#ntx1_cPEyq6Tk6?DCYVJsju zV7K1vo9#W@Q_UqoZ$4P$$GwJie0X3-3Q6iKSmOcd`OGS^{K3j99`1G*NZO< zA}CzN?%S~>dKkP7$J&2DOe!rtnti$>J(xnPhu@Yg7W+tSM>~s9q*BaWkEG~I*|A5$?W>+g*XIi2)r2NX1M1H+*|D_+@5~tCa@bg*yB3ftg>2~g z8IWrH5}*vIgB?8`0BKCb1j|xz|DXaM1Hz063Fst+jA&C3gyP;}nlWUz$<{)&SBAvC z+SzfGG#NgS0$&hya665?*6+dC{Gr~*W6to?jY({sp~-#P<1|Fsv`5?7YvC$`V$+^_ zgjlHIEpS1_qCa?~#{oz*>Coc_q+-Sx^^$Q!+j2v3YYEb*Se*i;$g%Cq!-_-s3=s+* z*>hvOLTk{W$wBWL_T!_mb}LQ|89pIkT8(G|V%2GRf2zguEg+djOchn!8<2dH4LvzE z|Ffzo{}_uwvdj*Z;s=Cw|%BYgSyehNSr5hO*-Hb~ocSz<$HN>YC$D~`0C zVbe;p!MkGZ6mvODd=G_3X(!Y(d`yCCTN}zcM}#p2kRBssWW&SI8iss|hG~a}36X*- z#C)pUo|l~)2G-x6nH3Ic$hgZyM&|+P8RpCAj)w3#r6Ae{VzZKfnRcZJ>Yc@sG-?Sh z#bHZOC+j3yXmrLv$v7Y*STa@w73d-iyuu>zM}rXqPSV({}T#=HjVW7dQ>#p(__VS&*{Pn*33q4=9 z)`Pd1v$#!dgA2eDap1TVNk=Ps{5`I-;keZExb{yD4nkiC4PV*^`URwVq&loZZy#i9 zb|=_rhwOVAUjtT))$>&!2le_o)WK8yco)HQgLlS{SAG~eTQOkBhxTj(uO7ToKi)y` zn!u|Uww<`@$6zLbS?H&@=_oSTiW2?*JJtWUcdE0|ME}?CR1bCD`?xM;f;6Y9tdhD! zQBldPiprw0B{PfYsu8=2qM~J$v&)tg&04Z((UQeQ%jcF?;No)bp*NpWbS&$c1Qzg2 z#-TaSJTBuNe%-cx8TOq!#GMKD$u%?x>NVQhLC}pFT^BFtCXJRf`l?1-G}`cp(6ht| z7_HI88l9xkZb8qG(lkbmrcj{KO|im3@f{ATG#YzG9x#4g&taXWzf+^#L~rdJ6Vfu= zwv#Fg2WB>Ae|H_d!`Y_&5y1BBPsaNn`>m*sP&+28!ANvq%>cA%cpcy+Bn$Xbm?TX> z>J7XY(2g_&I2}(5+hbWGKA;_`iTHqz$0BRsh)_aQ+&{r{8r}pL9tRuB81*L2Kr%cF zM}YKay2MBINC!2(8}K)ck9LqcA#q#4;ToO+_ykfY{L}%uH9p!^+J!{^>F~7=b4wv` zw7;DnMy`UOL&9hd$86x;rz|nTRD53&DmnNtM{2LM( zxB+i!d}*j84MifS8GuWWB9K`*;3r5H;7x$WVZt^PFd2#bTLEWi{9?fGHNO4UVFt!@ z$XSGx0i0kZQX%jfz{^M!5N&q)WNIY=RoPg)$PeHY zoQ3L12XN*+X#clBl;4AkpOL~K1MpEKDrFs@nkRl=QVaOu81!oB(bAoT`L@F^tvZwGF`Z;`0l=^V3p3ThF2I!D|+6@>v#TlmMOqgL!MLI9*0 zi5md^QG^VzxnlLZI5ke>yB0IWVeH#20p=_*n*A+ zPFvE@c^GM=4`@GJCY;h1lK#B?ECgo&e??O2QDuPEg+hm584_i@5U@_e3BIP`hXI>3 zoZux5zX~{c5&8gpP6OP81V46;)Coc&*o;J_{0Z`5zOa2RmR68tC)_;|o7B+?=H zl!iYI_?w3R4j57{0*wb;sNn=3S&AB|$2g>gNU!dEV~SC13Ut-6p11w_zV(t zM*8m-Um{V)1Yg8*82t*G0I;(SO#qy>n6r>bXC2^i4W}(-40f)>$Hzvg0*N|lCH*>g zJ5p~L6MR*}8v!?0VUq{`(}2w@P#WOB1J+fe7Jw5xjzrDj0Ss6v@OFR`ktpawz`Yv& zG~h=_6a*dZZAg6nuLAN9q}gyvcQoTxqsoBeyQ%a5QZaD4RHF;E78uiI16@d*d0xPm zfHwiB(|KSG_%EPy0ro~B{WQQrq?#Au3($cip;On^p#9w-sz4C@5{V25{(%(wvcwNm zUDo1~4>+B7=zL;D(-5>FEd)-G&Jtuxkj@K)6Z{G(6a~0-6^z=VE8;Aqyr-iDG8sfM z1jT@lA!R?!ItMI2c+e2or)AI8J%+uZdkgm#?=9V1zPD=c&b@Ve_w9A>ZQOfiZ_D1R jd#hfmeQD=Qk{bhtrM{kS$k Date: Thu, 11 Jul 2019 14:54:11 +0800 Subject: [PATCH 033/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86mac=20clib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/debugger_lib/libpdebug.h | 2 +- .../plugins/mac/x86_64/501/libpdebug.so | Bin 37220 -> 37288 bytes .../plugins/mac/x86_64/503/libpdebug.so | Bin 37348 -> 37424 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Debugger/debugger_lib/libpdebug.h b/Debugger/debugger_lib/libpdebug.h index 3529291..0932031 100644 --- a/Debugger/debugger_lib/libpdebug.h +++ b/Debugger/debugger_lib/libpdebug.h @@ -3,7 +3,7 @@ //1.使用源码编译,要打开宏USE_SOURCE_CODE. win下要设置LUA_INTEGER和lua版本号 #define LUA_DEBUGGER_NAME "LuaPanda" //debugger's name in LuaDebug.lua -#define HOOK_LIB_VERSION "2.1.0" //lib version +#define HOOK_LIB_VERSION "2.2.0" //lib version //#define USE_SOURCE_CODE //using source code to build #if !defined(USE_SOURCE_CODE) && defined(_WIN32) #define LUA_INTEGER long long //set LUA_INTEGER. In 501 is ptrdiff_t. 503 can set longlong(64bit) or int(32bit) diff --git a/Debugger/debugger_lib/plugins/mac/x86_64/501/libpdebug.so b/Debugger/debugger_lib/plugins/mac/x86_64/501/libpdebug.so index 535bc4ab10aac0c16168e5cdf8ef6b2258d36d8c..ceffb5d70fbde74e917e8e38e7fb7ff5ee682301 100755 GIT binary patch literal 37288 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.*MrN+G8X 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 D7#0oF diff --git a/Debugger/debugger_lib/plugins/mac/x86_64/503/libpdebug.so b/Debugger/debugger_lib/plugins/mac/x86_64/503/libpdebug.so index bf7fdc2312496d1df5d8b8280f52e2a89c145162..07f4a2286fa632f0026be446008eff555f6db6bf 100755 GIT binary patch literal 37424 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 Du~BK@ delta 13637 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 Date: Thu, 11 Jul 2019 19:10:17 +0800 Subject: [PATCH 034/431] =?UTF-8?q?=E5=9B=A0=E4=B8=BAc=20hook=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E5=AF=B9xlua=E5=92=8Cslua=E4=B8=ADdostring?= =?UTF-8?q?=20filename=E7=9A=84=E5=88=A4=E6=96=AD=EF=BC=8C=E6=95=88?= =?UTF-8?q?=E7=8E=87=E4=BC=9A=E9=99=8D=E4=BD=8E=E3=80=82=E5=AF=B9=E6=AD=A4?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/debugger_lib/libpdebug.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index 7f5a2a3..f6f7527 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -20,7 +20,9 @@ static int stackdeep_counter = 0; //step用的栈深度计数器 static lua_Number BPhit = 0; //BP命中标志位 static char hookLog[1024] = { 0 }; const char* debug_file_path; //debugger的文件路径 +int debug_file_path_len; const char* tools_file_path; //tools的文件路径 +int tools_file_path_len; char config_ext[32] = ""; //后缀(从lua同步) const char* config_cwd = ""; //cwd(从lua同步) const char* config_tempfile_path = ""; @@ -279,12 +281,14 @@ extern "C" int sync_file_ext(lua_State *L) { //debugger路径 extern "C" int sync_debugger_path(lua_State *L) { debug_file_path = luaL_checkstring(L, 1); + debug_file_path_len = strlen(debug_file_path); return 0; } //tools路径 extern "C" int sync_tools_path(lua_State *L) { tools_file_path = luaL_checkstring(L, 1); + tools_file_path_len = strlen(tools_file_path); return 0; } @@ -705,12 +709,23 @@ void debug_hook_c(lua_State *L, lua_Debug *ar) { if (lua_getinfo(L, "Slf", ar) != 0) { //if in c function , return if(!hook_process_cfunction(L, ar)) return; - //if in debugger , return - if(!strcmp(debug_file_path, ar->source) || !strcmp(tools_file_path, ar->source)) return; + //if in debugger , return + int source_len = strlen(ar->source); + if (debug_file_path_len == source_len) { + if (!strcmp(debug_file_path, ar->source)) return; + } + if (tools_file_path_len == source_len) { + if (!strcmp(tools_file_path, ar->source)) return; + } //slua "temp buffer" - if(!strcmp(ar->source, "temp buffer")) return; + if (11 == source_len) { + if (!strcmp("temp buffer", ar->source)) return; + } //xlua "chunk" - if(!strcmp(ar->source, "chunk")) return; + if (5 == source_len) { + if (!strcmp("chunk", ar->source)) return; + } + //code section if(!hook_process_code_section(L, ar)) return; From a2f5093b387abc1917eabf2ee86a7c17d168e0d9 Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Thu, 11 Jul 2019 19:17:04 +0800 Subject: [PATCH 035/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0win=20clib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/win/x86/501/libpdebug.dll | Bin 37888 -> 37888 bytes .../plugins/win/x86/503/libpdebug.dll | Bin 38912 -> 38912 bytes .../plugins/win/x86_64/501/libpdebug.dll | Bin 45568 -> 45568 bytes .../plugins/win/x86_64/503/libpdebug.dll | Bin 47104 -> 47104 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Debugger/debugger_lib/plugins/win/x86/501/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86/501/libpdebug.dll index d4cc4ff54afa338e2f1104ca76f1f158fab1981c..64f33465c8d1c250ecd0e6d13e90c83fa7c2ffd7 100644 GIT binary patch delta 7397 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 J0`X6~{}i70 delta 9021 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 F{s*fez_tJY diff --git a/Debugger/debugger_lib/plugins/win/x86_64/503/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86_64/503/libpdebug.dll index d482b916d4ac65d6140d80ed7d43cf84b9f9bc06..521cf0431afa021171a5be17ec4da2fa6ebd0257 100644 GIT binary patch delta 15043 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 NW?^j_B<(ur|3At-s{{Z5 delta 14937 zcmeHudstM}{`cMk8%Gpp5QdA0jDmuSfZ_!~6clu;gO2z69r2PV=%7gHpaUMq?I^gk z%rZIZFSE>J(lOI6m?l(a*0D0{l%BFPq!o6`G`0PHzI$y1JH78;@AJI>y!(09{(SH2 zzV=#cptQkI+F+;>JB_;BWrm+sfKQ4@B)vi! z*O|Eb%ku=`oc74B8*$zRqsSjV&vMrTm9=LLUkF<`J`EC(YS&+0d zbzKsy)9yQhhP&QTQ6O3QSXMspE{3>5R?d4XduYV_-i;t+<+QBWVlw39b6z96CjG7D z!URn%O=i3O!VCwJ*eia03|9uRAN1I?1e5H^`O*6YTVm|Q_O*x?r?3kx!bFG0 zw=%{XZq8!;jWOmu@f51j{AL2nH|B^-*-7JIliIzxY7A@La#Y0mnS!8sU7K_f*y6snNjXt~IIpj-3scjDQ6|M})# z4++cSQJjwKu77+R5ko-sj7!ooi(`FS^%du^C9Up@O7-H_$)ebaJrfWvPGH9arnU*0 zN{yD2NDX#=0<*U1m+Co6BBSiaTPh{Sone&I0*Z*Nm6ikOadeQ~(_^f%67JnI1)8+T z@vO4V&=#JT1VObdU|+UL700u1Q?59gtu@7nd)YoyYUqzg1i|K!&a4uI6IMjADRmf3 zmF#Cz*Is{v4nwNu1q_`U8dRsx(O5#CXL{_SYT3&5JDc=utGP?eE8vye?yQ&$cjO?L zWGU~_xTxxnHd8(YsakT`XXZ{}>tOhkDZa)n-Tm8xEZmk6EGRHGWGs}~7_lD9P75ec zrjM+4PG|PO4u%ddu!2Bqs~gX2?ibvax7bsG+2SE~HP8~%5}^c#H80b&wB|piZ)@^Q ziPG|Yg0MWmro5YlQdzyptX z7ET6g8&5z9%`)YE?@?4n_C$Id7&6ruGB(AsiXCpdCLvrmIG8F331AXmBoQZSY6Z9!dOmi#bbsNM3aAYH#1(q?VflgIOh_d}xKBSg>RSYPB303BLn8~kNutPzdz z7m(hP4#Z23z96LVsia5+WTMTlJdMgQXD5GSb9bH%POI{;XHhit%kLU@hy84cb2eZA z$x4IGog0&4bI<>acUdork``X|yA?*j|6FOaN$!3Q} zh#lEup`*lS*n6R!5=@0n`A^&bQ2xFLsfNu$Mek=3VR1bUVl*}8E?XEtbrGd*`%kF5bsR zgr^1{k09lQH@zQVG@*=gnzWnk3?F3pY8v}2JU-;tl>f@=fOkEMXxGuu(18tX7jF2a zADhzds5pbQj<6cce`Q}qggRGgLxTzwp3}U;x1x!u_iE5(^?QFqr&x%#nNYLA$z<1L_^mn zSY%{q!Z~!BBhoZUTX)lTqGD$EW9V#8zz>hml83Lq>@Ip!`wFz)!{$b2wBLoVExPho z?@P&4p4&Dh-y|zDezhrmR53krFV#yZWOZBurX0F{rcr;g~~*sPEny^HNJZt zmS3$?_yUwMmpahp9I%!zoKc1!FAhE)Zdl94xXxWq{rR@yC~4~ zc<1vxo`F3t<#bROMp_p2PoNFTYl>Q{Qg&0ex5XkqHK6wcfxhiV^BE^$!;~Z|m)V+5 zDU)W+MI?B~$jV5o$DW4f({TM91R2Cc0hJ6Z7bMImJNjlKuq7tx(h=`BwdS5-5_B9g7|%rZ6ccOU!2@ zVsgb3>~As4V}qV1uTNlIUqzoSOUZ0)QCY!Z35WSi?)*+*_s6MY&(d17kcL(()~QQu z;xuXj`J=_bOT5G8q=0rR27ewP6{?b4|YG6fyFQ=F1%2W>w(sWAV#1b<5ew2pAzV_&zvQND^yD;0?_d6gUIOgFw-$HRdTkQ zg+4Nyj%9)|fi{)>8x!00Xq;f${7+D_vcih4yUr-ySzGrS(=qd4)3Me<_YaF&$Z8GR z==<`IOl4OzTj^wzT~rpL{kbviTT$j`=TQBz?8W1gM@4%Ya&6=N zzgpA^t>#zsef>%;E1KKh-FH-#9Opq~nskd+sa>13Mdqw&(*|_Ask{_#*)uXlk!GW8 z=x4hk{q}@LVM%9Wy2d&!$nAvSOLhTMVC3EYxvIL-UxJn3=!jLRPc(w^-8e*8BLjND zj0$kM6X6gm4lA)RSB50HrIi}d+by+(kuoICE!ANL$=YhOC-0TQDMAX}(1viu4I)hO6e@!TXqCv}jC4hMCGI@Kr6hDw(@mtdq`IDKgD) znuWE}XSAZ>!C?sHN&ZN++=T>(SIbj0&G^Q)0;Jc~l6a|%#B@Ydq}3Wp!ev}&#({Am zNP4t0UCQZm8RL+n6%*IH%|{T-F#ZosG<*SLv3|V426hkeUx?)ti=b-R!)A7G?;L>= z$R4Sck#dq^IQM=Fjr+Dj(~aibaSG*;0y$^kmZ$wR%gtO@#JMh<>⋘oU4~K%MqMA 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 From 750fc9c236f12584779655778daf1d5023b6488a Mon Sep 17 00:00:00 2001 From: stuartwang Date: Thu, 11 Jul 2019 19:23:17 +0800 Subject: [PATCH 036/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20mac=20c=20?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 2 +- .../plugins/mac/x86_64/501/libpdebug.so | Bin 37288 -> 37392 bytes .../plugins/mac/x86_64/503/libpdebug.so | Bin 37424 -> 37520 bytes package.json | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 66cdfe6..b71adb2 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -49,7 +49,7 @@ local consoleLogLevel = 2; --打印在控制台(print)的日志等级 local connectTimeoutSec = 0.005; --等待连接超时时间, 单位s. 时间过长等待attach时会造成卡顿,时间过短可能无法连接。建议值0.005 - 0.05 --用户设置项END -local debuggerVer = "2.1.1"; --debugger版本号 +local debuggerVer = "2.2.0"; --debugger版本号 LuaPanda = {}; local this = LuaPanda; local tools = require("DebugTools"); --引用的开源工具,包括json解析和table展开工具等 diff --git a/Debugger/debugger_lib/plugins/mac/x86_64/501/libpdebug.so b/Debugger/debugger_lib/plugins/mac/x86_64/501/libpdebug.so index ceffb5d70fbde74e917e8e38e7fb7ff5ee682301..a1e4f3c823ad291b9065648045b3a76aaffdf77f 100755 GIT binary patch delta 10455 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 delta 10177 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 diff --git a/Debugger/debugger_lib/plugins/mac/x86_64/503/libpdebug.so b/Debugger/debugger_lib/plugins/mac/x86_64/503/libpdebug.so index 07f4a2286fa632f0026be446008eff555f6db6bf..cca62cf2eb972ceab66e17132f6f3392bd55bcde 100755 GIT binary patch delta 9926 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 HLE`@dom-dp delta 9827 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 diff --git a/package.json b/package.json index 39acbe0..a7a5670 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "luapanda", "displayName": "LuaPanda", - "version": "2.1.0", + "version": "2.2.0", "publisher": "stuartwang", "description": "lua debug adapters for VS Code.", "author": { From 8cf0ac5d3928c38bb24ba3e7a0da0a3aec021a35 Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Fri, 12 Jul 2019 11:15:58 +0800 Subject: [PATCH 037/431] tip --- Debugger/LuaPanda.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index b71adb2..5d508ee 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -2446,7 +2446,7 @@ function this.processExp(msgTable) --表达式要有错误处理 xpcall(function() retString = f() end , function() retString = "输入错误指令。\n + 请检查指令是否正确\n + 指令仅能在[暂停在断点时]输入, 请不要在程序持续运行时输入"; var.isSuccess = false; end) else - retString = "指令执行错误。\n + 请检查指令是否正确\n + 如果希望观察[变量的值]或[表达式的返回结果],请在表达式前前面加\"p \"\n + 如果仅希望执行一段lua代码,直接输入即可"; + retString = "指令执行错误。\n + 请检查指令是否正确\n + 如果希望观察[变量的值]或[表达式的返回结果],请在表达式前前面加\"p \"\n + 如果仅希望执行一段lua代码,不观察返回值,直接输入即可"; var.isSuccess = false; end end From 6265bcc4ed1d89c4ceebe34ce9a2d6058d962ba0 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Fri, 12 Jul 2019 14:55:37 +0800 Subject: [PATCH 038/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E8=A7=A3=E5=86=B3=E8=BD=AC=E5=9C=88=E5=9C=88?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dataProcesser.ts | 37 ++++++++++++++++++++++++++++++++----- src/luaDebug.ts | 3 +++ src/luaDebugRuntime.ts | 11 +++++++++-- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/dataProcesser.ts b/src/dataProcesser.ts index 20f9a5d..4cfe497 100644 --- a/src/dataProcesser.ts +++ b/src/dataProcesser.ts @@ -44,6 +44,17 @@ export class dataProcesser { dataProcesser.getData(String(dt1)); } } + + //最后处理一下超时回调 + for (let index = 0; index < dataProcesser.orderList.length; index++) { + const element = dataProcesser.orderList[index]; + if ( element["timeOut"] && Date.now() > element["timeOut"] ){ + dataProcesser._runtime.showError(" 回调超时! id" + element["callbackId"]); + let cb = element["callback"]; + cb(element["callbackArgs"]); + dataProcesser.orderList.splice(index, 1); + } + } } /** @@ -78,17 +89,24 @@ export class dataProcesser { this.getDataJsonCatch = ""; } catch(e){ - this.getDataJsonCatch = data + "|*|"; + if(LuaDebugSession.isNeedB64EncodeStr){ + dataProcesser._runtime.showError(" JSON 解析失败! " + data); + DebugLogger.AdapterInfo("[Adapter Error]: JSON 解析失败! " + data); + }else{ + this.getDataJsonCatch = data + "|*|"; + } return; } if (dataProcesser._runtime != null) { if (cmdInfo == null) { - DebugLogger.AdapterInfo("[Adapter Error]:json解析失败"); + dataProcesser._runtime.showError("JSON 解析失败! no cmdInfo:" + data); + DebugLogger.AdapterInfo("[Adapter Error]:JSON解析失败 no cmdInfo:"+ data); return; } if (cmdInfo["cmd"] == undefined) { - DebugLogger.AdapterInfo("[Adapter Warning]:json解析失败"); + dataProcesser._runtime.showError("JSON 解析失败! no cmd:" + data); + DebugLogger.AdapterInfo("[Adapter Warning]:JSON 解析失败 no cmd:"+ data); } if (cmdInfo["callbackId"] != undefined && cmdInfo["callbackId"] != "0") { @@ -118,6 +136,11 @@ export class dataProcesser { return; } + if (cmdInfo["cmd"] == "tipError") { + dataProcesser._runtime.showError(cmdInfo["info"]["logInfo"]); + return; + } + if (cmdInfo["cmd"] == "stopOnBreakpoint" || cmdInfo["cmd"] == "stopOnEntry" || cmdInfo["cmd"] == "stopOnStep" || cmdInfo["cmd"] == "stopOnStepIn" || cmdInfo["cmd"] == "stopOnStepOut") { // 进入断点/step停止 let stackInfo = cmdInfo["stack"]; @@ -139,7 +162,7 @@ export class dataProcesser { * @param callbackFunc: 回调函数 * @param callbackArgs: 回调参数 */ - public static commandToDebugger(cmd: string, sendObject: Object, callbackFunc = null, callbackArgs = null) { + public static commandToDebugger(cmd: string, sendObject: Object, callbackFunc = null, callbackArgs = null, timeOutSec = 0) { //生成随机数 let max = 999999999; let min = 10; //10以内是保留位 @@ -154,7 +177,7 @@ export class dataProcesser { ranNum = Math.floor(Math.random() * (max - min + 1) + min); //检查随机数唯一性 dataProcesser.orderList.forEach(element => { - if (element == ranNum) { + if (element["callbackId"] == ranNum) { //若遍历后isSame依然是false,说明没有重合 isSame = true; } @@ -164,6 +187,10 @@ export class dataProcesser { let dic = new Object(); dic["callbackId"] = ranNum; dic["callback"] = callbackFunc; + if( timeOutSec > 0){ + dic["timeOut"] = Date.now() + timeOutSec * 1000; + } + if (callbackArgs != null) { dic["callbackArgs"] = callbackArgs; } diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 3c17124..2a17237 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -511,6 +511,9 @@ export class LuaDebugSession extends LoggingDebugSession { } this._runtime.getVariable((arr, info) => { + if( info == undefined ){ + info = new Array(); + } const variables = new Array(); info.forEach(element => { variables.push({ diff --git a/src/luaDebugRuntime.ts b/src/luaDebugRuntime.ts index 84455ba..2b67ba6 100755 --- a/src/luaDebugRuntime.ts +++ b/src/luaDebugRuntime.ts @@ -131,7 +131,7 @@ export class luaDebugRuntime extends EventEmitter { let arrSend = new Object(); arrSend["varRef"] = String(variableRef); arrSend["stackId"] = String(frameId); - dataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); + dataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs, 3); } /** @@ -199,12 +199,19 @@ export class luaDebugRuntime extends EventEmitter { } /** - * 显示tip + * 显示tip info */ public showTip(tip: string) { vscode.window.showInformationMessage(tip); } + /** + * 显示tip error + */ + public showError(tip: string) { + vscode.window.showErrorMessage(tip); + } + /** * 命中断点 */ From d13fac0f6771ec23c6b7ca098d05925bdd9a319d Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Fri, 12 Jul 2019 15:10:00 +0800 Subject: [PATCH 039/431] tip --- Debugger/LuaPanda.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 5d508ee..402e203 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -1018,7 +1018,7 @@ function this.dataProcess( dataStr ) hookLib = luapanda_chook; else if not(this.tryRequireClib("libpdebug", clibPath)) then - this.printToVSCode("Require clib failed, use Lua to continue debug, use LuaPanda.getInfo() for more information.", 1); + this.printToVSCode("Require clib failed, use Lua to continue debug, use LuaPanda.doctor() for more information.", 1); end end else From 0864b428c480759b999d70974e7df7ae1385e9c3 Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Fri, 12 Jul 2019 16:08:08 +0800 Subject: [PATCH 040/431] tips --- Debugger/LuaPanda.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 402e203..271dd3f 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -242,6 +242,8 @@ end --重置数据 function this.clearData() + OSType = nil; + clibPath = nil; -- reset breaks breaks = {}; pathFormatCache = {}; @@ -333,8 +335,8 @@ function this.doctor() local strTable = {}; if debuggerVer ~= adapterVer then strTable[#strTable + 1] = "\n- 建议更新版本\nLuaPanda VSCode插件版本是" .. adapterVer .. ", LuaPanda.lua文件版本是" .. debuggerVer .. "。建议检查并更新到最新版本。"; - strTable[#strTable + 1] = "\n更新帮助: https://github.com/Tencent/LuaPanda"; - strTable[#strTable + 1] = "\n下载地址: https://github.com/Tencent/LuaPanda/releases"; + strTable[#strTable + 1] = "\n更新方式 : https://github.com/Tencent/LuaPanda"; + strTable[#strTable + 1] = "\nRelease版本: https://github.com/Tencent/LuaPanda/releases"; end --plibdebug if hookLib == nil then @@ -406,11 +408,11 @@ function this.doctor() strTable[#strTable + 1] = this.getCWD(); strTable[#strTable + 1] = "\nfilepath: " .. key; if isAbsolutePath then - strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。" .. winDiskSymbolTip; + strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。"; else - strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。" .. winDiskSymbolTip; + strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。"; end - strTable[#strTable + 1] = "\nfilepath是VSCode通过获取到的文件正确路径 , 对比format和filepath,调整launch.json中CWD,或改变VSCode打开文件夹的位置。使format和filepath一致即可。"; + strTable[#strTable + 1] = "\nfilepath是VSCode通过获取到的文件正确路径 , 对比format和filepath,调整launch.json中CWD,或改变VSCode打开文件夹的位置。使format和filepath一致即可。\n如果format和filepath路径仅大小写不一致,设置launch.json中 pathCaseSensitivity:false 可忽略路径大小写"; end end @@ -425,10 +427,10 @@ function this.doctor() if logLevel < 1 or consoleLogLevel < 1 then strTable[#strTable + 1] = "\n\n- 日志等级\n"; if logLevel < 1 then - strTable[#strTable + 1] = "当前日志等级是" .. logLevel .. ", 过低的日志等级会降低调试速度,建议调整launch.json中的logLevel选项"; + strTable[#strTable + 1] = "当前日志等级是" .. logLevel .. ", 会产生大量日志,降低调试速度。建议调整launch.json中logLevel:1"; end if consoleLogLevel < 1 then - strTable[#strTable + 1] = "当前console日志等级是" .. consoleLogLevel .. ", 过低的日志等级会降低调试速度,建议调整LuaPanda.lua头部的consoleLogLevel选项"; + strTable[#strTable + 1] = "当前console日志等级是" .. consoleLogLevel .. ", 过低的日志等级会降低调试速度,建议调整LuaPanda.lua文件头部consoleLogLevel=2"; end end return table.concat(strTable); From 2b9bc3ff4516a49270ab554431448a6dc30ec081 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Fri, 12 Jul 2019 16:11:51 +0800 Subject: [PATCH 041/431] tips --- src/dataProcesser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dataProcesser.ts b/src/dataProcesser.ts index 4cfe497..5c540c0 100644 --- a/src/dataProcesser.ts +++ b/src/dataProcesser.ts @@ -49,7 +49,7 @@ export class dataProcesser { for (let index = 0; index < dataProcesser.orderList.length; index++) { const element = dataProcesser.orderList[index]; if ( element["timeOut"] && Date.now() > element["timeOut"] ){ - dataProcesser._runtime.showError(" 回调超时! id" + element["callbackId"]); + dataProcesser._runtime.showError(element["callbackId"] + " 请求超时! 详细请求信息可在 Adapter/log 中搜索此id查看"); let cb = element["callback"]; cb(element["callbackArgs"]); dataProcesser.orderList.splice(index, 1); From 546a72aac7cfb5f11c54d8127331aae4d5d85d39 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Mon, 15 Jul 2019 09:45:46 +0800 Subject: [PATCH 042/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=9C=A8?= =?UTF-8?q?=E5=B7=B2=E6=9C=89=E5=A0=86=E6=A0=88=E4=B8=AD=E6=9F=A5=E4=B8=8D?= =?UTF-8?q?=E5=88=B0=E5=8F=98=E9=87=8F=E7=9A=84=E5=BC=82=E5=B8=B8=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 271dd3f..b407dec 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -481,7 +481,7 @@ function this.getInfo() end strTable[#strTable + 1] = "\n\n- Breaks Info: \n"; - strTable[#strTable + 1] = this.printTable(this.getBreaks()); + strTable[#strTable + 1] = this.printTable(this.getBreaks(), "breaks"); return table.concat(strTable); end @@ -598,8 +598,8 @@ function this.getMsgTable(cmd ,callbackId) return msgTable; end -function this.printTable(tab) - local sTable = tools.serializeTable(tab); +function this.printTable(tab, name) + local sTable = tools.serializeTable(tab, name); return sTable; end ------------------------日志打印相关------------------------- @@ -939,9 +939,15 @@ function this.dataProcess( dataStr ) --局部变量 if dataTable.info.stackId ~= nil and tonumber(dataTable.info.stackId) > 1 then this.curStackId = tonumber(dataTable.info.stackId); - local stackId = this.getSpecificFunctionStackLevel(currentCallStack[this.curStackId - 1].func); --去除偏移量 - local varTable = this.getVariable(stackId, true); - msgTab.info = varTable; + if type(currentCallStack[this.curStackId - 1]) ~= "table" or type(currentCallStack[this.curStackId - 1].func) ~= "function" then + local str = "getVariable getLocal currentCallStack " .. this.curStackId - 1 .. " Error\n" .. this.printTable(currentCallStack, "currentCallStack"); + this.printToVSCode(str, 2); + msgTab.info = {}; + else + local stackId = this.getSpecificFunctionStackLevel(currentCallStack[this.curStackId - 1].func); --去除偏移量 + local varTable = this.getVariable(stackId, true); + msgTab.info = varTable; + end end elseif varRefNum >= 20000 and varRefNum < 30000 then @@ -952,9 +958,14 @@ function this.dataProcess( dataStr ) --upValue if dataTable.info.stackId ~= nil and tonumber(dataTable.info.stackId) > 1 then this.curStackId = tonumber(dataTable.info.stackId); - local stackId = tonumber(dataTable.info.stackId); - local varTable = this.getUpValueVariable(currentCallStack[stackId - 1 ].func, true); - msgTab.info = varTable; + if type(currentCallStack[this.curStackId - 1]) ~= "table" or type(currentCallStack[this.curStackId - 1].func) ~= "function" then + local str = "getVariable getUpvalue currentCallStack " .. this.curStackId - 1 .. " Error\n" .. this.printTable(currentCallStack, "currentCallStack"); + this.printToVSCode(str, 2); + msgTab.info = {}; + else + local varTable = this.getUpValueVariable(currentCallStack[this.curStackId - 1 ].func, true); + msgTab.info = varTable; + end end end this.sendMsg(msgTab); @@ -2130,6 +2141,13 @@ function this.getWatchedVariable( varName , stackId , isFormatVariable ) if tostring(varName) == nil or tostring(varName) == "" then return nil; end + + if type(currentCallStack[stackId - 1]) ~= "table" or type(currentCallStack[stackId - 1].func) ~= "function" then + local str = "getWatchedVariable currentCallStack " .. stackId - 1 .. " Error\n" .. this.printTable(currentCallStack, "currentCallStack"); + this.printToVSCode(str, 2); + return nil; + end + --orgname 记录原名字. 用来处理a.b.c的形式 local orgname = varName; --支持a.b.c形式。切割varName From ce17c0182d3e82362ca27efc8887fcb3eb1361de Mon Sep 17 00:00:00 2001 From: stuartwang Date: Mon, 15 Jul 2019 09:52:55 +0800 Subject: [PATCH 043/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E9=9D=9Eloa?= =?UTF-8?q?dstring=E6=83=85=E5=86=B5=E4=B8=8B=E6=97=A0=E6=B3=95=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8F=98=E9=87=8F=E7=9A=84=E9=94=99=E8=AF=AF=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/luaDebug.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 2a17237..3f0ad07 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -393,7 +393,8 @@ export class LuaDebugSession extends LoggingDebugSession { if (info.length == 0) { //没有查到 arr[1].body = { - result: 'nil', + result: '未能查到变量的值', + type: 'string', variablesReference: 0 }; } else { From ace6a72328e42027d28b75186c256717d59f0b10 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Mon, 15 Jul 2019 11:54:55 +0800 Subject: [PATCH 044/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 8 ++ Debugger/LuaPanda.lua | 13 -- Docs/Manual/FAQ.md | 17 +-- Docs/Manual/access-guidelines.md | 134 ++++++++++++------ Docs/Manual/debug-file.md | 41 +++--- Docs/Manual/feature-introduction.md | 2 +- Docs/Manual/quick-use.md | 51 +------ Docs/static/access_introduction/doctor.png | Bin 0 -> 22834 bytes .../access_introduction/doctor_complete.png | Bin 0 -> 26574 bytes .../get_breaks_complete.png | Bin 0 -> 9936 bytes Docs/static/access_introduction/getcwd.png | Bin 59968 -> 0 bytes Docs/static/access_introduction/getinfo.png | Bin 14566 -> 8755 bytes .../access_introduction/getinfo_complete.png | Bin 0 -> 48151 bytes package.json | 1 + readme.md | 31 ++-- 15 files changed, 152 insertions(+), 146 deletions(-) create mode 100644 Docs/static/access_introduction/doctor.png create mode 100644 Docs/static/access_introduction/doctor_complete.png create mode 100644 Docs/static/access_introduction/get_breaks_complete.png delete mode 100644 Docs/static/access_introduction/getcwd.png create mode 100644 Docs/static/access_introduction/getinfo_complete.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 5472535..0c9817b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 2.2.0 + ++ 修复了VSCode请求变量但没有获取返回时卡住的问题。 ++ 增加了LuaPanda.doctor() 命令,检查环境中的错误。 ++ 修复了c库在一些框架下无法正常运行,导致程序自动退出的问题。 + + + ## 2.1.0 + 为了方便真机调试,增加了路径替换功能 diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index b407dec..1992f06 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -19,9 +19,6 @@ API: LuaPanda.getInfo() 返回获取调试器信息。包括版本号,是否使用lib库,系统是否支持loadstring(load方法) - LuaPanda.help() - 返回一些帮助信息。 - LuaPanda.doctor() 返回对当前环境的诊断信息,提示可能存在的问题。 @@ -320,16 +317,6 @@ function this.getBaseInfo() return table.concat(strTable); end ---返回一些帮助信息 -function this.help() - local strTable = {}; - strTable[#strTable + 1] = '\nFAQ:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/FAQ.md'; - strTable[#strTable + 1] = '\n真机调试:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; - strTable[#strTable + 1] = '\n升级指引:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; - strTable[#strTable + 1] = '\n调试器原理:https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/debug-on-phone.md'; - return table.concat(strTable); -end - --自动诊断当前环境的错误,并输出信息 function this.doctor() local strTable = {}; diff --git a/Docs/Manual/FAQ.md b/Docs/Manual/FAQ.md index 6e436d7..cfe2bde 100644 --- a/Docs/Manual/FAQ.md +++ b/Docs/Manual/FAQ.md @@ -18,9 +18,9 @@ ## 文件路径大小写敏感的设置 -+ 如果在运行时获得的文件路径大小写和实际的文件不一致,可以设置`launch.json`中pathCaseSensitivity.true是大小写敏感。 ++ 如果在运行时获得的文件路径大小写和实际的文件不一致,可以设置`launch.json`中pathCaseSensitivity 项为false。 -+ 如果运行时获得的路径和原始文件路径大小写不一致,设置此项为false ++ 大小写敏感设置是为了解决有些框架中传给lua虚拟机的路径被转换为了小写的,导致命中断点时路径无法匹配的问题。 @@ -28,7 +28,7 @@ - 调试器自带日志模块,方便追踪问题。使用方法是切换到console的OUTPUT(输出)页卡, 选择 Adapter/log 或者 Debugger/log 就可以查看对应的日志。 - 通常看Adapter就可以展示Adapter和Debugger的交互信息。 -- 如果需要更全面的日志,可以调整launch.json中的`logLevel:0`,再查看Debugger日志,可以输出每行执行到的文件信息。因日志较多,level设置为0可能会造成卡顿。 +- 如果需要更全面的日志,可以调整launch.json中的`logLevel:0`,再查看Debugger日志,可以输出每行执行到的文件信息。因日志较多,level设置为0可能会造成卡顿(0级日志主要用于调试器开发,使用时开1级日志就可以)。 @@ -75,15 +75,16 @@ format: cwd + getinfo -## 为什么执行到断点处无法停止 +## 执行到断点处无法停止 -通常遇到的情况是stop on entry时可以停止,但是后续的断点无法停止。 +通常遇到的情况是stop on entry时可以停止,但是后续或者子文件的断点无法停止。 -这种情况是**断点路径**和**当前文件format路径**对比不一致导致的。解决方法是 +这种情况是**断点路径**和**当前文件format路径**对比不一致导致的,因为用户环境多样,可使用下面方法定位问题: 1. 打开launch.json的stopOnEntry -2. 停止在stopOnEntry的位置。在调试控制台输入`LuaPanda.getCWD()`, 和`LuaPanda.getBreaks()`, 对比breaks中的路径和format路径是否完全一致 -3. 若不一致,通过修改launch.json中的大小写敏感,lua文件后缀,或是调整层级解决。 +2. 在断点未停的位置,保持断点并在源码中加入一行代码`LuaPanda.BP()`. +3. 再次运行项目,让项目运行并停止在`LuaPanda.BP()` (此处也可能会报错找不到文件,不要停止调试,进行下一步)。 +4. 在控制台输入`LuaPanda.doctor()`, 查看给出的路径建议中 filepath和getinfo是否一致,根据具体情况调整直到二者一致即可。 diff --git a/Docs/Manual/access-guidelines.md b/Docs/Manual/access-guidelines.md index b41c7cb..e28736f 100644 --- a/Docs/Manual/access-guidelines.md +++ b/Docs/Manual/access-guidelines.md @@ -21,13 +21,13 @@ lua调试器依赖于 **luasocket** 和 **规范的路径**,需验证这两点 **测试方法**:在代码中加入`print(debug.traceback("debug test"))`, 查看打印的堆栈。 -如下打印出文件的绝对路径,测试通过。 +如下打印出文件的绝对路径,可以进行下一步 ![absolute_path](../static/access_introduction/absolute_path.png) -打印出的信息是一个相对路径(路径前可能带有@),测试通过 +打印出的信息是一个相对路径(路径前可能带有@),可进行下一步 ![relatively_path](../static/access_introduction/relatively_path.png) -打印出的路径包含在[string ]中,只要是符合上面的要求,是一个可以定位的路径,测试通过。 +打印出的路径包含在[string ]中,只要是符合上面的要求,是一个可以定位的路径,可进行下一步 ![string_path](../static/access_introduction/string_path.png) 下面案例测试不通过,原因是仅输出了文件名,而这些文件其实不在同一个目录下。调试器无法仅根据文件名确定文件位置。 @@ -35,6 +35,14 @@ lua调试器依赖于 **luasocket** 和 **规范的路径**,需验证这两点 +更新: lua中允许使用`require("a.b") `引用子目录中的文件,在标准lua库中,lua虚拟机会把路径转化为 a/b 传给调试器。 + +但是有些开发框架没有做这样的转换,调试器会把收到的a.b当做一个文件处理。结果是导致调试进入require("a.b")的文件时,报找不到文件错误。 + +这个问题的解决办法需要用户修改自身框架,保证`require("a.b") `调用文件时传给lua虚拟机的路径是a/b。 + +或者参见 [issue #24](https://github.com/Tencent/LuaPanda/issues/24) , 在调试器中强转换路径中的. 为 / + # 接入工作 @@ -86,23 +94,19 @@ launch.json 配置项中要修改的主要是luaFileExtension, 改成lua文件 ![cannot_find_file](../static/access_introduction/cannot_find_file.png) -不要停止调试,直接在调试控制台中输入`LuaPanda.getCWD()` - -![getcwd](../static/access_introduction/getcwd.png) +不要停止调试,在VSCode中找到报错中提到的文件,在其中任意位置打一个断点,之后在调试控制台中输入`LuaPanda.doctor()` -输出结果中 +LuaPanda.doctor() 是一个帮助用户检查错误的命令,可以进行路径分析,给出建议。 -**cwd:** launch.json中用户设置的cwd路径 +输出结果 -**getinfo:** getinfo从lua虚拟机获得的路径。我们希望这个路径应该能指示出lua文件所在位置,但通常会获得一个相对路径。 +![doctor](../static/access_introduction/doctor.png) -**format:** 被debugger用来查找文件的最终路径。 +format是调试器拼接出的文件路径,filepath是文件真实存在的路径。 -**format的拼接规则**:如果getinfo是绝对路径,会直接使用它作为format路径查找文件。如果getinfo是相对路径,format 是 **cwd + getinfo 拼接的绝对路径**。 +这里其中会告诉用户format路径来源,用户需要对比format和filepath路径,调整launch.json中cwd或者修改VSCode打开文件夹位置,使format和filepath保持一致,即可修复问题。 -+ 出现找不到文件提示,是 format 路径有误。看一下format路径是否多了或者缺少层级。如果是路径层级错了,调整cwd,可以增加路径层级或是/../保证拼接后的路径正确。 -+ 如果是format的文件后缀有误,按上面的说明修改launch.json中的文件后缀。 @@ -123,16 +127,50 @@ enjoy! LuaPanda 在PC上调试会默认使用 c hook,它是用c重写了debugger的核心hook部分,从而提高调试器的执行效率。 c hook会默认启用,无需单独接入。 -验证方式:停在断点处后,在调试控制台输入`LuaPanda.getInfo()`返回信息包含hookLib Ver,说明c hook已经启动,如下 +验证方式:停在断点处后,在调试控制台输入`LuaPanda.getInfo()`, 返回信息的BaseInfo会给出提示,如果c库已加载,还会给出版本号。 ![getinfo](../static/access_introduction/getinfo.png) - +如果提示c库未能正确加载,可以使用`LuaPanda.doctor()`命令查看详细信息 c hook的源码放置在工程中`Debugger/debugger_lib`中。以供参考 +# 调试器 API 介绍 + +调试器提供了一些API,可以在调试控制台直接调用,以查看当前环境和定位问题。 + +注意:调试控制台只能在运行到断点处才能执行命令 + ++ LuaPanda.getInfo() + + 获取完整的调试器当前信息。 + + Base Info : 系统基本信息 + + User Setting: 用户设置项 + + Path Info:路径相关和提示 + + Breaks Info: 断点列表 + + ![getinfo_complete](../static/access_introduction/getinfo_complete.png) + ++ LuaPanda.doctor() + + 诊断工具,帮助用户诊断当前存在的问题。 + + ![doctor_complete](../static/access_introduction/doctor_complete.png) + ++ LuaPanda.getBreaks() + + 打印所有断点信息(已包含在getInfo中) + + ![get_breaks_complete](/Users/stuartmac/LuaPanda_out/Docs/static/access_introduction/get_breaks_complete.png) + + + # 调试器设置项说明 调试器有几处设置项,这里做详细说明 @@ -143,39 +181,39 @@ c hook的源码放置在工程中`Debugger/debugger_lib`中。以供参考 ```lua { - "version": "0.2.0", + "version": "0.2.0", "configurations": [ { + //正常调试配置 "type": "lua", "request": "launch", - "name": "LuaPanda", //配置名,正常调试 + "internalConsoleOptions": "openOnFirstSessionStart", + "name": "LuaPanda", "program": "${workspaceFolder}", - "cwd": "${workspaceFolder}", //工作路径 - "TempFilePath": "${workspaceFolder}",//临时文件存放路径 - "luaFileExtension": "lua",//被调试文件后缀 - "pathCaseSensitivity": true,//路径是否大小写敏感 - "stopOnEntry": true,//是否在开始调试时停止 - "connectionPort": 8818,//连接端口号,默认8818 - "logLevel": 1, //日志等级 - "useCHook":true, //是否使用C lib库 - "luaPath": "" //执行lua文件时,lua命令的路径 + "cwd": "${workspaceFolder}", + "pathCaseSensitivity": true,//路径大小写敏感 + "docPathReplace": [], //路径映射 + "luaFileExtension": "", //lua文件后缀 + "connectionPort": 8818, //连接端口号 + "stopOnEntry": true, //建立连接后自动停止 + "useCHook": true, //使用C调试库 + "logLevel": 1 //日志等级,默认无需修改 }, - { + { + //单文件调试配置 "type": "lua", "request": "launch", "internalConsoleOptions": "neverOpen", - "name": "LuaPanda-DebugFile", //配置名,调试单文件 + "name": "LuaPanda-DebugFile",//单文件调试,请不要修改 "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", - "TempFilePath": "${workspaceFolder}", - "luaFileExtension": "", "pathCaseSensitivity": true, + "luaPath": "", //lua.exe所在位置 + "luaFileExtension": "", "connectionPort": 8818, "stopOnEntry": true, "useCHook": true, - "logLevel": 1, - "luaPath": "", //执行lua文件时,lua命令的路径 - "packagePath": ["./doc1/?.lua"] //执行lua文件时,加入package.path的路径 + "logLevel": 1 } ] } @@ -195,6 +233,16 @@ sluaunreal:lua **pathCaseSensitivity**:路径大小写敏感。如文件名是Test.lua ,执行此文件时getinfo获得的文件名是test.lua , 就需要把这个选项设置为false。否则路径因大小写不一致会查找不到文件。 +**docPathReplace**:路径映射。当执行的lua文件和VScode查看的lua文件位置不同时, 可以使用路径映射,主要用于真机调试。如 + +`docPathReplace": ["A", "B"]` + +我们把目录分为A:运行路径 和 B:观察路径 +前提: 用户保证运行路径A 和观察路径B 的代码是完全相同的,否则调试时行号会错乱 +具体实现: +调试器启动时会自动把 B 下的断点位置替换成 A, 以便运行时判断断点命中。 +命中断点后,用户把堆栈中 A 路径替换回 B ,便于VSCode展示文件给用户看 + **stopOnEntry**:调试器建立连接后立刻暂停,建议true。 **connectionPort**:连接端口号。此处请保持和`require("LuaPanda").start("127.0.0.1",8818);` 中一致,否则无法建立网络连接。 @@ -208,24 +256,28 @@ sluaunreal:lua ### 2. LuaPanda.lua 文件头部 ```lua -local openAttachMode = true; --是否开启attach模式。 +local openAttachMode = true; local attachInterval = 1; --attach间隔时间(s) -local TCPSplitChar = "|*|"; --json协议分隔符 +local customGetSocketInstance = nil; --支持用户实现一个自定义调用luasocket的函数,函数返回值必须是一个socket实例。例: function() return require("socket.core").tcp() end; +local consoleLogLevel = 2; --打印在控制台(print)的日志等级 0 : all/ 1: info/ 2: error. +local connectTimeoutSec = 0.005; --等待连接超时时间, 单位s. 时间过长等待attach时会造成卡顿,时间过短可能无法连接。建议值0.005 - 0.05 ``` **openAttachMode**: attach模式开启后可以在任意时刻启动vscode连接调试。缺点是不调试时也会略降低lua执行效率(会不断进行attach请求)。**所以请不要把调试器放在正式环境大量外发**。 **attachInterval**:attach请求间隔,默认1秒 -**TCPSplitChar**:网络请求的隔断符。因为TCP可能出现粘包,消息传输需要隔断符号,默认请不要修改。 +**customGetSocketInstance**:调试器的运行依赖luasocket, 用户可以实现这个函数,以便调试器能够顺利引用到luasocket。 + +**consoleLogLevel** : console日志等级,默认无需求改 + +**connectTimeoutSec**:连接超时时间,如出现调试器连接不上VSCode时,可以改长一些,但不建议超过0.05 -# 调试器更新方法 +# 调试器升级方法 -调试器会不断完善和扩充功能。当发布新版本后,VSCode 会推通知给用户。更新步骤: +通常VSCode插件版本是向下兼容的,只更新VSCode插件也可正常使用,但无法体验最新特性。 -1. VSCode中更新插件 -2. 从git仓库中获取最新的 LuaPanda.lua, DebugTools.lua 文件,覆盖原文件即可 +更新方法参阅文档 [update](https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md) -通常VSCode插件版本是向下兼容的,只更新VSCode插件也可正常使用,但无法体验最新特性。 \ No newline at end of file diff --git a/Docs/Manual/debug-file.md b/Docs/Manual/debug-file.md index 84c81e0..1dea9fb 100644 --- a/Docs/Manual/debug-file.md +++ b/Docs/Manual/debug-file.md @@ -15,39 +15,40 @@ ```json 配置文件示例 { - "version": "0.2.0", + "version": "0.2.0", "configurations": [ { + //正常调试配置 "type": "lua", "request": "launch", - "name": "LuaPanda", //配置名,正常调试 + "internalConsoleOptions": "openOnFirstSessionStart", + "name": "LuaPanda", "program": "${workspaceFolder}", - "cwd": "${workspaceFolder}", //工作路径 - "TempFilePath": "${workspaceFolder}",//临时文件存放路径 - "luaFileExtension": "lua",//被调试文件后缀 - "pathCaseSensitivity": true,//路径是否大小写敏感 - "stopOnEntry": true,//是否在开始调试时停止 - "connectionPort": 8818,//连接端口号,默认8818 - "logLevel": 1, //日志等级 - "useCHook":true, //是否使用C lib库 - "luaPath": "" //执行lua文件时,lua命令的路径 + "cwd": "${workspaceFolder}", + "pathCaseSensitivity": true,//路径大小写敏感 + "docPathReplace": [], //路径映射 + "luaFileExtension": "", //lua文件后缀 + "connectionPort": 8818, //连接端口号 + "stopOnEntry": true, //建立连接后自动停止 + "useCHook": true, //使用C调试库 + "logLevel": 1 //日志等级,默认无需修改 }, - { + { + //单文件调试配置 "type": "lua", "request": "launch", "internalConsoleOptions": "neverOpen", - "name": "LuaPanda-DebugFile", //配置名,调试单文件 + "name": "LuaPanda-DebugFile",//单文件调试,请不要修改 "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", - "TempFilePath": "${workspaceFolder}", - "luaFileExtension": "", "pathCaseSensitivity": true, + "luaPath": "", //lua.exe所在位置 + "packagePath": "", //希望加入package.path的路径 + "luaFileExtension": "", "connectionPort": 8818, "stopOnEntry": true, "useCHook": true, - "logLevel": 1, - "luaPath": "", //执行lua文件时,lua命令的路径 - "packagePath": ["./doc1/?.lua"] //执行lua文件时,加入package.path的路径 + "logLevel": 1 } ] } @@ -55,7 +56,7 @@ -相对于旧的配置文件,增加了LuaPanda-DebugFile选项,它可以用来调试单文件。 +相对于旧的配置文件,增加了单文件调试配置(LuaPanda-DebugFile)选项,它可以用来调试单文件。 新增的配置项包括 **luaPath**:lua命令路径,如果lua命令已经存在系统path中,可以不填。 @@ -76,7 +77,7 @@ VSCode 会启动一个新终端,执行当前打开的lua代码。 ### 3. 调试单文件 -把调试选项切换至`LuaPanda-DebugFile`, 代码编辑窗口切换到待调试文件,运行。 +把调试选项切换至`LuaPanda-DebugFile`, **代码编辑窗口切换到待调试文件**,运行。 ![config_select](../static/config-select.png) diff --git a/Docs/Manual/feature-introduction.md b/Docs/Manual/feature-introduction.md index 7c5bae3..f7352d5 100644 --- a/Docs/Manual/feature-introduction.md +++ b/Docs/Manual/feature-introduction.md @@ -10,7 +10,7 @@ lua适合的场景 - 动态下发,避免游戏打包后无法调试的。适合发布后使用。 -C扩展适合的场景 +C 扩展适合的场景 - 效率高,适合开发期调试。 diff --git a/Docs/Manual/quick-use.md b/Docs/Manual/quick-use.md index d7e23b6..2811928 100644 --- a/Docs/Manual/quick-use.md +++ b/Docs/Manual/quick-use.md @@ -1,4 +1,4 @@ -## 快速使用 +## 快速试用 注:VSCode的调试插件机制是: 当使用某个插件调试过一种语言时,会导致该语言的其他调试插件无法生效,请先禁用之前的调试插件并重新启动VSCode。 @@ -12,8 +12,8 @@ 1. **安装VSCode插件**:VSCode 商店搜索 LuaPanda,安装插件。 2. **添加被调试文件**:创建一个文件夹,名为`luaDebugTest`, 其中放入被调试lua文件。 -3. **配置**:使用VSCode 打开 `luaDebugTest` 文件夹,切换到调试页卡(shitf + cmd(ctrl) + D),点击页面内的齿轮符号,选择 LuaPanda,会自动生成一张配置表。配置表默认不用修改。 -4. **开始调试**: 代码编辑面板中点开要调试的文件,配置项选择`LuaPanda-DebugFile`,点击VScode调试页卡下的绿色箭头。 +3. **配置**:使用VSCode 打开 `luaDebugTest` 文件夹,切换到调试页卡(shitf + cmd(ctrl) + D),点击页面内的齿轮符号,选择 LuaPanda,会自动生成一张配置表。检查配置表中的"luaPath", 填入lua.exe位置。 +4. **开始调试**: **代码编辑面板中点开要调试的文件**,配置项选择`LuaPanda-DebugFile`,点击VSCode调试页卡下的绿色箭头,VSCode会拉起terminal ,并执行命令调试运行当前窗口的lua。VSCode有时会报窗口错误,请选择正确的文件,重复步骤4即可。 @@ -42,48 +42,3 @@ 2. **放入调试文件** 把/Debugger中的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到slua-unreal 工程`sluaunreal/Content/Lua/`目录下 3. **配置工程** 把`sluaunreal/Content`文件夹放入 VSCode , 点击 VSCode 调试选项卡下的齿轮图标,选择 LuaPanda。 4. **开始调试** 在执行的lua代码中加入`require("LuaPanda").start("127.0.0.1",8818)` 。配置项选择`LuaPanda`, 点击 VSCode 的开始调试箭头,再运行ue4,在加入 require 的位置后会自动停止。之后可以打断点调试。 - - - -### 附录:launch.json 配置表 - -```json -{ - "version": "0.2.0", - "configurations": [ - { - "type": "lua", - "request": "launch", - "name": "LuaPanda", //配置名,正常调试 - "program": "${workspaceFolder}", - "cwd": "${workspaceFolder}", //工作路径 - "TempFilePath": "${workspaceFolder}",//临时文件存放路径 - "luaFileExtension": "lua",//被调试文件后缀 - "pathCaseSensitivity": true,//路径是否大小写敏感 - "stopOnEntry": true,//是否在开始调试时停止 - "connectionPort": 8818,//连接端口号,默认8818 - "logLevel": 1, //日志等级 - "useCHook":true, //是否使用C lib库 - "luaPath": "" //执行lua文件时,lua命令的路径 - }, - { - "type": "lua", - "request": "launch", - "internalConsoleOptions": "neverOpen", - "name": "LuaPanda-DebugFile", //配置名,调试单文件 - "program": "${workspaceFolder}", - "cwd": "${workspaceFolder}", - "TempFilePath": "${workspaceFolder}", - "luaFileExtension": "", - "pathCaseSensitivity": true, - "connectionPort": 8818, - "stopOnEntry": true, - "useCHook": true, - "logLevel": 1, - "luaPath": "", //执行lua文件时,lua命令的路径 - "packagePath": ["./doc1/?.lua"] //执行lua文件时,加入package.path的路径 - } - ] -} -``` - diff --git a/Docs/static/access_introduction/doctor.png b/Docs/static/access_introduction/doctor.png new file mode 100644 index 0000000000000000000000000000000000000000..6b4b60d317123c159ee567bc8ed0bd7704b5cc9f GIT binary patch literal 22834 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

xAgtDZVJ!ebP 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 literal 0 HcmV?d00001 diff --git a/Docs/static/access_introduction/get_breaks_complete.png b/Docs/static/access_introduction/get_breaks_complete.png new file mode 100644 index 0000000000000000000000000000000000000000..8521fb6b674bca8b7d4301ba9996cb838829e969 GIT binary patch literal 9936 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 literal 0 HcmV?d00001 diff --git a/Docs/static/access_introduction/getcwd.png b/Docs/static/access_introduction/getcwd.png deleted file mode 100644 index b5ecd7eeded8acf021f649007cb0d64dc95ac9a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59968 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�Ibe+o1R#goKB#Y{QHj1e#7b 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 fU#cxW@dR3AM;(LlZr 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 diff --git a/Docs/static/access_introduction/getinfo_complete.png b/Docs/static/access_introduction/getinfo_complete.png new file mode 100644 index 0000000000000000000000000000000000000000..2c21b777ab954f0784dec3ac6c4451801f725727 GIT binary patch literal 48151 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index a7a5670..1f4b719 100755 --- a/package.json +++ b/package.json @@ -185,6 +185,7 @@ "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, "luaPath" : "", + "packagePath": "", "luaFileExtension": "", "connectionPort": 8818, "stopOnEntry": true, diff --git a/readme.md b/readme.md index c213a6b..310f48a 100644 --- a/readme.md +++ b/readme.md @@ -31,7 +31,17 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` -# 更新说明 +# 近期更新 + ++ v2.2.0 + + 增加了`LuaPanda.doctor()` 命令,检查环境中的错误。 + + 修复了VSCode请求变量但没有获取返回时卡住的问题。 + + 修复了c库在一些框架下无法正常运行,导致程序自动退出的问题。 + + + v2.1.0 @@ -41,10 +51,6 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` 建议把LuaPanda.lua更新到最新版本。 -+ v2.0.6 - 仅更新VSCode端,lua文件未做变更。 - 修复了调试中查询变量时,json通信量大导致的查询失败。 - # 特性 @@ -58,20 +64,15 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` -# 项目介绍和接入文档 - -[项目介绍](./Docs/Manual/feature-introduction.md) | [快速开始](./Docs/Manual/quick-use.md) | [接入指引](./Docs/Manual/access-guidelines.md) | [真机调试](./Docs/Manual/debug-on-phone.md) | [FAQ](./Docs/Manual/FAQ.md) - -我们正在补全文档,以方便接入和开发,我们也非常欢迎您可以帮助完善文档。 - -更多文档请看[这里](./Docs/README.md) - +# 接入和开发指引 +接入和使用文档 +[项目介绍](./Docs/Manual/feature-introduction.md) | [快速试用指引](./Docs/Manual/quick-use.md) | [接入指引](./Docs/Manual/access-guidelines.md) | [真机调试](./Docs/Manual/debug-on-phone.md) | [单文件调试和运行](./Docs/Manual/debug-file.md) | [升级说明](./Docs/Manual/update.md) | [FAQ](./Docs/Manual/FAQ.md) -# 快速开始 +调试器开发文档 -试用LuaPanda请 [参阅快速开始文档](./Docs/Manual/quick-use.md) ,其中包含 slua , xlua ,slua-unreal 的快速使用方法 +[工程说明](./Development-instructions/project-description.md) | [调试器开发指引](./Development-instructions/how_to_join.md) From 4477e1833c32743e0b5e1cf627c22cc89009be30 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Mon, 15 Jul 2019 15:49:12 +0800 Subject: [PATCH 045/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86doctor?= =?UTF-8?q?=E6=97=A0=E9=94=99=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 4 ++++ package.json | 2 +- readme.md | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 1992f06..9b18dad 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -420,6 +420,10 @@ function this.doctor() strTable[#strTable + 1] = "当前console日志等级是" .. consoleLogLevel .. ", 过低的日志等级会降低调试速度,建议调整LuaPanda.lua文件头部consoleLogLevel=2"; end end + + if #strTable == 0 then + strTable[#strTable + 1] = "未检测出问题"; + end return table.concat(strTable); end diff --git a/package.json b/package.json index 1f4b719..e3e40dd 100755 --- a/package.json +++ b/package.json @@ -185,7 +185,7 @@ "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, "luaPath" : "", - "packagePath": "", + "packagePath": [], "luaFileExtension": "", "connectionPort": 8818, "stopOnEntry": true, diff --git a/readme.md b/readme.md index 310f48a..5bb1e19 100644 --- a/readme.md +++ b/readme.md @@ -35,7 +35,7 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` + v2.2.0 - 增加了`LuaPanda.doctor()` 命令,检查环境中的错误。 + 增加了`LuaPanda.doctor()` 命令,可以检查环境中的错误(需更新LuaPanda.lua和DebugTools.lua至2.2.0)。 修复了VSCode请求变量但没有获取返回时卡住的问题。 From 5628f123cfcca272d807f14064351250a5e97c91 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Mon, 15 Jul 2019 19:15:56 +0800 Subject: [PATCH 046/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 9b18dad..e377471 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -322,7 +322,7 @@ function this.doctor() local strTable = {}; if debuggerVer ~= adapterVer then strTable[#strTable + 1] = "\n- 建议更新版本\nLuaPanda VSCode插件版本是" .. adapterVer .. ", LuaPanda.lua文件版本是" .. debuggerVer .. "。建议检查并更新到最新版本。"; - strTable[#strTable + 1] = "\n更新方式 : https://github.com/Tencent/LuaPanda"; + strTable[#strTable + 1] = "\n更新方式 : https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md"; strTable[#strTable + 1] = "\nRelease版本: https://github.com/Tencent/LuaPanda/releases"; end --plibdebug From 81d43660ad193cc80a761befbbf73af5b6a03951 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Mon, 15 Jul 2019 20:10:28 +0800 Subject: [PATCH 047/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../debugger-principle.md | 135 +++++++++++++++++- .../debugger-principle/dostring-pic.png | Bin 0 -> 21510 bytes Docs/static/debugger-principle/mode_pic.png | Bin 0 -> 24441 bytes Docs/static/debugger-principle/state-pic.png | Bin 0 -> 26039 bytes .../static/debugger-principle/state-table.png | Bin 0 -> 53790 bytes readme.md | 4 +- 6 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 Docs/static/debugger-principle/dostring-pic.png create mode 100644 Docs/static/debugger-principle/mode_pic.png create mode 100644 Docs/static/debugger-principle/state-pic.png create mode 100644 Docs/static/debugger-principle/state-table.png diff --git a/Docs/Development-instructions/debugger-principle.md b/Docs/Development-instructions/debugger-principle.md index 061a28e..a438cc7 100644 --- a/Docs/Development-instructions/debugger-principle.md +++ b/Docs/Development-instructions/debugger-principle.md @@ -1,2 +1,135 @@ -# 原理介绍 +# 一些特性的实现方案 + + + +## 简述 + +LuaPanda 是一个基于VSCode的lua代码调试器,主要由三部分组成。 + +![](../static/debugger-principle/mode_pic.png) + ++ 调试器前端是VScode扩展,作用是通知VScode展示信息和进行数据交换。 + ++ 调试器后端是debugger,它负责调试主体功能的实现,使用lua开发。 + ++ 另外提供了一个可选的,用来提高调试效率的c-hook扩展模块。这个模块依赖于debugger,不能独立使用。 + + + +## 调试器工作原理 + +lua语言自身提供了基本的调试接口。调试器要做的是:把从lua虚拟机获取到的调试信息进行分析,整合,并控制代码的执行。 + +调试器依赖的核心接口: + +``` +debug.sethook ([thread,] hook, mask [, count]) +``` + +lua虚拟机可以接受调试器设置的钩子函数,当代码执行到指定状态(mask: call , line , return)时就调入钩子函数,并附带以下信息 + +``` +typedef struct lua_Debug { + int event; + const char *name; /* (n) 函数名*/ + const char *namewhat; /* (n) 用于解释 name 域. 可以是 "global", "local", "method", "field", "upvalue", 或是 "" (空串)。 这取决于函数怎样被调用*/ + const char *what; /* (S) 类型 lua/c/main */ + const char *source; /* (S) 路径*/ + int currentline; /* (l) 当前行*/ + int linedefined; /* (S) 函数定义行*/ + int lastlinedefined; /* (S) 函数结束行*/ + unsigned char nups; /* (u) number of upvalues */ + unsigned char nparams; /* (u) number of parameters */ + char short_src[LUA_IDSIZE]; /* (S) 一个“可打印版本”的 source */ + /* private part */ + other fields +} lua_Debug; +``` + +钩子函数由调试器实现,其中做断点命中判断,单步操作等处理。 + +若命中断点,调试器阻塞被调试lua代码的执行,并获取变量和堆栈信息发给前端展示。 + + + +## 状态分级 + +hook状态分级的目标是希望减少hook次数,但是不能影响判断的准确性。 + +lua支持三种hook状态,lcr(line , call , return)。最初的方案三种状态全都要进行hook + +![](../static/debugger-principle/state-pic.png) + + + +调试器有多种执行状态,在用户感知的卡顿发生在Run。从上面的状态图可以看到,Run状态hook下的工作是做命中断点判断。 + +假如用户没有设置断点,那就没有必要做断点判断,只要定时接收消息(如用户新增断点)。 + +再假如用户设置了断点,但是当前执行的函数中没有断点,那么只需要在发生函数切换时(call,return)hook, 并根据新函数中是否有断点改变hook状态. + +根据上面思想,我们建立了hook状态机,把hook分成以下状态 +![](../static/debugger-principle/state-table.png) + +每次用户打断点,以及发生函数 call 和 return 时,都要重新检查,根据断点情况切换到对应状态,以免漏过断点。 + + + +## attach模式 + +lua中没有多线程给网络连接造成了一些难题,因为在网络请求处如果做同步等待连接会造成界面卡死。 + +最初的想法是:调试器被引用后,启动时会做一次connect,尝试连接VSCode。若失败则不再链接。这种方式必须在lua启动时就建立连接,但如果想要实现调试器的attach模式要怎样做呢? + +因为纯lua没有异步和定时器,所以需要在运行过程中不断发请求。我们让hook每隔一定调用次数时尝试做一次连接。 +debug.sethook(this.debug_hook, "r", 1000000); +因为连接有性能损耗,同时也做时间判断,距上次少于1s不再重连。 +这种方式带来的优点是运行过程中随时可以挂载调试器开始调试。缺点是每隔1s都会尝试重连,有性能损耗。 + +对于性能损耗的问题,我们也做了一个设置项让用户选择是否使用attach模式。 + + + +## 执行表达式和变量赋值 + +调试到断点处,用户可以输入变量或者表达式,观察执行结果。如下 + +![](../static/debugger-principle/dostring-pic.png) + +loc_num是局部变量,用户在断点处希望查看loc_num+1的值。 + +最初的想法是:使用loadstring执行字符串,得到closure。但是closure的环境变量是_G, 取不到loc_num的值,造成执行错误,结果和预期不符。 + +解决这个问题我想到的是:首先需要获取用户空间的env,设置到loadstring的执行环境中。但是又遇到了难题,如果用户没有主动给函数设置env,那么取到的环境依然是_G. + +最终我们使用了元表中__index函数动态查找的方法 + +首先调用debugger_loadString(5.1是loadstring , 5.3是load), 把用户传来的string转换为closure + +``` +local f = debugger_loadString(expression); +``` + +给closure设置env. + +``` +if type(f) == "function" then + if _VERSION == "Lua 5.1" then + setfenv(f , env); + else + debug.setupvalue(f, 1, env); + end +end +``` + +env table中的__index是一个function, 它可以检索用户调用栈对应层级的局部变量和upvalue + +``` +local env = setmetatable({ }, { __index = function(tab1, varName) + local ret = this.getWatchedVariable( varName, _G.VSCodeLuaDebug.curStackId , false); + return ret; +end}); +``` + +以此取得用户空间的局部变量,保证用户输入的表达式正确执行。 diff --git a/Docs/static/debugger-principle/dostring-pic.png b/Docs/static/debugger-principle/dostring-pic.png new file mode 100644 index 0000000000000000000000000000000000000000..f481406b4f251a2aefd9ba74164d81e3dc386fa3 GIT binary patch literal 21510 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 ffd7LQXxrsMNSCEYe_5?i$?P;q+SHTK~R17iWyK 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 literal 0 HcmV?d00001 diff --git a/Docs/static/debugger-principle/state-pic.png b/Docs/static/debugger-principle/state-pic.png new file mode 100644 index 0000000000000000000000000000000000000000..00f677739d8ff4ac34523c7d32a6828091b161a0 GIT binary patch literal 26039 zcmcF}Q6aSuzAi@7#%gt+7fq+0U%>@PJECodcZLMq_6z%j4 zjYW-Zj2+Ak6+{JqfY_s=l(o%plz;PfIGPfZOew)<{vvDzey zv#t}J8a-c6r;bgtGj)9B$qLJP0nRgi5B9Y95l}oKZ16VHCqa|0FA`AjHogYPokkR2 zq;WB&nYY(%8((`pWZh(YUbmUvfStCLt0l+%{)LuaO^eRB?-&vj%0nF+7?O()o~J60 zORZfd1U+aUKh4f@keo(SJK1bvea^KS0yBTM9BRL}u zi4Qz>b347J80khxt8xRPygR3`swte%=OmEzfo7jJbcXF@T(NJpqC8qy*}F1`R>lm0;4y7+WP5*D3p5nmGR;@w{%_eZE9!ojab z9lSz5GD>!xw(b1lO@3$^-7Ci{h_%Asw;Qej3XCF^A*2ghS`7rrh~f|U4%(_&SpYmZ z`gfR7N4Zf6?l(KBFtq7L4yIg0u`# z_AqcjGCos(S`_a3 z9;)88IE-jacGOD^Tw19)x+-H?gCC&X&ZP~74dFi6-yNzVi1;LrrJd9~YICdG(!q;V zrhvU$ys2QyLoeYy!$KMg$glb*S6zId<xqzEOb(Ne?FudCXw!KtR!?6V3d9?d|5fyZoTrk8T7?#_{tXA-2Jo8Hd;gV}A%- zuixmyjT7^N*e;z*TIT)pQvqZe<@+l)$4ePR z3+4t0=ns&%5WkY!uS;zRFD2*u9~%$)!noK#AVNY!WDj(qKQy_ypB_ z91~@mXS&l3+iP`%`S}V;e?W^8{AgM$9z|AUD5UpIen$W~^tIMDw`_#dChAtIWn+x&NVE)ri^eF{!@*K`t^Ssi~s*89YNMZd~?gTv%x z;+8^K^0O3O6`3B!-^r@^mG#iwI@yr-cLMafy6-6P&XiF^#rrDh!izt!s}(+IP|oFHujVzkE&)P9hdV8D3i>HaBQ(ATa|82p}PWtAutjyajzG$A{l54aFwL zif;Zw^#27$JiQ9|^X~I_|14Nb?=2cid3|&c@drWnx3cP7OK>;Gpb&bZGC@y%VmH_0 zRavgBygp#uvOEq8C5+O3j-8$kZSHaFER1B*LALXp@t97~k91+HWM+S4U~Sco89PKa zn_tKdv8(rVNSK~J`7+>aXgMNvU+!pC^^DpQczPCwHYfEI*dwgYB{wu0hT=@iG%KQE5d_eVE^?`vWl=9gPrB&KCT5 z79c+dfGoO^&^&|nHf+Y7=-WORvELmOe}sY_JQ9T1uP+3B^=xfv@+hICpR8ZdqB<*O zBDU*n1jR4GA5`^3$gRc`3%?FnJT-%jI0w05wFsgXMWXXuJWB3s2J&b6#9L2}M(ub>s3!qF8AKR7UBzg1$sH5I?Ye0;Infh5 zCRBLL?61rVxDAn~EL^>_;h)K3s$iIycHdfGym)Wtd>_5o6TtV>hTv7RJ~v{c^hzc9 z^0nTKo?@m=##%vNKtYK`#9GcP;Bq5F*uiHHZLBQ7kW@5%k--W3RS0M2(tfjNDka!@ z)J`3n$UN(`xhP{SOzN}NjqRbMbdQ;M%K5%tjpQi4eD=zP=P8z-}g0 zAM*C`vU!C+^~lE492+jt1_o_2s3foIEYn2!75-g6?>TaRzJ_^}UFb$d04 z$6R}%t*FQ?I`uGzsljeKS7;J59heUxW?6Z8T%l-bNv)d;7yB8%xA2vn`;U}kVa~&P z#@5Sd0|8~sZ0QK?incjhL+7pSjG(G&MWSS}rTxN_Y9q3|U>%5P^ubiiwlcg|=a&7- z-;5x28z3mKM_Ed&O720z1TgMy}7*dtqy~bLhQYhdz9%cUq&PFmwZ0J zEiw51843xUN*z^0g-kET%5tXpR|MAXv2#7dD6-b3hy|0&Dj5qg2HTySr&`*$Z4<@a z%1g@zcgM_LosI~@gCmA>ofCUEXU3d6Xi z3Ph>X+wgQ>q7&TR%$7V_k(Oa*`0zml za7@V}FrPiiWc&6SOz*bodv=)&PIJ;Yz=%CuFJUcAcYgC6M69iqN_bie_(=;|M6!Us zEpx&Zd@4TMbGLhd^pE*G-AS4xw1oSy?#=21rK$HAZ>niAvqRn3Y)97YsE7CD_`;L9 z#!cCJMonaUY;I}EOX6d&2{*t-;#-nj?Rq?5gT086xP zJ|{#N-XFA-V%UCNvgp4Z5snn?=^bnTeqiu~96O|tox=1x^YIF=Z(QALK)$y*pXM+= z>~)65&+=l{KYw`d5`+dWC~8p?D~1*=C}&ou!$q!&^>`@2QI>qfyP1e zY5@0X{{Fo-aXb$UG4f-_z{JPQh+Jd6>eu$j=xKcoJLu8}9M`<5Ho1P^-*tJ=HabK9 z$IXo*zktY^Zrd<#A}8~bsg4|mUSn5P$XsfYf~hSQCJy+X5(`7F6z3!1$HLY1V~a>R z;iDLZT=rnGYytXVHbbQ(wPB_9Tm3vGnI4#P{f{X2iS>g-?li#O-cwk^x z7zVk6ILz*BRkbNF8xD;w;!FpYuqC<6Gi1S0U+vHEjF!7GsassDL{ieyDEUj06sN{5 zmQ_<~>O(efM$P7q^V3sk;n~}^ex6;EKD3I=j7ZVl+HLMb_n|;TZ7C@E=^90ztF@XM zVlI4eY@V8Yieq&-|O!T|93 ziG|5boZ=K`b$cWOB4Vkh<%EgaEzFOwzA{nhwLJ$u-ggJo@OxQmtbYEldP$G*?D1_m#+da!Kzu6MfVI7yyjC__=b%Tj%}yQCj^AGXEWN zL38KVuc;NiT|f2%j)^E2{~UZk`Z*>d{-ul*R7;^&0w4?;4Y7 zV&+}rE#u3gdLj~WE^Np?bhq_iQ31Co4TCsK8^hc8>gA&Ic8~G z9@%nn@C=Tsyqm$83)cK)Gw`7!tuf~Dti~dA8NQV4kv+7V3)vLk5ZXr?z*AIMzRzi_ zAaLCqhiTt37;!LM-)4kqe?tC@Guyg2f4NW3qox*z3(j;D{_f*|W{NvTj@376%}fX6 zfH=}_<>7maD8AdKIv4$y4K8p6n{`NaJ&q5_7cQqtU{ZxjK_b!5VL}GevR#p>(SAvk zC4=!ki3dP^9ou@t5t6>=9?cxjA@VK4?l12%w$EC0`Tl{JRK1ZBRal<(>*UWK5N#oq z+&R6Fy*)>B34U)j4@BvvO5xR7OyZ!~D@1z9DE?;;Tb=KUPU})8Suv+FrrGjXgWH8K zzQQ*M1&PVQ)l7Fk=KLWldJ1LFPQ9$bRE(wF_23;^r0a#8Mf)P_J-~gWKB?8D-%Tr) zz4UAn-pj>K2o!j1@n~(y62M)|mXG7sZuJzyhaKnCr#?@H&21=$?AR*w^yG25osnl& zO(e!tF;A{r6AZJVm5b&*+T)Cm^-#0nBJWdm1{S7wXdZB(cMvH*pol0iSxw8SsV4AO zH{Bt;q#$N)WOEUnbV&}~GInA9g($Lr$l{~H>L|u8ueq)0@29|G>4u9}rmKlh=0$9P<>8aJKO} z-fbUNK{faHj4xmQ#}&iYxRWWBj_Ip7LB3~GY&QZntF>^|HdxYcSaHeB9F}1!NAK@O z$HWC$8V_8|K{dx!W7@N`?P^kg=7`C@`!jU|;V_9aPlR~z_e2LZB`x6ZGH(F)3FlEP z%M_POQNk`4jtwjGqJ{T#^Oi3eev9{a*1dMxW=~Ip^Nxw{fya{o;*`{<;S{ITxv0NF zrV~K^)f)`ZGlFcb;{Wwov- z^IVzpJ%$?%HyK_=10sYjrhv=J9AK`P?!w&uwEk!(J=#5lMPB3n`A(@g+}o?ETl^`U zL#QT~fH4P>InCN^f~Dz3WbzU*+>FIUh>E*&Qc4LGuprs<3Qzhu#};2955!XYnprB! z4md^;pFk_XgxQTwD5<}@O3zu$m+3Ixi!Vv4ApC0XI|YwK@o)`U5M0U0;x#!GjRAVrXQOS)jjj`we66IR(^xr z-Xr+eZZ48CmEDF}2_$;lBAs$Gg&)=ONVvGdQ0 zi}{K8RNh)qhIj$D>*A=*o%S5j%nk+~dQ8m7StJST#I)Pedfg0v_mbOdjW3gQkhYKx z^7rdw#4QPUOYI~~iHs33QMgX3kgeBk-u`qH4d2}(F~UGXKO@srDkmBY-Wx>f)9dYp zErZwPZ_=-h99K$nuh>mK47M$Ykof5z2|7*$gr5UawffQG1((ak{W#B?KXRe`0dCia zbFT}AGbj~OdxgFeA=#IQoc&uk^zE%l%;PBw0erl4)6qVhqG))M>dr}w&9c>PgL~*k zt!?MGlZL)|y_~^mG4$Qq5mDH_^1S;+sLJC`wa)|PUC^DQH*p_7xg@lOf5;~r+dIzg zxS*Zpv1~DT2fcPYSE`CBd>-f_w%^^ro)cm$i|@yYDmNOz8t7AtaV&q@PR|*>HYwSC z-;ER<#Kk$jMP|TbD%*#nii=$Jz|&~o*vmvjsI^=|OoRD8tDRPA?cTOO)iHisWFs+Y z3z2Vdq?Ir>cdjajygeLKxQwHWMD@4lwCL#$<89hsNRPW3oO2l7JxyI=42!C&3=XV)<& zhoFC>#!Yd>IIgicX43hE6^$3w$xC>!3Fo5uw!QpXhzNxklmEhNJ#a0)E4JP#yu2Bk z1Tc>GcJ=g(4N^RayF9s|cg_Bu_e3c$u={MjCwE@&oct?)?DhT4+j@LX4QH%z_fvmX zARWnwZu+qRI3R1zC;NyO@94%gf1*HS^^s9~(2=ue-x=uZ)&Dk-@SwNNmeV z7APsm6@-X^Y9;m`|G}YEKNL-3<(P4q{a8NfTaK+(% z%i6V&s*K=af0%@gNf@!T&Nh^NtDY?Ap6aMan0G-ZL_E|KRvfO3Xe#8*<1fu6;VoFL zoOAIEelz@GX~TsHXU|p7(~PnHfKzm9?8Y~hIU%AU!t$8MV#wmMsI71MW+N-ZPnI*V zY@7&)hjW=+=Nu^^GkB@NZW6z0o?+ko+Cn&$R*ZcJL9lG`z^x*}+Yr}K8#Da6DPoew zmm4`Z#Wl#EDn{RA)3vp2jhz(v3mo_?K_^8I)E=0XBMakv`c-s?QFl0HhxWmkv zJU&6_NbI$LY%n@Bw7L43Zl{bk=oQ7Cdry8#OZJ+v`_}9i_!MokF=IHOA1t{Z@ zC^QRI>d1uqPb^u7v+pkhT2Oz~?Dn6#mYIgg55(WjH3$Kk6R%=0fW4Ldp zZT6E3FKQ1j>@)z++m*y^>kp^B6t%@^I?yq2^<4`<*Y$(x16=>-BP~5Uxw{eo~lO8m;nhu#gT67njp$Y`TF;n3BG% zP0aMrY-%0Ij+9AU9rp)oMF&ML=fkE@adnDSC6NOTlS%9NB_^A+k;vxdgo;zd~xi z0yXuI{CB(NszSv^t#!z|#3fg3*qxyWb7@Iqub%1{jM;$4Ts{Rg71heYt?e50fR(lG z6pWhk{qrrqkXoq6>2FQtR3Rm&yex>HCb{e(P(> z@(8b+dtj|974@o&ruEC|>449C%diisl#pH}uO^O80CygHu8EzV6bosvw_T`^Dp ziGw5ihu5BuEw5Ki?Sp5F5}pgBDF@H|Gb3kX9M%jKvyN=p>MbP^^(C9Q6IH`xs>uvj zOxp8|$g}012eNtS^N7*Lfe6z9=}0@}q;q<~4d__+Pp1kg1{%w=Rbu#DyPp=mT?uFw ztTX)Cx+o60D{d7$rkE_iY4qSrsfTKVts%Te?_fk|BR_gNmZ!Zsu1Y*LV8}a@?4TZ% zFTc6J*NCBk+bx#%Ms0ij5fkB2RF^D`_tuW)@UXR15&UFU(Wmx5s2PxYBlsUE?; z@d|XtZlUrQUHn|9?J)klJ(!Vpe&B%rmq|fPNZFjXl7~ToG!A8&{FFWQ=n;S^U}0ll zFnim~MBlf%e?|r{$-Ss1a11D)=JVFKM0|FloT8!`&jqybY8rFO;BxS<;U{n+YWnI( zeq_JC4y@Qe!5uHn6i+q|&}*|E><0aH&dxTnQxCd=nBJYAH+X$jXUwqmF))E_bY`Fb zj_A1-DD@>MhHtd4-xu??zUjVAZ80(S2e{eImp)f_Ph1>$D#1)vYG^ znK&Ca=D3E~6@F#3*7a!UB*rSa&O4>8{->sM(rWjc2LR3Xt##C!%8)pUkUF0c-x z#0ILnZUzGcCw&??&|!#3E)d%W20AYI4FA!Oil}rwUHaLIZ?Pu7b=@tY>g(&>(dp@Y zP{KeC#4oVRL8JCRQiCMEg%^0HnHk*)7{>&`6Ix0tkPky%W@2}4eYx+@Ujv^-*3uG` zhOyho9q;-lYzcU~`8LneHUxb>sVSie7J{QP#2a8UvJF~?x**^W#!hsGd;LM=G!;Vv z3U|wvDRhHjBkd*V0XTU#BLSkfpPdt^I3DLc*u#;1y2(D#kBfxx_F z##zX_rW-N_=`lu_sa8e66tKf>io@73IKB%Cd-b2YjGqT}A{fSaHum5u+^+P=Uk?4; zuj4#!PtO~7i#KPkA0Vr$7Q9PIp8paFy(tWK?5As7^K%DjS|~eAh`WJzX?ExJN=kf0 zY<&Z%5cqT3`Z+q

iuWnEYp*;i}FebG3UvoPS-na!8{!@`0Dlef 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 F{{z`+50(G` From e9928e34d8a2dae24346038a0eecfa72f029a348 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Thu, 8 Aug 2019 14:33:23 +0800 Subject: [PATCH 060/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- package.json | 4 ++-- readme.md | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6d5003..9bff0d0 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ + 修复了单文件调试 文件路径中的 \ 被当做转义符的问题 + 修复了单文件调试 首次运行窗口报错的问题 -+ 优化调试控制台 ++ 优化调试控制台的使用方式 diff --git a/package.json b/package.json index b75198e..9189854 100755 --- a/package.json +++ b/package.json @@ -156,7 +156,7 @@ "type": "array", "description": "被调试文件和VSCode中加载文件路径不一致时,通过此项设置,完成路径替换。输入格式[\"被替换掉的路径\", \"新路径\"]", "default": [] - } + } } } }, @@ -184,7 +184,7 @@ "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, - "luaPath" : "", + "luaPath": "", "packagePath": [], "luaFileExtension": "", "connectionPort": 8818, diff --git a/readme.md b/readme.md index 74d8788..e134832 100644 --- a/readme.md +++ b/readme.md @@ -17,9 +17,9 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` + 升级建议 - 因 VSCode1.33 升级,LuaPanda 2.0.5 前版本无法在 VScode1.33 及更高版本中使用。建议大家在使用中如果遇到问题,把调试器的`LuaPanda.lua,DebugTools.lua`文件更新到最新。`LuaPanda.lua` 的版本可以在此文件头部查看。 + 大家在使用中如果遇到问题,建议先把调试器的 `LuaPanda.lua,DebugTools.lua` 两个文件更新到最新版本。`LuaPanda.lua` 的版本可以在此文件头部查看。 - 下载地址:https://github.com/Tencent/LuaPanda/releases + Release下载地址:https://github.com/Tencent/LuaPanda/releases @@ -39,7 +39,7 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` + v2.2.1 - 小幅更新,优化了单文件调试和调试控制台。 + 小幅更新,优化了单文件调试和调试控制台的使用。 - 修复单文件调试 文件路径中的 \ 被当做转义符的问题。 - 修复单文件调试 首次运行窗口报错的问题。 From 848f132540fc26bb482d03bfc5a1d375a7a55293 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Fri, 9 Aug 2019 10:18:35 +0800 Subject: [PATCH 061/431] =?UTF-8?q?=E5=B7=B2=E8=BF=9E=E6=8E=A5=E6=88=96?= =?UTF-8?q?=E6=98=AF=E9=9D=9E=E8=BF=9E=E6=8E=A5=E7=8A=B6=E6=80=81=E4=B8=8B?= =?UTF-8?q?=E9=83=BD=E6=9B=B4=E6=96=B0=E6=96=AD=E7=82=B9=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/luaDebug.ts | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 84a6b7f..f0f3111 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -25,7 +25,7 @@ export class LuaDebugSession extends LoggingDebugSession { public static isNeedB64EncodeStr: boolean = true; private static THREAD_ID = 1; //调试器不支持多线程,硬编码THREAD_ID为1 public static TCPPort = 0; //和客户端连接的端口号,通过VScode的设置赋值 - private static breakpointsArray; //在socket连接前临时保存断点的数组 + private static breakpointsArray; //在socket连接前临时保存断点的数组 private static autoReconnect; private _configurationDone = new Subject(); private _variableHandles = new Handles(50000);//Handle编号从50000开始 @@ -341,6 +341,26 @@ export class LuaDebugSession extends LoggingDebugSession { breakpoints: vscodeBreakpoints }; + // 更新记录数据中的断点 + if (LuaDebugSession.breakpointsArray == undefined) { + LuaDebugSession.breakpointsArray = new Array(); + } + + let isbkPathExist = false; //断点路径已经存在于断点列表中 + for (var bkMap of LuaDebugSession.breakpointsArray) { + if (bkMap.bkPath == path) { + bkMap["bksArray"] = vscodeBreakpoints; + isbkPathExist = true; + } + } + + if(!isbkPathExist){ + let bk = new Object(); + bk["bkPath"] = path; + bk["bksArray"] = vscodeBreakpoints; + LuaDebugSession.breakpointsArray.push(bk); + } + if (dataProcesser._socket && LuaDebugSession.userConnectionFlag) { //已建立连接 let callbackArgs = new Array(); @@ -352,21 +372,7 @@ export class LuaDebugSession extends LoggingDebugSession { ins.sendResponse(arr[1]);//在收到debugger的返回后,通知VSCode, VSCode界面的断点会变成已验证 }, callbackArgs); } else { - //未连接,记录断点 - if (LuaDebugSession.breakpointsArray != undefined) { - for (var bkMap of LuaDebugSession.breakpointsArray) { - if (bkMap.bkPath == path) { - bkMap["bksArray"] = vscodeBreakpoints; - this.sendResponse(response); - return; - } - } - - let bk = new Object(); - bk["bkPath"] = path; - bk["bksArray"] = vscodeBreakpoints; - LuaDebugSession.breakpointsArray.push(bk); - } + //未连接,直接返回 this.sendResponse(response); } } From 610f79912bb3bb4b40dbd7e0d50468c35cb4324a Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Fri, 9 Aug 2019 10:26:03 +0800 Subject: [PATCH 062/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20reGetSock()=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC=E6=A0=87=E8=AF=86=E6=88=90=E5=8A=9F?= =?UTF-8?q?/=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index da4a7d7..b04d255 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -169,7 +169,10 @@ function this.start(host, port) --尝试初次连接 this.changeRunState(runState.DISCONNECT); - this.reGetSock(); + if not this.reGetSock() then + this.printToConsole("[Error] Start debugger but get Socket fail , please install luasocket!", 2); + return; + end connectHost = host; connectPort = port; local sockSuccess = sock and sock:connect(connectHost, connectPort); @@ -699,7 +702,8 @@ end ----------------------------------------------------------------------------- -- 网络相关方法 ----------------------------------------------------------------------------- ---刷新socket +-- 刷新socket +-- @return true/false 刷新成功/失败 function this.reGetSock() if sock ~= nil then pcall(function() sock:close() end); @@ -718,6 +722,7 @@ function this.reGetSock() sock:settimeout(connectTimeoutSec); else this.printToConsole("[Error] reGetSock fail", 2); + return false; end end else @@ -725,6 +730,7 @@ function this.reGetSock() this.printToConsole("reGetSock ue4 success"); sock:settimeout(connectTimeoutSec); end + return true; end -- 定时(以函数return为时机) 进行attach连接 From 7f68fe585ff21d1e98a585f0d972f40ba369d68f Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Fri, 9 Aug 2019 10:26:34 +0800 Subject: [PATCH 063/431] add package-lock --- package-lock.json | 3583 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3583 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e9ccbab --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3583 @@ +{ + "name": "luapanda", + "version": "2.2.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "dev": true + }, + "@types/node": { + "version": "7.0.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.55.tgz", + "integrity": "sha512-diCxfWNT4g2UM9Y+BPgy4s3egcZ2qOXc0mXLauvbsBUq9SBKQfh0SmuEUEhJVFZt/p6UDsjg1s2EgfM6OSlp4g==", + "dev": true + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "await-notify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/await-notify/-/await-notify-1.0.1.tgz", + "integrity": "sha1-C0gTOyLlJBgeEVV2ZRhfKi885Hw=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cheerio": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.1", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + } + }, + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", + "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", + "dev": true + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", + "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==", + "dev": true + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "gulp-chmod": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", + "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", + "dev": true, + "requires": { + "deep-assign": "^1.0.0", + "stat-mode": "^0.2.0", + "through2": "^2.0.0" + } + }, + "gulp-filter": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", + "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", + "dev": true, + "requires": { + "multimatch": "^2.0.0", + "plugin-error": "^0.1.2", + "streamfilter": "^1.0.5" + } + }, + "gulp-gunzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", + "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", + "dev": true, + "requires": { + "through2": "~0.6.5", + "vinyl": "~0.4.6" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "gulp-remote-src": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/gulp-remote-src/-/gulp-remote-src-0.4.4.tgz", + "integrity": "sha512-mo7lGgZmNXyTbcUzfjSnUVkx1pnqqiwv/pPaIrYdTO77hq0WNTxXLAzQdoYOnyJ0mfVLNmNl9AGqWLiAzTPMMA==", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "node.extend": "~1.1.2", + "request": "^2.88.0", + "through2": "~2.0.3", + "vinyl": "~2.0.1" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "vinyl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.0.2.tgz", + "integrity": "sha1-CjcT2NTpIhxY8QyhbAEWyeJe2nw=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "is-stream": "^1.1.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "^1.1.1", + "graceful-fs": "^4.1.2", + "strip-bom": "^2.0.0", + "through2": "^2.0.0", + "vinyl": "^1.0.0" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-symdest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.1.tgz", + "integrity": "sha512-UHd3MokfIN7SrFdsbV5uZTwzBpL0ZSTu7iq98fuDqBGZ0dlHxgbQBJwfd6qjCW83snkQ3Hz9IY4sMRMz2iTq7w==", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "mkdirp": "^0.5.1", + "queue": "^3.1.0", + "vinyl-fs": "^2.4.3" + } + }, + "gulp-untar": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz", + "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=", + "dev": true, + "requires": { + "event-stream": "~3.3.4", + "gulp-util": "~3.0.8", + "streamifier": "~0.1.1", + "tar": "^2.2.1", + "through2": "~2.0.3" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-vinyl-zip": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.2.tgz", + "integrity": "sha512-wJn09jsb8PyvUeyFF7y7ImEJqJwYy40BqL9GKfJs6UGpaGW9A+N68Q+ajsIpb9AeR6lAdjMbIdDPclIGo1/b7Q==", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "queue": "^4.2.1", + "through2": "^2.0.3", + "vinyl": "^2.0.2", + "vinyl-fs": "^3.0.3", + "yauzl": "^2.2.1", + "yazl": "^2.2.1" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "queue": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz", + "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.1.tgz", + "integrity": "sha512-SpwyojlnE/WRBNGtvJSNfllfm5PqEDFxcWluSIgLeSBJtXG4DmoX2NNAeEA7rP5kK+79VgtVq8nG6HskaL1ykg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node.extend": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.8.tgz", + "integrity": "sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==", + "dev": true, + "requires": { + "has": "^1.0.3", + "is": "^3.2.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", + "dev": true, + "requires": { + "semver": "^5.1.0" + } + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "psl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", + "dev": true + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "queue": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", + "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "~0.1.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamfilter": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", + "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "streamifier": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", + "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tslint": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", + "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.12.1" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tunnel": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "typed-rest-client": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-0.9.0.tgz", + "integrity": "sha1-92jMDcP06VDwbgSCXDaz54NKofI=", + "dev": true, + "requires": { + "tunnel": "0.0.4", + "underscore": "1.8.3" + }, + "dependencies": { + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + } + } + }, + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "dev": true + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + }, + "dependencies": { + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-join": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", + "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", + "dev": true + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "vinyl-source-stream": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", + "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", + "dev": true, + "requires": { + "through2": "^2.0.3", + "vinyl": "^0.4.3" + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "vsce": { + "version": "1.37.5", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.37.5.tgz", + "integrity": "sha512-AIFKhrdhp/sJ2eYM/Nq1xzJPxo/IHemStkQsNIvbY/pyB8gADvrSayUfw4eLt6ffyKa+6+OeExyDvAg6L3X4Pw==", + "dev": true, + "requires": { + "cheerio": "^1.0.0-rc.1", + "commander": "^2.8.1", + "denodeify": "^1.2.1", + "glob": "^7.0.6", + "lodash": "^4.15.0", + "markdown-it": "^8.3.1", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "osenv": "^0.1.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "0.0.29", + "url-join": "^1.1.0", + "vso-node-api": "6.1.2-preview", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + } + }, + "vscode": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.10.tgz", + "integrity": "sha512-MvFXXSGuhw0Q6GC6dQrnRc0ES+63wpttGIoYGBMQnoS9JFCCNC/rWfX0lBCHJyuKL2Q8CYg0ROsMEHbHVwEtVw==", + "dev": true, + "requires": { + "glob": "^7.1.2", + "gulp-chmod": "^2.0.0", + "gulp-filter": "^5.0.1", + "gulp-gunzip": "1.0.0", + "gulp-remote-src": "^0.4.3", + "gulp-symdest": "^1.1.0", + "gulp-untar": "^0.0.6", + "gulp-vinyl-zip": "^2.1.0", + "mocha": "^4.0.1", + "request": "^2.83.0", + "semver": "^5.4.1", + "source-map-support": "^0.5.0", + "url-parse": "^1.1.9", + "vinyl-source-stream": "^1.1.0" + }, + "dependencies": { + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + } + } + }, + "vscode-debugadapter": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.27.0.tgz", + "integrity": "sha512-JwE3fWmKnpjYnFqhff0umqIJi4c26gh/CXZ5LNb4gLIuPd5sEAEoEbGeCcAaajuTrVxFw6FlYEep9y+IQCf+ww==", + "requires": { + "vscode-debugprotocol": "1.27.0" + } + }, + "vscode-debugadapter-testsupport": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/vscode-debugadapter-testsupport/-/vscode-debugadapter-testsupport-1.27.0.tgz", + "integrity": "sha512-rhNVFSeEtSfHZ8ZES1AKaY3vjfEgRbnikCsoDV0/Vu/jfuGnUlNMgWm+vbvtTlTIBPNjn2KKXU6ymYDjMwuW2Q==", + "dev": true, + "requires": { + "vscode-debugprotocol": "1.27.0" + } + }, + "vscode-debugprotocol": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.27.0.tgz", + "integrity": "sha512-cg3lKqVwxNpO2pLBxSwkBvE7w06+bHfbA/s14u8izSWyhJtPgRu1lQwi5tEyTRuwfEugfoPwerYL4vtY6teQDw==" + }, + "vso-node-api": { + "version": "6.1.2-preview", + "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.1.2-preview.tgz", + "integrity": "sha1-qrNUbfJFHs2JTgcbuZtd8Zxfp48=", + "dev": true, + "requires": { + "q": "^1.0.1", + "tunnel": "0.0.4", + "typed-rest-client": "^0.9.0", + "underscore": "^1.8.3" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3" + } + } + } +} From 0cb52fe908b2121b86a53771898bee3464627153 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Sun, 11 Aug 2019 20:27:02 +0800 Subject: [PATCH 064/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=9C=A8?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E5=99=A8=E5=90=AF=E5=8A=A8=E6=97=B6=E6=8B=89?= =?UTF-8?q?=E8=B5=B7program=E6=8C=87=E5=90=91=E7=9A=84=E5=8F=AF=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 9 +++++++-- src/extension.ts | 8 ++++++++ src/luaDebug.ts | 19 +++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9189854..bb1d030 100755 --- a/package.json +++ b/package.json @@ -84,9 +84,14 @@ "properties": { "program": { "type": "string", - "description": "Absolute path to a text file.", + "description": "随调试器启动的可执行文件路径", "default": "${workspaceFolder}" }, + "args": { + "type": "array", + "description": "program 执行时需要的参数, 结构是一个字符串数组", + "default": [] + }, "trace": { "type": "boolean", "description": "Enable logging of the Debug Adapter Protocol.", @@ -167,6 +172,7 @@ "internalConsoleOptions": "openOnFirstSessionStart", "name": "LuaPanda", "program": "${workspaceFolder}", + "args":[], "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, "docPathReplace": [], @@ -181,7 +187,6 @@ "request": "launch", "internalConsoleOptions": "neverOpen", "name": "LuaPanda-DebugFile", - "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, "luaPath": "", diff --git a/src/extension.ts b/src/extension.ts index 4239a96..3d8128f 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -79,6 +79,14 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { return ; } + if(!config.program){ + config.program = ''; + } + + if(!config.args){ + config.args = new Array(); + } + if (!config.request) { vscode.window.showInformationMessage("请在launch中配置request方式!"); config.request = 'launch'; diff --git a/src/luaDebug.ts b/src/luaDebug.ts index f0f3111..89834a1 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -304,6 +304,25 @@ export class LuaDebugSession extends LoggingDebugSession { terminal.show(); } } + else{ + // 非单文件调试模式下,拉起program + let fs = require('fs'); + if(fs.existsSync(args.program) && fs.statSync(args.program).isFile()){ + //program 和 args 分开 + const terminal = vscode.window.createTerminal({ + name: "Run program file (LuaPanda)", + env: {}, + }); + + let progaamCmdwithArgs = args.program; + for (const arg of args.args) { + progaamCmdwithArgs = progaamCmdwithArgs + " " + arg; + } + + terminal.sendText(progaamCmdwithArgs , true); + terminal.show(); + } + } } /** From c1f47c1c8992aa05d80ae88cf28a2ec057f3b203 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Sat, 17 Aug 2019 16:04:44 +0800 Subject: [PATCH 065/431] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=8D=95?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=B0=83=E8=AF=95=E6=97=B6=EF=BC=8C=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC=E5=AF=BC=E8=87=B4=E6=89=A7=E8=A1=8Clua=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=B7=AF=E5=BE=84=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/luaDebug.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 89834a1..37de7b9 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -270,6 +270,7 @@ export class LuaDebugSession extends LoggingDebugSession { let pathArray = activeFileUri.split(path.sep); let filePath = pathArray.join('/'); + filePath = '"' + filePath + '"'; //给路径加上"" //直接运行 const terminal = vscode.window.createTerminal({ name: "Run Lua File (LuaPanda)", From 76ed1dc107afe6f77edac6f58d98b35a78e621c2 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Fri, 23 Aug 2019 16:57:46 +0800 Subject: [PATCH 066/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E5=8D=95?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=B0=83=E8=AF=95=E5=92=8C=E5=8D=95=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=BF=90=E8=A1=8C=EF=BC=8C=E6=8A=8A=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E6=96=B9=E6=B3=95=E6=8F=90=E5=88=B0Tools?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Tools.ts | 61 ++++++++++++++++++++++--- src/extension.ts | 64 +++++++++++++++------------ src/luaDebug.ts | 113 ++++++++++++++++++----------------------------- 3 files changed, 132 insertions(+), 106 deletions(-) diff --git a/src/Tools.ts b/src/Tools.ts index 472bd93..bf2a77d 100644 --- a/src/Tools.ts +++ b/src/Tools.ts @@ -1,13 +1,60 @@ +import * as vscode from 'vscode'; +let path = require("path"); export class Tools { - public static genUnifiedPath(path) { + // 把传入的路径标准路径 + public static genUnifiedPath(beProcessPath) : string{ //全部使用 / - path = path.replace(/\\/g, '/'); - while(path.match(/\/\//)){ - path = path.replace(/\/\//g, '/'); + beProcessPath = beProcessPath.replace(/\\/g, '/'); + while(beProcessPath.match(/\/\//)){ + beProcessPath = beProcessPath.replace(/\/\//g, '/'); + } + //win盘符转为小写 + beProcessPath = beProcessPath.replace(/^\w:/, function($1){return $1.toLocaleLowerCase()}); + return beProcessPath; + } + + // 获取当前VScode活跃窗口的文件路径 + public static getVSCodeAvtiveFilePath(): Object{ + let retObject = {retCode : 0, retMsg : "", filePath: "" }; + + let activeWindow = vscode.window.activeTextEditor; + if (activeWindow){ + let activeFileUri = ''; + // 先判断当前活动窗口的 uri 是否有效 + let activeScheme = activeWindow.document.uri.scheme; + if( activeScheme !== "file" ){ + // 当前活动窗口不是file类型,遍历 visibleTextEditors,取出file类型的窗口 + let visableTextEditorArray = vscode.window.visibleTextEditors; + for (const key in visableTextEditorArray) { + const editor = visableTextEditorArray[key]; + let editScheme = editor.document.uri.scheme; + if(editScheme === "file"){ + activeFileUri = editor.document.uri.fsPath; + break; + } + } + }else{ + // 使用 activeWindow + activeFileUri = activeWindow.document.uri.fsPath + } + if(activeFileUri === ''){ + retObject.retMsg = "[Error]: adapter start file debug, but file Uri is empty string"; + retObject.retCode = -1; + return retObject; + } + + let pathArray = activeFileUri.split(path.sep); + let filePath = pathArray.join('/'); + filePath = '"' + filePath + '"'; //给路径加上"" + + retObject.filePath = filePath; + return retObject; + + }else{ + retObject.retMsg = "[Error]: can not get vscode activeWindow"; + retObject.retCode = -1; + return retObject; } - //win盘符小写 - path = path.replace(/^\w:/, function($1){return $1.toLocaleLowerCase()}); - return path; } } diff --git a/src/extension.ts b/src/extension.ts index 3d8128f..22a3268 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -5,6 +5,7 @@ import * as Net from 'net'; import { LuaDebugSession } from './luaDebug'; import { DebugLogger } from './LogManager'; import { StatusBarManager } from './StatusBarManager'; +import { Tools } from './Tools'; export function activate(context: vscode.ExtensionContext) { //reloadWindow @@ -45,37 +46,42 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { } } + // 不调试而直接运行当前文件 if(config.noDebug){ - let activeWindow = vscode.window.activeTextEditor; - if (activeWindow){ - //有活动的窗口 - let filePath = activeWindow.document.uri.fsPath; - - let pathCMD = "'"; - if(config.packagePath){ - for (let index = 0; index < config.packagePath.length; index++) { - const joinPath = config.packagePath[index]; - pathCMD = pathCMD + joinPath + ";"; - } - } - pathCMD = pathCMD + "'"; - //拼接命令 - pathCMD = " \"package.path = " + pathCMD + ".. package.path;\" "; - let doFileCMD = filePath; - let runCMD = pathCMD + doFileCMD; - const terminal = vscode.window.createTerminal({ - name: "Run Lua File (LuaPanda)", - env: {}, - }); - let LuaCMD; - if(config.luaPath && config.luaPath != ''){ - LuaCMD = config.luaPath + " -e " - }else{ - LuaCMD = "lua -e "; - } - terminal.sendText( LuaCMD + runCMD , true); - terminal.show(); + // 获取活跃窗口 + let retObject = Tools.getVSCodeAvtiveFilePath(); + if( retObject["retCode"] !== 0 ){ + DebugLogger.DebuggerInfo(retObject["retMsg"]); + return; } + let filePath = retObject["filePath"]; + + const terminal = vscode.window.createTerminal({ + name: "Run Lua File (LuaPanda)", + env: {}, + }); + + // 把路径加入package.path + let path = require("path"); + let pathCMD = "'"; + let pathArr = path.dirname(__dirname).split( path.sep ); + let stdPath = pathArr.join('/'); + pathCMD = pathCMD + stdPath + "/Debugger/?.lua;" + pathCMD = pathCMD + config.packagePath.join(';') + pathCMD = pathCMD + "'"; + //拼接命令 + pathCMD = " \"package.path = " + pathCMD + ".. package.path;\" "; + let doFileCMD = filePath; + let runCMD = pathCMD + doFileCMD; + + let LuaCMD; + if(config.luaPath && config.luaPath !== ''){ + LuaCMD = config.luaPath + " -e " + }else{ + LuaCMD = "lua -e "; + } + terminal.sendText( LuaCMD + runCMD , true); + terminal.show(); return ; } diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 37de7b9..39264e7 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -152,7 +152,7 @@ export class LuaDebugSession extends LoggingDebugSession { let adapterVersion = pkg.version; sendArgs["adapterVersion"] = String(adapterVersion); - if(args.docPathReplace instanceof Array && args.docPathReplace.length == 2 ){ + if(args.docPathReplace instanceof Array && args.docPathReplace.length === 2 ){ LuaDebugSession.replacePath = new Array( Tools.genUnifiedPath(String(args.docPathReplace[0])), Tools.genUnifiedPath(String(args.docPathReplace[1]))); }else{ LuaDebugSession.replacePath = null; @@ -178,7 +178,7 @@ export class LuaDebugSession extends LoggingDebugSession { //转数字 let DVerArr = info.debuggerVer.split("."); let AVerArr = String(adapterVersion).split("."); - if (DVerArr.length == AVerArr.length && DVerArr.length == 3 ){ + if (DVerArr.length === AVerArr.length && DVerArr.length === 3 ){ //比较大版本,大版本相差1就提示 if ( parseInt(AVerArr[0]) > parseInt(DVerArr[0]) ){ this._runtime.showTip("调试器Lua文件版本过低, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); @@ -189,7 +189,7 @@ export class LuaDebugSession extends LoggingDebugSession { } } } - if (info.UseLoadstring == "1") { + if (info.UseLoadstring === "1") { this.UseLoadstring = true; } else { this.UseLoadstring = false; @@ -199,14 +199,14 @@ export class LuaDebugSession extends LoggingDebugSession { } else { LuaDebugSession.isNeedB64EncodeStr = false; } - if (info.UseHookLib == "1") { } + if (info.UseHookLib === "1") { } //已建立连接,并完成初始化 let ins = arr[0]; ins.sendResponse(arr[1]); LuaDebugSession.userConnectionFlag = true; LuaDebugSession.isListening = false; //发送断点信息 - for (var bkMap of LuaDebugSession.breakpointsArray) { + for (let bkMap of LuaDebugSession.breakpointsArray) { this._runtime.setBreakPoint(bkMap.bkPath, bkMap.bksArray, null, null); } }, callbackArgs, sendArgs); @@ -242,68 +242,41 @@ export class LuaDebugSession extends LoggingDebugSession { this.sendEvent(new InitializedEvent()); //收到返回后,执行setbreakpoint //单文件调试模式 - if(args.name == 'LuaPanda-DebugFile'){ - let activeWindow = vscode.window.activeTextEditor; - if (activeWindow){ - let activeFileUri = ''; - // 先判断当前活动窗口的 uri 是否有效 - let activeScheme = activeWindow.document.uri.scheme; - if( activeScheme != "file" ){ - // 当前活动窗口不是file类型,遍历 visibleTextEditors,取出file类型的窗口 - let visableTextEditorArray = vscode.window.visibleTextEditors; - for (const key in visableTextEditorArray) { - const editor = visableTextEditorArray[key]; - let editScheme = editor.document.uri.scheme; - if(editScheme == "file"){ - activeFileUri = editor.document.uri.fsPath; - break; - } - } - }else{ - // 使用 activeWindow - activeFileUri = activeWindow.document.uri.fsPath - } - if(activeFileUri == ''){ - DebugLogger.DebuggerInfo("[Error]: adapter start file debug, but file Uri is empty string"); - return; - } + if(args.name === 'LuaPanda-DebugFile'){ + // 获取活跃窗口 + let retObject = Tools.getVSCodeAvtiveFilePath(); + if( retObject["retCode"] !== 0 ){ + DebugLogger.DebuggerInfo(retObject["retMsg"]); + return; + } + let filePath = retObject["filePath"]; - let pathArray = activeFileUri.split(path.sep); - let filePath = pathArray.join('/'); - filePath = '"' + filePath + '"'; //给路径加上"" - //直接运行 - const terminal = vscode.window.createTerminal({ - name: "Run Lua File (LuaPanda)", - env: {}, - }); + const terminal = vscode.window.createTerminal({ + name: "Run Lua File (LuaPanda)", + env: {}, + }); - //把路径加入package.path - let pathCMD = "'"; - let pathArr = path.dirname(__dirname).split( path.sep ); - let stdPath = pathArr.join('/'); - pathCMD = pathCMD + stdPath + "/Debugger/?.lua;" - if(args.packagePath){ - for (let index = 0; index < args.packagePath.length; index++) { - const joinPath = args.packagePath[index]; - pathCMD = pathCMD + joinPath + ";"; - } - } - pathCMD = pathCMD + "'"; - //拼接命令 - pathCMD = " \"package.path = " + pathCMD + ".. package.path; "; - let reqCMD = "require('LuaPanda').start('127.0.0.1'," + LuaDebugSession.TCPPort + ");\" "; - let doFileCMD = filePath; - let runCMD = pathCMD + reqCMD + doFileCMD; - - let LuaCMD; - if(args.luaPath && args.luaPath != ''){ - LuaCMD = args.luaPath + " -e " - }else{ - LuaCMD = "lua -e "; - } - terminal.sendText( LuaCMD + runCMD , true); - terminal.show(); + // 把路径加入package.path + let pathCMD = "'"; + let pathArr = path.dirname(__dirname).split( path.sep ); + let stdPath = pathArr.join('/'); + pathCMD = pathCMD + stdPath + "/Debugger/?.lua;" + pathCMD = pathCMD + args.packagePath.join(';') + pathCMD = pathCMD + "'"; + //拼接命令 + pathCMD = " \"package.path = " + pathCMD + ".. package.path; "; + let reqCMD = "require('LuaPanda').start('127.0.0.1'," + LuaDebugSession.TCPPort + ");\" "; + let doFileCMD = filePath; + let runCMD = pathCMD + reqCMD + doFileCMD; + + let LuaCMD; + if(args.luaPath && args.luaPath !== ''){ + LuaCMD = args.luaPath + " -e " + }else{ + LuaCMD = "lua -e "; } + terminal.sendText( LuaCMD + runCMD , true); + terminal.show(); } else{ // 非单文件调试模式下,拉起program @@ -334,7 +307,7 @@ export class LuaDebugSession extends LoggingDebugSession { let path = args.source.path; path = Tools.genUnifiedPath(path); - if(LuaDebugSession.replacePath && LuaDebugSession.replacePath.length == 2){ + if(LuaDebugSession.replacePath && LuaDebugSession.replacePath.length === 2){ path = path.replace(LuaDebugSession.replacePath[1], LuaDebugSession.replacePath[0]); } @@ -367,8 +340,8 @@ export class LuaDebugSession extends LoggingDebugSession { } let isbkPathExist = false; //断点路径已经存在于断点列表中 - for (var bkMap of LuaDebugSession.breakpointsArray) { - if (bkMap.bkPath == path) { + for (let bkMap of LuaDebugSession.breakpointsArray) { + if (bkMap.bkPath === path) { bkMap["bksArray"] = vscodeBreakpoints; isbkPathExist = true; } @@ -408,7 +381,7 @@ export class LuaDebugSession extends LoggingDebugSession { response.body = { stackFrames: stk.frames.map(f => { let source = f.file; - if(LuaDebugSession.replacePath && LuaDebugSession.replacePath.length == 2){ + if(LuaDebugSession.replacePath && LuaDebugSession.replacePath.length === 2){ source = source.replace(LuaDebugSession.replacePath[0], LuaDebugSession.replacePath[1]); } return new StackFrame(f.index, f.name, this.createSource(source), f.line); @@ -439,7 +412,7 @@ export class LuaDebugSession extends LoggingDebugSession { } this._runtime.getWatchedVariable((arr, info) => { - if (info.length == 0) { + if (info.length === 0) { //没有查到 arr[1].body = { result: '未能查到变量的值', @@ -463,7 +436,7 @@ export class LuaDebugSession extends LoggingDebugSession { callbackArgs.push(this); callbackArgs.push(response); this._runtime.getREPLExpression((arr, info) => { - if (info.length == 0) { + if (info.length === 0) { //没有查到 arr[1].body = { result: 'nil', From 29dfa24bb62b57317f01ec4ded15da84d9081338 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Fri, 30 Aug 2019 18:42:42 +0800 Subject: [PATCH 067/431] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E7=B1=BB=E5=90=8D=E5=A4=A7=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dataProcesser.ts | 66 +++++++++++++++++++++--------------------- src/luaDebug.ts | 20 ++++++------- src/luaDebugRuntime.ts | 26 ++++++++--------- 3 files changed, 56 insertions(+), 56 deletions(-) diff --git a/src/dataProcesser.ts b/src/dataProcesser.ts index f1bf33d..3f5ee1e 100644 --- a/src/dataProcesser.ts +++ b/src/dataProcesser.ts @@ -1,12 +1,12 @@ -import { luaDebugRuntime } from './luaDebugRuntime'; +import { LuaDebugRuntime } from './luaDebugRuntime'; import { Socket } from 'net'; import { DebugLogger } from './LogManager'; import { LuaDebugSession } from './luaDebug'; //网络收发消息,记录回调 -export class dataProcesser { +export class DataProcesser { - public static _runtime: luaDebugRuntime; //RunTime句柄 + public static _runtime: LuaDebugRuntime; //RunTime句柄 public static _socket: Socket; private static orderList: Array = new Array(); //记录随机数和它对应的回调 private static recvMsgQueue: Array = new Array(); //记录粘包的多条指令 @@ -23,36 +23,36 @@ export class dataProcesser { this.cutoffString = ""; } - let pos = data.indexOf(dataProcesser._runtime.TCPSplitChar); + let pos = data.indexOf(DataProcesser._runtime.TCPSplitChar); if (pos < 0) { //没有分隔符,做截断判断 - dataProcesser.processCutoffMsg(data); + DataProcesser.processCutoffMsg(data); } else { do { let data_save = data.substring(0, pos); //保存的命令 - data = data.substring(pos + dataProcesser._runtime.TCPSplitChar.length, data.length); - dataProcesser.recvMsgQueue.push(data_save); - pos = data.indexOf(dataProcesser._runtime.TCPSplitChar); + data = data.substring(pos + DataProcesser._runtime.TCPSplitChar.length, data.length); + DataProcesser.recvMsgQueue.push(data_save); + pos = data.indexOf(DataProcesser._runtime.TCPSplitChar); if (pos < 0) { //没有分隔符时,剩下的字符串不为空 - dataProcesser.processCutoffMsg(data); + DataProcesser.processCutoffMsg(data); } } while (pos > 0); - while (dataProcesser.recvMsgQueue.length > 0) { - let dt1 = dataProcesser.recvMsgQueue.shift(); //从头部取元素,保证是一个队列形式 - dataProcesser.getData(String(dt1)); + while (DataProcesser.recvMsgQueue.length > 0) { + let dt1 = DataProcesser.recvMsgQueue.shift(); //从头部取元素,保证是一个队列形式 + DataProcesser.getData(String(dt1)); } } //最后处理一下超时回调 - for (let index = 0; index < dataProcesser.orderList.length; index++) { - const element = dataProcesser.orderList[index]; + for (let index = 0; index < DataProcesser.orderList.length; index++) { + const element = DataProcesser.orderList[index]; if ( element["timeOut"] && Date.now() > element["timeOut"] ){ // dataProcesser._runtime.showError(element["callbackId"] + " 请求超时! 详细请求信息可在 Adapter/log 中搜索此id查看"); let cb = element["callback"]; cb(element["callbackArgs"]); - dataProcesser.orderList.splice(index, 1); + DataProcesser.orderList.splice(index, 1); } } } @@ -64,7 +64,7 @@ export class dataProcesser { private static processCutoffMsg(orgData: string) { let data = orgData.trim(); if (data.length > 0) { - dataProcesser.cutoffString = dataProcesser.cutoffString + data; //被截断的部分 + DataProcesser.cutoffString = DataProcesser.cutoffString + data; //被截断的部分 } } @@ -90,7 +90,7 @@ export class dataProcesser { } catch(e){ if(LuaDebugSession.isNeedB64EncodeStr){ - dataProcesser._runtime.showError(" JSON 解析失败! " + data); + DataProcesser._runtime.showError(" JSON 解析失败! " + data); DebugLogger.AdapterInfo("[Adapter Error]: JSON 解析失败! " + data); }else{ this.getDataJsonCatch = data + "|*|"; @@ -98,21 +98,21 @@ export class dataProcesser { return; } - if (dataProcesser._runtime != null) { + if (DataProcesser._runtime != null) { if (cmdInfo == null) { - dataProcesser._runtime.showError("JSON 解析失败! no cmdInfo:" + data); + DataProcesser._runtime.showError("JSON 解析失败! no cmdInfo:" + data); DebugLogger.AdapterInfo("[Adapter Error]:JSON解析失败 no cmdInfo:"+ data); return; } if (cmdInfo["cmd"] == undefined) { - dataProcesser._runtime.showError("JSON 解析失败! no cmd:" + data); + DataProcesser._runtime.showError("JSON 解析失败! no cmd:" + data); DebugLogger.AdapterInfo("[Adapter Warning]:JSON 解析失败 no cmd:"+ data); } if (cmdInfo["callbackId"] != undefined && cmdInfo["callbackId"] != "0") { //进入回调(如增加断点) - for (let index = 0; index < dataProcesser.orderList.length; index++) { - const element = dataProcesser.orderList[index]; + for (let index = 0; index < DataProcesser.orderList.length; index++) { + const element = DataProcesser.orderList[index]; if (element["callbackId"] == cmdInfo["callbackId"]) { let cb = element["callback"]; if (cmdInfo["info"] != null) { @@ -120,35 +120,35 @@ export class dataProcesser { } else { cb(element["callbackArgs"]); } - dataProcesser.orderList.splice(index, 1); + DataProcesser.orderList.splice(index, 1); return; } } DebugLogger.AdapterInfo("[Adapter Error]: 没有在列表中找到回调"); } else { if (cmdInfo["cmd"] == "refreshLuaMemory") { - dataProcesser._runtime.refreshLuaMemoty(cmdInfo["info"]["memInfo"]); + DataProcesser._runtime.refreshLuaMemoty(cmdInfo["info"]["memInfo"]); return; } if (cmdInfo["cmd"] == "tip") { - dataProcesser._runtime.showTip(cmdInfo["info"]["logInfo"]); + DataProcesser._runtime.showTip(cmdInfo["info"]["logInfo"]); return; } if (cmdInfo["cmd"] == "tipError") { - dataProcesser._runtime.showError(cmdInfo["info"]["logInfo"]); + DataProcesser._runtime.showError(cmdInfo["info"]["logInfo"]); return; } if (cmdInfo["cmd"] == "stopOnBreakpoint" || cmdInfo["cmd"] == "stopOnEntry" || cmdInfo["cmd"] == "stopOnStep" || cmdInfo["cmd"] == "stopOnStepIn" || cmdInfo["cmd"] == "stopOnStepOut") { // 进入断点/step停止 let stackInfo = cmdInfo["stack"]; - dataProcesser._runtime.stop(stackInfo, cmdInfo["cmd"]); + DataProcesser._runtime.stop(stackInfo, cmdInfo["cmd"]); } else if (cmdInfo["cmd"] == "log") { let logStr = cmdInfo["info"]["logInfo"]; if (logStr != null) { - dataProcesser._runtime.printLog(logStr); + DataProcesser._runtime.printLog(logStr); } } } @@ -176,7 +176,7 @@ export class dataProcesser { isSame = false; ranNum = Math.floor(Math.random() * (max - min + 1) + min); //检查随机数唯一性 - dataProcesser.orderList.forEach(element => { + DataProcesser.orderList.forEach(element => { if (element["callbackId"] == ranNum) { //若遍历后isSame依然是false,说明没有重合 isSame = true; @@ -194,17 +194,17 @@ export class dataProcesser { if (callbackArgs != null) { dic["callbackArgs"] = callbackArgs; } - dataProcesser.orderList.push(dic); + DataProcesser.orderList.push(dic); sendObj["callbackId"] = ranNum.toString(); } sendObj["cmd"] = cmd; sendObj["info"] = sendObject; - const str = JSON.stringify(sendObj) + " " + dataProcesser._runtime.TCPSplitChar + "\n"; + const str = JSON.stringify(sendObj) + " " + DataProcesser._runtime.TCPSplitChar + "\n"; //记录随机数和回调的对应关系 - if (dataProcesser._socket != undefined) { + if (DataProcesser._socket != undefined) { DebugLogger.AdapterInfo("[Send Msg]:" + str); - dataProcesser._socket.write(str); + DataProcesser._socket.write(str); } else { DebugLogger.AdapterInfo("[Send Msg but socket deleted]:" + str); } diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 39264e7..44943af 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -13,10 +13,10 @@ import { } from 'vscode-debugadapter'; import { DebugProtocol } from 'vscode-debugprotocol'; import { basename } from 'path'; -import { luaDebugRuntime, LuaBreakpoint } from './luaDebugRuntime'; +import { LuaDebugRuntime, LuaBreakpoint } from './luaDebugRuntime'; const { Subject } = require('await-notify'); import * as Net from 'net'; -import { dataProcesser } from './dataProcesser'; +import { DataProcesser } from './dataProcesser'; import { DebugLogger } from './LogManager'; import { StatusBarManager } from './StatusBarManager'; import { LineBreakpoint, ConditionBreakpoint, LogPoint } from './BreakPoint'; @@ -41,7 +41,7 @@ export class LuaDebugSession extends LoggingDebugSession { } //luaDebugRuntime实例 - private _runtime: luaDebugRuntime; + private _runtime: LuaDebugRuntime; private UseLoadstring: boolean = false; public getRuntime() { @@ -55,8 +55,8 @@ export class LuaDebugSession extends LoggingDebugSession { this.setDebuggerLinesStartAt1(true); this.setDebuggerColumnsStartAt1(true); //设置runtime实例 - this._runtime = new luaDebugRuntime(); - dataProcesser._runtime = this._runtime; + this._runtime = new LuaDebugRuntime(); + DataProcesser._runtime = this._runtime; this._runtime.TCPSplitChar = "|*|"; //给状态绑定监听方法 this._runtime.on('stopOnEntry', () => { @@ -169,7 +169,7 @@ export class LuaDebugSession extends LoggingDebugSession { LuaDebugSession._server = Net.createServer(socket => { //--connect-- DebugLogger.AdapterInfo("Debugger " + socket.remoteAddress + ":" + socket.remotePort + " connect!"); - dataProcesser._socket = socket; + DataProcesser._socket = socket; //向debugger发送含配置项的初始化协议 this._runtime.start((arr, info) => { DebugLogger.AdapterInfo("已建立连接,发送初始化协议和断点信息!"); @@ -225,17 +225,17 @@ export class LuaDebugSession extends LoggingDebugSession { //停止连接 LuaDebugSession._server.close(); LuaDebugSession.userConnectionFlag = false; - delete dataProcesser._socket; + delete DataProcesser._socket; //停止VSCode的调试模式 this.sendEvent(new TerminatedEvent(LuaDebugSession.autoReconnect)); }); socket.on('data', (data) => { DebugLogger.AdapterInfo('[Get Msg]:' + data); - dataProcesser.processMsg(data.toString()); + DataProcesser.processMsg(data.toString()); }); }).listen(LuaDebugSession.TCPPort, function () { - DebugLogger.AdapterInfo("listen"); + DebugLogger.AdapterInfo("listening..."); }); LuaDebugSession.isListening = true; LuaDebugSession.breakpointsArray = new Array(); @@ -354,7 +354,7 @@ export class LuaDebugSession extends LoggingDebugSession { LuaDebugSession.breakpointsArray.push(bk); } - if (dataProcesser._socket && LuaDebugSession.userConnectionFlag) { + if (DataProcesser._socket && LuaDebugSession.userConnectionFlag) { //已建立连接 let callbackArgs = new Array(); callbackArgs.push(this); diff --git a/src/luaDebugRuntime.ts b/src/luaDebugRuntime.ts index 2b67ba6..0ef4177 100755 --- a/src/luaDebugRuntime.ts +++ b/src/luaDebugRuntime.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode'; import { EventEmitter } from 'events'; -import { dataProcesser } from './dataProcesser'; +import { DataProcesser } from './dataProcesser'; import { DebugProtocol } from 'vscode-debugprotocol'; import { DebugLogger } from './LogManager'; import { StatusBarManager } from './StatusBarManager'; @@ -11,7 +11,7 @@ export interface LuaBreakpoint { verified: boolean; } -export class luaDebugRuntime extends EventEmitter { +export class LuaDebugRuntime extends EventEmitter { //当前读取的文件 private _sourceFile: string; public get sourceFile() { @@ -47,10 +47,10 @@ export class luaDebugRuntime extends EventEmitter { */ public start(callback, callbackArgs, sendArgs) { let arrSend = new Object(); - for (var key in sendArgs) { + for (let key in sendArgs) { arrSend[key] = String(sendArgs[key]); } - dataProcesser.commandToDebugger('initSuccess', arrSend, callback, callbackArgs); + DataProcesser.commandToDebugger('initSuccess', arrSend, callback, callbackArgs); } /** @@ -62,7 +62,7 @@ export class luaDebugRuntime extends EventEmitter { public continue(callback, callbackArgs, event = 'continue') { DebugLogger.AdapterInfo("continue"); let arrSend = new Object(); - dataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); + DataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); } /** @@ -78,7 +78,7 @@ export class luaDebugRuntime extends EventEmitter { let arrSend = new Object(); arrSend["varName"] = String(varName); arrSend["stackId"] = String(frameId); - dataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); + DataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); } /** @@ -94,7 +94,7 @@ export class luaDebugRuntime extends EventEmitter { let arrSend = new Object(); arrSend["Expression"] = String(expression); arrSend["stackId"] = String(frameId); - dataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); + DataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); } /** @@ -114,7 +114,7 @@ export class luaDebugRuntime extends EventEmitter { arrSend["stackId"] = String(frameId); arrSend["newValue"] = String(newValue); arrSend["varName"] = String(name); - dataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); + DataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); } /** @@ -131,7 +131,7 @@ export class luaDebugRuntime extends EventEmitter { let arrSend = new Object(); arrSend["varRef"] = String(variableRef); arrSend["stackId"] = String(frameId); - dataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs, 3); + DataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs, 3); } /** @@ -139,7 +139,7 @@ export class luaDebugRuntime extends EventEmitter { */ public stopRun(callback, callbackArgs, event = 'stopRun') { let arrSend = new Object(); - dataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); + DataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); } /** @@ -148,7 +148,7 @@ export class luaDebugRuntime extends EventEmitter { public step(callback, callbackArgs, event = 'stopOnStep') { DebugLogger.AdapterInfo("step:" + event); let arrSend = new Object(); - dataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); + DataProcesser.commandToDebugger(event, arrSend, callback, callbackArgs); } /** @@ -156,7 +156,7 @@ export class luaDebugRuntime extends EventEmitter { */ public luaGarbageCollect(event = "LuaGarbageCollect") { let arrSend = new Object(); - dataProcesser.commandToDebugger(event, arrSend); + DataProcesser.commandToDebugger(event, arrSend); } /** @@ -171,7 +171,7 @@ export class luaDebugRuntime extends EventEmitter { let arrSend = new Object(); arrSend["path"] = path; arrSend["bks"] = bks; - dataProcesser.commandToDebugger("setBreakPoint", arrSend, callback, callbackArgs); + DataProcesser.commandToDebugger("setBreakPoint", arrSend, callback, callbackArgs); } /** From 3cc517d49d8e13fd8854edf94871ea4ee8dd99c5 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Fri, 30 Aug 2019 18:59:16 +0800 Subject: [PATCH 068/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E6=A8=A1?= =?UTF-8?q?=E7=B3=8A=E8=B7=AF=E5=BE=84=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 33 +++++++++++------ package-lock.json | 18 ++++++---- package.json | 15 +++++--- src/Tools.ts | 81 ++++++++++++++++++++++++++++++++++++++++++ src/extension.ts | 4 +++ src/luaDebug.ts | 6 ++++ src/luaDebugRuntime.ts | 4 +++ 7 files changed, 139 insertions(+), 22 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index b04d255..00867c7 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -1387,13 +1387,13 @@ function this.getPath( info ) isAbsolutePath = true; else isAbsolutePath = false; - if cwd ~= "" then - --查看filePath中是否包含cwd - local matchRes = string.find(filePath, cwd, 1, true); - if matchRes == nil then - retPath = cwd.."/"..filePath; - end - end + -- if cwd ~= "" then + -- --查看filePath中是否包含cwd + -- local matchRes = string.find(filePath, cwd, 1, true); + -- if matchRes == nil then + -- retPath = cwd.."/"..filePath; + -- end + -- end end retPath = this.genUnifiedPath(retPath); --放入Cache中缓存 @@ -1458,14 +1458,27 @@ function this.checkCurrentLayerisLua( checkLayer ) return nil; end + ------------------------断点处理------------------------- +-- 断点路径处理 +-- @currentPath getinfo路径 +function this.compareBreakPath(currentPath) + for k,v in ipairs(breaks) do + if k:find(currentPath, 1, true) then + -- 如果是子串 + return true, k; + end + end + return false, ''; +end + -- 参数info是当前堆栈信息 -- @info getInfo获取的当前调用信息 function this.isHitBreakpoint( info ) - local curPath = info.source; local curLine = tostring(info.currentline); - if breaks[curPath] ~= nil then - for k,v in ipairs(breaks[curPath]) do + local isPathHit, breakCompletePath = this.compareBreakPath(info.source); + if isPathHit then + for k,v in ipairs(breaks[completePath]) do if tostring(v["line"]) == tostring(curLine) then -- type是TS中的枚举类型,其定义在BreakPoint.tx文件中 --[[ diff --git a/package-lock.json b/package-lock.json index e9ccbab..80ea915 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "luapanda", - "version": "2.2.1", + "version": "2.2.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -225,8 +225,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -262,7 +261,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -466,8 +464,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "convert-source-map": { "version": "1.6.0", @@ -2225,7 +2222,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2517,6 +2513,14 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-reader": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-reader/-/path-reader-1.1.0.tgz", + "integrity": "sha512-RT7wPCyH2AqncAMi4L1h+LQAvMBrZU8cnypGqgLzuIfIINT7w6OWm7KLH1tT8AQ+6p6tuujgSm3K90EMmRDTAA==", + "requires": { + "minimatch": "^3.0.4" + } + }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", diff --git a/package.json b/package.json index bb1d030..c3cce44 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "luapanda", "displayName": "LuaPanda", - "version": "2.2.1", + "version": "2.2.5", "publisher": "stuartwang", "description": "lua debug adapters for VS Code.", "author": { @@ -41,7 +41,8 @@ "dependencies": { "await-notify": "1.0.1", "vscode-debugadapter": "1.27.0", - "vscode-debugprotocol": "1.27.0" + "vscode-debugprotocol": "1.27.0", + "path-reader": "^1.1.0" }, "devDependencies": { "@types/node": "7.0.55", @@ -91,7 +92,7 @@ "type": "array", "description": "program 执行时需要的参数, 结构是一个字符串数组", "default": [] - }, + }, "trace": { "type": "boolean", "description": "Enable logging of the Debug Adapter Protocol.", @@ -161,6 +162,11 @@ "type": "array", "description": "被调试文件和VSCode中加载文件路径不一致时,通过此项设置,完成路径替换。输入格式[\"被替换掉的路径\", \"新路径\"]", "default": [] + }, + "currentWorkspacePath": { + "type": "string", + "description": "workspace路径", + "default": "${workspaceFolder}" } } } @@ -172,7 +178,7 @@ "internalConsoleOptions": "openOnFirstSessionStart", "name": "LuaPanda", "program": "${workspaceFolder}", - "args":[], + "args": [], "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, "docPathReplace": [], @@ -187,7 +193,6 @@ "request": "launch", "internalConsoleOptions": "neverOpen", "name": "LuaPanda-DebugFile", - "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, "luaPath": "", "packagePath": [], diff --git a/src/Tools.ts b/src/Tools.ts index bf2a77d..2670cc8 100644 --- a/src/Tools.ts +++ b/src/Tools.ts @@ -1,7 +1,14 @@ import * as vscode from 'vscode'; +import { isArray } from 'util'; let path = require("path"); +let pathReader = require('path-reader'); +import { DebugLogger } from './LogManager'; + export class Tools { + public static extMap = new Object(); // 可处理的文件后缀列表 + public static fileNameToPathMap; // 文件名-路径Map + // 把传入的路径标准路径 public static genUnifiedPath(beProcessPath) : string{ //全部使用 / @@ -57,4 +64,78 @@ export class Tools { return retObject; } } + + // 构建可接受的后缀列表 + public static rebuildAcceptExtMap(userSetExt? : string){ + this.extMap = new Object(); + this.extMap['lua'] = true; + this.extMap['lua.txt'] = true; + if(typeof userSetExt == 'string' && userSetExt != ''){ + this.extMap[userSetExt] = true; + } + } + + //建立/刷新 工程下 文件名-路径Map + // 评估执行效率,这个函数可以考虑应该区分同步,以优化体验 + public static rebuildWorkspaceNamePathMap(rootPath : string){ + let _fileNameToPathMap = new Array(); // 文件名-路径 cache + let workspaceFiles = pathReader.files(rootPath, {sync:true}); //同步读取工程中所有文件名 + let workspaceFileCount = workspaceFiles.length; + let processFilNum = 0; //记录最终处理了多少个文件 + for(let processingFileIdx = 0; processingFileIdx < workspaceFileCount ; processingFileIdx++){ + let nameExtObject = this.getPathNameAndExt(workspaceFiles[processingFileIdx]); + if( !this.extMap[nameExtObject['ext']] ){ + // 文件类型不在可处理列表中 + continue; + } + processFilNum = processFilNum + 1; + let fileNameKey = nameExtObject['name']; // key是文件名,不包含路径和文件后缀 + if(_fileNameToPathMap[fileNameKey]){ + //冲突, 对应的key已有值(存在同名文件), 使用数组保存数据 + let tempSaveValue = _fileNameToPathMap[fileNameKey]; + let tempArray = new Array(); + tempArray.push(tempSaveValue); + tempArray.push(workspaceFiles[processingFileIdx]); + _fileNameToPathMap[fileNameKey] = tempArray; + }else{ + _fileNameToPathMap[fileNameKey] = workspaceFiles[processingFileIdx]; + } + // 显示进度 + let processingRate = Math.floor( processingFileIdx / workspaceFileCount * 100 ); + DebugLogger.AdapterInfo(processingRate + "% | " + fileNameKey + " " + _fileNameToPathMap[fileNameKey] ) + } + DebugLogger.AdapterInfo("文件Map刷新完毕,共计"+ workspaceFileCount +"个文件, 其中" + processFilNum + "个lua类型文件"); + this.fileNameToPathMap = _fileNameToPathMap; + } + + // 从URI分析出文件名和后缀 + public static getPathNameAndExt(UriOrPath): Object{ + let name_and_ext = path.basename(UriOrPath).split('.'); + let name = name_and_ext[0]; //文件名 + let ext = name_and_ext[1] || ''; //文件后缀 + for (let index = 2; index < name_and_ext.length; index++) { + ext = ext + '.' + name_and_ext[index]; + } + return { name, ext }; + } + + // 传入局部路径,返回完整路径 + public static checkFullPath( shortPath: string ): string{ + let nameExtObject = this.getPathNameAndExt(shortPath); + let fileName = nameExtObject['name']; + let fullPath = this.fileNameToPathMap[fileName]; + if(fullPath){ + if(isArray(fullPath)){ + for (const key in fullPath) { + const element = fullPath[key]; + if(element.indexOf(shortPath)){ + return element; + } + } + }else if(typeof fullPath == "string"){ + return fullPath; + } + } + return ''; + } } diff --git a/src/extension.ts b/src/extension.ts index 22a3268..4daf8d1 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -102,6 +102,10 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { vscode.window.showInformationMessage("请在launch中配置cwd工作路径!"); config.cwd = '${workspaceFolder}'; } + + if(!config.currentWorkspacePath){ + config.currentWorkspacePath = '${workspaceFolder}'; + } if (!config.TempFilePath) { // vscode.window.showInformationMessage("请在launch中配置TempFilePath路径!"); diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 44943af..aa18592 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -134,6 +134,12 @@ export class LuaDebugSession extends LoggingDebugSession { //1. 配置初始化信息 let os = require("os"); let path = require("path"); + + //1.1.生成文件map + Tools.rebuildAcceptExtMap(args.luaFileExtension); + Tools.rebuildWorkspaceNamePathMap(args.currentWorkspacePath); + //------ + //去除out, Debugger/debugger_lib/plugins/Darwin/ libpdebug_版本号.so let clibPath = path.dirname(__dirname) + '/Debugger/debugger_lib/plugins/' let sendArgs = new Array(); diff --git a/src/luaDebugRuntime.ts b/src/luaDebugRuntime.ts index 0ef4177..00bd7ae 100755 --- a/src/luaDebugRuntime.ts +++ b/src/luaDebugRuntime.ts @@ -4,6 +4,8 @@ import { DataProcesser } from './dataProcesser'; import { DebugProtocol } from 'vscode-debugprotocol'; import { DebugLogger } from './LogManager'; import { StatusBarManager } from './StatusBarManager'; +import { Tools } from './Tools'; + export interface LuaBreakpoint { id: number; @@ -219,6 +221,8 @@ export class LuaDebugRuntime extends EventEmitter { stack.forEach(element => { let linenum: string = element.line; element.line = parseInt(linenum); //转为VSCode行号(int) + let getinfoPath : string = element.file; + element.file = Tools.checkFullPath(getinfoPath); }); //先保存堆栈信息,再发暂停请求 this.breakStack = stack; From aecdca3e079a4c2d00f8888b7ff40270bbc167d1 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Thu, 5 Sep 2019 16:49:19 +0800 Subject: [PATCH 069/431] =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E6=A8=A1=E5=BC=8F=EF=BC=8C=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E7=B2=BE=E7=A1=AE=E8=B7=AF=E5=BE=84=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E5=8F=AF=E4=BB=A5=E9=80=9A=E8=BF=87=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 52 +++++++++++++++++++++++++++++++------------ package.json | 17 +++++++------- src/LogManager.ts | 12 ++++++++++ src/Tools.ts | 10 +++++++-- src/extension.ts | 8 +++---- src/luaDebug.ts | 8 +++++-- 6 files changed, 77 insertions(+), 30 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 00867c7..e32d6ca 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -119,6 +119,7 @@ local winDiskSymbolTip = ""; local isAbsolutePath = false; local stopOnEntry; --用户在VSCode端设置的是否打开stopOnEntry local userSetUseClib; --用户在VSCode端设置的是否是用clib库 +local autoPathMode = false; --Step控制标记位 local stepOverCounter = 0; --STEPOVER over计数器 local stepOutCounter = 0; --STEPOVER out计数器 @@ -381,7 +382,9 @@ function this.doctor() if hookLib ~= nil then runSource = this.getPath(tostring(hookLib.get_last_source())); end - if runSource and runSource ~= "" then + + -- 在精确路径模式下的路径错误检测 + if not autoPathMode and runSource and runSource ~= "" then -- 读文件 local isFileExist = this.fileExists(runSource); if not isFileExist then @@ -449,6 +452,7 @@ function this.getInfo() strTable[#strTable + 1] = "consoleLogLevel:" .. consoleLogLevel .. ' | '; strTable[#strTable + 1] = "pathCaseSensitivity:" .. pathCaseSensitivity .. ' | '; strTable[#strTable + 1] = "attachMode:".. tostring(openAttachMode).. ' | '; + strTable[#strTable + 1] = "autoPathMode:".. tostring(autoPathMode).. ' | '; if userSetUseClib then strTable[#strTable + 1] = "useCHook:true"; @@ -464,10 +468,13 @@ function this.getInfo() strTable[#strTable + 1] = "clibPath: " .. tostring(clibPath) .. '\n'; strTable[#strTable + 1] = "debugger: " .. this.getPath(DebuggerFileName) .. '\n'; strTable[#strTable + 1] = this.getCWD(); - if isAbsolutePath then - strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。" .. winDiskSymbolTip; - else - strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。如format文件路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。也可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。" .. winDiskSymbolTip; + + if not autoPathMode then + if isAbsolutePath then + strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。" .. winDiskSymbolTip; + else + strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。如format文件路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。也可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。" .. winDiskSymbolTip; + end end if pathErrTip ~= nil and pathErrTip ~= '' then @@ -986,6 +993,13 @@ function this.dataProcess( dataStr ) cwd = this.genUnifiedPath(dataTable.info.cwd); --logLevel logLevel = tonumber(dataTable.info.logLevel) or 1; + --autoPathMode + if dataTable.info.autoPathMode == "true" then + autoPathMode = true; + else + autoPathMode = false; + end + --OS type if nil == OSType then --用户未主动设置OSType, 接收VSCode传来的数据 @@ -1051,7 +1065,7 @@ function this.dataProcess( dataStr ) hookLib = luapanda_chook; else if not(this.tryRequireClib("libpdebug", x64Path) or this.tryRequireClib("libpdebug", x86Path)) then - this.printToVSCode("Require clib failed, use Lua to continue debug, use LuaPanda.getInfo() for more information.", 1); + this.printToVSCode("Require clib failed, use Lua to continue debug, use LuaPanda.doctor() for more information.", 1); end end end @@ -1387,13 +1401,13 @@ function this.getPath( info ) isAbsolutePath = true; else isAbsolutePath = false; - -- if cwd ~= "" then - -- --查看filePath中是否包含cwd - -- local matchRes = string.find(filePath, cwd, 1, true); - -- if matchRes == nil then - -- retPath = cwd.."/"..filePath; - -- end - -- end + if autoPathMode == false and cwd ~= "" then + --查看filePath中是否包含cwd + local matchRes = string.find(filePath, cwd, 1, true); + if matchRes == nil then + retPath = cwd.."/"..filePath; + end + end end retPath = this.genUnifiedPath(retPath); --放入Cache中缓存 @@ -1476,7 +1490,17 @@ end -- @info getInfo获取的当前调用信息 function this.isHitBreakpoint( info ) local curLine = tostring(info.currentline); - local isPathHit, breakCompletePath = this.compareBreakPath(info.source); + local isPathHit = false, completePath; + + if autoPathMode then + isPathHit, completePath = this.compareBreakPath(info.source); + else + completePath = info.source; + if breaks[completePath] then + isPathHit = true; + end + end + if isPathHit then for k,v in ipairs(breaks[completePath]) do if tostring(v["line"]) == tostring(curLine) then diff --git a/package.json b/package.json index c3cce44..6e1eef8 100755 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "program": { "type": "string", "description": "随调试器启动的可执行文件路径", - "default": "${workspaceFolder}" + "default": "" }, "args": { "type": "array", @@ -105,7 +105,7 @@ }, "cwd": { "type": "string", - "description": "设置运行时的工程路径", + "description": "exactltPathMode : 拼接路径 | autoPathMode : workspace 路径", "default": "${workspaceFolder}" }, "isNeedB64EncodeStr": { @@ -163,10 +163,10 @@ "description": "被调试文件和VSCode中加载文件路径不一致时,通过此项设置,完成路径替换。输入格式[\"被替换掉的路径\", \"新路径\"]", "default": [] }, - "currentWorkspacePath": { - "type": "string", - "description": "workspace路径", - "default": "${workspaceFolder}" + "autoPathMode": { + "type": "boolean", + "description": "是否使用自动路径模式", + "default": true } } } @@ -177,7 +177,7 @@ "request": "launch", "internalConsoleOptions": "openOnFirstSessionStart", "name": "LuaPanda", - "program": "${workspaceFolder}", + "program": "", "args": [], "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, @@ -186,7 +186,8 @@ "connectionPort": 8818, "stopOnEntry": true, "useCHook": true, - "logLevel": 1 + "logLevel": 1, + "autoPathMode": true }, { "type": "lua", diff --git a/src/LogManager.ts b/src/LogManager.ts index 3357a06..5469f68 100644 --- a/src/LogManager.ts +++ b/src/LogManager.ts @@ -24,4 +24,16 @@ export class DebugLogger { DebugLogger.Ainfo.appendLine(str); } } + + public static showTips(str:string , level?:number){ + if(level === 2 ){ + vscode.window.showErrorMessage(str); + } + if(level === 1 ){ + vscode.window.showWarningMessage(str); + }else{ + vscode.window.showInformationMessage(str); + } + + } } diff --git a/src/Tools.ts b/src/Tools.ts index 2670cc8..1c97d38 100644 --- a/src/Tools.ts +++ b/src/Tools.ts @@ -4,10 +4,10 @@ let path = require("path"); let pathReader = require('path-reader'); import { DebugLogger } from './LogManager'; - export class Tools { public static extMap = new Object(); // 可处理的文件后缀列表 public static fileNameToPathMap; // 文件名-路径Map + public static useAutoPathMode = false; // 把传入的路径标准路径 public static genUnifiedPath(beProcessPath) : string{ @@ -121,6 +121,10 @@ export class Tools { // 传入局部路径,返回完整路径 public static checkFullPath( shortPath: string ): string{ + if(this.useAutoPathMode === false){ + return shortPath; + } + let nameExtObject = this.getPathNameAndExt(shortPath); let fileName = nameExtObject['name']; let fullPath = this.fileNameToPathMap[fileName]; @@ -136,6 +140,8 @@ export class Tools { return fullPath; } } - return ''; + //最终没有找到,返回输入的地址 + DebugLogger.showTips("调试器没有找到文件 " + shortPath + " , 请检查 launch.json 中后缀是否配置正确", 2); + return shortPath; } } diff --git a/src/extension.ts b/src/extension.ts index 4daf8d1..d5d4a84 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -89,6 +89,10 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { config.program = ''; } + if(!config.autoPathMode){ + config.autoPathMode = false; + } + if(!config.args){ config.args = new Array(); } @@ -102,10 +106,6 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { vscode.window.showInformationMessage("请在launch中配置cwd工作路径!"); config.cwd = '${workspaceFolder}'; } - - if(!config.currentWorkspacePath){ - config.currentWorkspacePath = '${workspaceFolder}'; - } if (!config.TempFilePath) { // vscode.window.showInformationMessage("请在launch中配置TempFilePath路径!"); diff --git a/src/luaDebug.ts b/src/luaDebug.ts index aa18592..b1c7deb 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -135,9 +135,12 @@ export class LuaDebugSession extends LoggingDebugSession { let os = require("os"); let path = require("path"); + Tools.useAutoPathMode = !!args.autoPathMode; //1.1.生成文件map - Tools.rebuildAcceptExtMap(args.luaFileExtension); - Tools.rebuildWorkspaceNamePathMap(args.currentWorkspacePath); + if(Tools.useAutoPathMode === true){ + Tools.rebuildAcceptExtMap(args.luaFileExtension); + Tools.rebuildWorkspaceNamePathMap(args.cwd); + } //------ //去除out, Debugger/debugger_lib/plugins/Darwin/ libpdebug_版本号.so @@ -157,6 +160,7 @@ export class LuaDebugSession extends LoggingDebugSession { let pkg = require("../package.json"); let adapterVersion = pkg.version; sendArgs["adapterVersion"] = String(adapterVersion); + sendArgs["autoPathMode"] = Tools.useAutoPathMode; if(args.docPathReplace instanceof Array && args.docPathReplace.length === 2 ){ LuaDebugSession.replacePath = new Array( Tools.genUnifiedPath(String(args.docPathReplace[0])), Tools.genUnifiedPath(String(args.docPathReplace[1]))); From cce3fc236493716caacee019db1e4059f09d0ee6 Mon Sep 17 00:00:00 2001 From: wzhengsen Date: Tue, 10 Sep 2019 10:14:09 +0800 Subject: [PATCH 070/431] =?UTF-8?q?=E4=B8=80=E5=A4=84=E5=BA=94=E5=BD=93?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=B1=80=E9=83=A8=E5=8F=98=E9=87=8F=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E6=96=B9=E4=BD=BF=E7=94=A8=E4=BA=86=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=8F=98=E9=87=8F=EF=BC=8C=E5=8F=AF=E8=83=BD=E5=AF=B9=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E7=8E=AF=E5=A2=83=E4=BA=A7=E7=94=9F=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E5=BD=B1=E5=93=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/DebugTools.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/Debugger/DebugTools.lua b/Debugger/DebugTools.lua index 0bee0a3..bf3143f 100644 --- a/Debugger/DebugTools.lua +++ b/Debugger/DebugTools.lua @@ -298,6 +298,7 @@ function this.createJson() startPos = decode_scanWhitespace(s,startPos+1) end assert(startPos<=stringLen, 'JSON String ended unexpectedly scanning array.') + local object object, startPos = json.decode(s,startPos) array[index] = object index = index + 1 From 51ed22923d20fd7f578c003dfcfdf67b93713074 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Wed, 11 Sep 2019 16:03:19 +0800 Subject: [PATCH 071/431] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86lua=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E8=87=AA=E5=8A=A8=E8=B7=AF=E5=BE=84=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E4=BF=AE=E5=A4=8D=E8=B7=AF=E5=BE=84=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=9A=84hookstate=E5=88=A4=E6=96=AD=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 48 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index e32d6ca..8bf43f7 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -131,7 +131,7 @@ local coroutineCreate; --用来记录lua原始的coroutine.create函数 local stopConnectTime = 0; --用来临时记录stop断开连接的时间 local isInMainThread; local receiveMsgTimer = 0; -local pathFormatCache = {}; +local pathFormatCache = {}; --getinfo -> format local isUserSetClibPath = false; --用户是否在本文件中自设了clib路径 --5.1/5.3兼容 if _VERSION == "Lua 5.1" then @@ -686,6 +686,11 @@ function this.genUnifiedPath(path) return newpath; end +-- 打印路径缓存 +function this.printPathCache() + return pathFormatCache; +end + function this.getPathFromCache(source) return pathFormatCache[source]; end @@ -835,6 +840,11 @@ function this.dataProcess( dataStr ) this.printToVSCode("setBreakPoint path:"..tostring(bkPath)); breaks[bkPath] = dataTable.info.bks; + if autoPathMode then + -- 自动路径模式下,要清除路径缓存中保存失败路径 + pathFormatCache = {}; + end + --save for k, v in pairs(breaks) do if next(v) == nil then @@ -1081,7 +1091,7 @@ function this.dataProcess( dataStr ) if hookLib ~= nil then isUseHookLib = 1; --同步数据给c hook - hookLib.sync_config(logLevel, pathCaseSensitivity); + hookLib.sync_config(logLevel, pathCaseSensitivity, autoPathMode); hookLib.sync_tempfile_path(TempFilePath_luaString) hookLib.sync_cwd(cwd); hookLib.sync_file_ext(luaFileExtension); @@ -1477,12 +1487,28 @@ end -- 断点路径处理 -- @currentPath getinfo路径 function this.compareBreakPath(currentPath) - for k,v in ipairs(breaks) do + if type(currentPath) ~= "string" then + return false, ''; + end + + local pathFromCache = this.getPathFromCache(currentPath); + if pathFromCache ~= nil then + if pathFromCache == '' then + return false, ''; + else + return true, pathFromCache; + end + end + + for k,v in pairs(breaks) do if k:find(currentPath, 1, true) then -- 如果是子串 + this.setPathToCache(currentPath, k); return true, k; end end + --查不到也保存下来,避免反复查询 + this.setPathToCache(currentPath, ''); return false, ''; end @@ -1613,7 +1639,12 @@ function this.checkHasBreakpoint(fileName) end --当前文件中是否有断点 if fileName ~= nil then - return breaks[fileName] ~= nil, hasBk; + if autoPathMode then + local isPathHit, breakCompletePath = this.compareBreakPath(fileName); + return isPathHit, hasBk; + else + return breaks[fileName] ~= nil, hasBk; + end else return hasBk; end @@ -1836,7 +1867,7 @@ function this.real_hook_process(info) --在RUN时检查并改变状态 if hookLib == nil then if currentRunState == runState.RUN and jumpFlag == false and currentHookState ~= hookState.DISCONNECT_HOOK then - local fileBP, G_BP =this.checkHasBreakpoint(lastRunFilePath); + local fileBP, G_BP = this.checkHasBreakpoint(lastRunFilePath); if fileBP == false then --文件无断点 if G_BP == true then @@ -1847,7 +1878,12 @@ function this.real_hook_process(info) else --文件有断点 --判断函数内是否有断点 - local funHasBP = this.checkfuncHasBreakpoint(lastRunFunction.linedefined, lastRunFunction.lastlinedefined, lastRunFilePath); + local completePath = lastRunFilePath; + if autoPathMode then + local _, tempPath = this.compareBreakPath(lastRunFilePath); + if tempPath ~= '' then completePath = tempPath end; + end + local funHasBP = this.checkfuncHasBreakpoint(lastRunFunction.linedefined, lastRunFunction.lastlinedefined, completePath); if funHasBP then --函数定义范围内 this.changeHookState(hookState.ALL_HOOK); From 97dcb34ea0125d55f4e39f96c60071eecf6ddc7e Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Wed, 11 Sep 2019 16:07:34 +0800 Subject: [PATCH 072/431] =?UTF-8?q?=E4=BF=AE=E6=94=B9pathCaseSensitivity?= =?UTF-8?q?=E7=9A=84=E5=80=BC=20int=20->=20bool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 8bf43f7..5081d5c 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -107,7 +107,7 @@ local logLevel = 1; --日志等级all/info/error. 此设置对应的 local variableRefIdx = 1; --变量索引 local variableRefTab = {}; --变量记录table local lastRunFilePath = ""; --最后执行的文件路径 -local pathCaseSensitivity = 1; --路径是否发大小写敏感,这个选项接收VScode设置,请勿在此处更改 +local pathCaseSensitivity = true; --路径是否发大小写敏感,这个选项接收VScode设置,请勿在此处更改 local recvMsgQueue = {}; --接收的消息队列 local coroutinePool = {}; --保存用户协程的队列 local winDiskSymbolUpper = false;--设置win下盘符的大小写。以此确保从VSCode中传入的断点路径,cwd和从lua虚拟机获得的文件路径盘符大小写一致 @@ -450,7 +450,7 @@ function this.getInfo() -- strTable[#strTable + 1] = "luaFileExtension:" .. luaFileExtension .. ' | '; strTable[#strTable + 1] = "logLevel:" .. logLevel .. ' | ' ; strTable[#strTable + 1] = "consoleLogLevel:" .. consoleLogLevel .. ' | '; - strTable[#strTable + 1] = "pathCaseSensitivity:" .. pathCaseSensitivity .. ' | '; + strTable[#strTable + 1] = "pathCaseSensitivity:" .. tostring(pathCaseSensitivity) .. ' | '; strTable[#strTable + 1] = "attachMode:".. tostring(openAttachMode).. ' | '; strTable[#strTable + 1] = "autoPathMode:".. tostring(autoPathMode).. ' | '; @@ -648,7 +648,7 @@ function this.genUnifiedPath(path) return nil; end --大小写不敏感时,路径全部转为小写 - if pathCaseSensitivity == 0 then + if pathCaseSensitivity == false then path = string.lower(path); end --统一路径全部替换成/ @@ -1038,12 +1038,6 @@ function this.dataProcess( dataStr ) isUserSetClibPath = true; end - if tostring(dataTable.info.pathCaseSensitivity) == "false" then - pathCaseSensitivity = 0; - else - pathCaseSensitivity = 1; - end - --查找c++的hook库是否存在 if tostring(dataTable.info.useCHook) == "true" then userSetUseClib = true; --用户确定使用clib From e48ea11c68d8384c6dd4b736a99c9fc80236f7d6 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Thu, 12 Sep 2019 16:51:22 +0800 Subject: [PATCH 073/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86c=E5=B1=82?= =?UTF-8?q?=E7=9A=84=E8=87=AA=E5=8A=A8=E8=B7=AF=E5=BE=84=E6=94=AF=E6=8C=81?= =?UTF-8?q?=EF=BC=8C=E9=9C=80=E8=A6=81=E6=B5=8B=E8=AF=95=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E3=80=82=E5=9B=A0=E4=B8=BAstrcmp=E5=AF=B9=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E5=BD=B1=E5=93=8D=E5=BE=88=E5=A4=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 34 ++++---- Debugger/debugger_lib/libpdebug.cpp | 126 +++++++++++++++++++--------- 2 files changed, 106 insertions(+), 54 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 5081d5c..669b429 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -131,7 +131,8 @@ local coroutineCreate; --用来记录lua原始的coroutine.create函数 local stopConnectTime = 0; --用来临时记录stop断开连接的时间 local isInMainThread; local receiveMsgTimer = 0; -local pathFormatCache = {}; --getinfo -> format +local formatPathCache = {}; -- getinfo -> format +local completePathCache = {}; --format -> complete local isUserSetClibPath = false; --用户是否在本文件中自设了clib路径 --5.1/5.3兼容 if _VERSION == "Lua 5.1" then @@ -247,7 +248,7 @@ function this.clearData() clibPath = nil; -- reset breaks breaks = {}; - pathFormatCache = {}; + formatPathCache = {}; this.breaks = breaks; if hookLib ~= nil then hookLib.sync_breakpoints(); --清空断点信息 @@ -686,17 +687,20 @@ function this.genUnifiedPath(path) return newpath; end --- 打印路径缓存 -function this.printPathCache() - return pathFormatCache; +function this.getCacheCompletePath(source) + return completePathCache[source]; end -function this.getPathFromCache(source) - return pathFormatCache[source]; +function this.setCacheCompletePath(source, dest) + completePathCache[source] = dest; end -function this.setPathToCache(source, dest) - pathFormatCache[source] = dest; +function this.getCacheFormatPath(source) + return formatPathCache[source]; +end + +function this.setCacheFormatPath(source, dest) + formatPathCache[source] = dest; end ----------------------------------------------------------------------------- -- 内存相关 @@ -842,7 +846,7 @@ function this.dataProcess( dataStr ) breaks[bkPath] = dataTable.info.bks; if autoPathMode then -- 自动路径模式下,要清除路径缓存中保存失败路径 - pathFormatCache = {}; + completePathCache = {}; end --save @@ -1376,7 +1380,7 @@ function this.getPath( info ) filePath = info.source; end --尝试从Cache中获取路径 - local cachePath = this.getPathFromCache(filePath); + local cachePath = this.getCacheFormatPath(filePath); if cachePath~= nil and type(cachePath) == "string" then return cachePath; end @@ -1415,7 +1419,7 @@ function this.getPath( info ) end retPath = this.genUnifiedPath(retPath); --放入Cache中缓存 - this.setPathToCache(originalPath, retPath); + this.setCacheFormatPath(originalPath, retPath); return retPath; end @@ -1485,7 +1489,7 @@ function this.compareBreakPath(currentPath) return false, ''; end - local pathFromCache = this.getPathFromCache(currentPath); + local pathFromCache = this.getCacheCompletePath(currentPath); if pathFromCache ~= nil then if pathFromCache == '' then return false, ''; @@ -1497,12 +1501,12 @@ function this.compareBreakPath(currentPath) for k,v in pairs(breaks) do if k:find(currentPath, 1, true) then -- 如果是子串 - this.setPathToCache(currentPath, k); + this.setCacheCompletePath(currentPath, k); return true, k; end end --查不到也保存下来,避免反复查询 - this.setPathToCache(currentPath, ''); + this.setCacheCompletePath(currentPath, ''); return false, ''; end diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index f6f7527..9085cac 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -5,19 +5,20 @@ // Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. #include "libpdebug.h" - #include #include #include #include +#include //using namespace std; static int cur_run_state = 0; //当前运行状态, c 和 lua 都可能改变这个状态,要保持同步 static int cur_hook_state = 0; //当前hook状态, c 和 lua 都可能改变这个状态 -static lua_Number logLevel = 1; //日志等级(从lua同步) -static lua_Number pathCaseSensitivity = 1; //大小写敏感标志位(从lua同步) +static int logLevel = 1; //日志等级(从lua同步) +static int pathCaseSensitivity = 1; //大小写敏感标志位(从lua同步) +static int autoPathMode = 0; //自动路径标是否开启志位 +static int BPhit = 0; //BP命中标志位 static int stackdeep_counter = 0; //step用的栈深度计数器 -static lua_Number BPhit = 0; //BP命中标志位 static char hookLog[1024] = { 0 }; const char* debug_file_path; //debugger的文件路径 int debug_file_path_len; @@ -33,8 +34,10 @@ int ar_def_line = 0; int ar_lastdef_line = 0; struct path_transfer_node; struct breakpoint; -//路径缓存队列 -std::list path_cache_list; +// 路径缓存队列 getinfo -> format +std::list getinfo_to_format_cache; +// 路径缓存队列 format -> complete +std::list format_to_complete_cache; // 存放断点map,key为source std::map> all_breakpoint_map; @@ -222,7 +225,7 @@ int call_lua_function(lua_State *L, const char * lua_function_name, int retCount //lua层主动清除路径缓存 extern "C" int clear_pathcache(lua_State *L) { - path_cache_list.clear(); + getinfo_to_format_cache.clear(); return 0; } @@ -247,14 +250,15 @@ extern "C" int sync_bp_hit(lua_State *L) { return 0; } - BPhit = static_cast(luaL_checknumber(L, 1)); + BPhit = static_cast(luaL_checkinteger(L, 1)); return 0; } //同步设置 -- 日志等级, 是否debug代码段, 是否使用忽略大小写 extern "C" int sync_config(lua_State *L) { - logLevel = static_cast(luaL_checknumber(L, 1)); - pathCaseSensitivity = static_cast(luaL_checknumber(L, 2)); + logLevel = static_cast(luaL_checkinteger(L, 1)); + pathCaseSensitivity = static_cast(luaL_checkinteger(L, 2)); + autoPathMode = static_cast(luaL_checkinteger(L, 3)); return 0; } @@ -308,7 +312,7 @@ void sync_runstate_toLua(lua_State *L, int state) { //这个接口给lua调用,用来同步状态 lua->C extern "C" int lua_set_runstate(lua_State *L) { - cur_run_state = static_cast(luaL_checknumber(L, 1)); + cur_run_state = static_cast(luaL_checkinteger(L, 1)); return 0; } @@ -333,7 +337,7 @@ void sethookstate(lua_State *L, int state){ //这个接口给lua调用,用来同步hook状态 lua->C extern "C" int lua_set_hookstate(lua_State *L) { - cur_hook_state = static_cast(luaL_checknumber(L, 1)); + cur_hook_state = static_cast(luaL_checkinteger(L, 1)); sethookstate(L, cur_hook_state); return 0; } @@ -355,7 +359,7 @@ const char* getPath(lua_State *L,const char* source){ } //检查缓存 - for(auto iter = path_cache_list.begin();iter != path_cache_list.end();iter++) + for(auto iter = getinfo_to_format_cache.begin();iter != getinfo_to_format_cache.end();iter++) { if(!strcmp((*iter)->src.c_str(), source)){ return (*iter)->dst.c_str(); @@ -370,7 +374,7 @@ const char* getPath(lua_State *L,const char* source){ const char* retSource = lua_tostring(L, -1); //加入缓存,返回 path_transfer_node *nd = new path_transfer_node(source, retSource ); - path_cache_list.push_back(nd); + getinfo_to_format_cache.push_back(nd); return retSource; } @@ -390,6 +394,9 @@ extern "C" int sync_breakpoints(lua_State *L) { print_to_vscode(L, "[Debug Lib Error] debug_ishit_bk get breaks error", 2); return -1; } + if(autoPathMode){ + format_to_complete_cache.clear(); + } //遍历breaks all_breakpoint_map.clear(); @@ -460,16 +467,64 @@ extern "C" int sync_breakpoints(lua_State *L) { return 0; } +// 根据文件名,从断点列表中获得完整路径,如无法获得完整路径,则返回当前路径 +// 为了提升效率,此处应有一个命中表cache,表中找不到默认为不命中。 当有新bk的时候需刷新命中表 +int compareBreakPath(const char **getInfoPath){ + //遍历断点列表,做路径匹配 + //检查缓存 + for(auto iter = format_to_complete_cache.begin();iter != format_to_complete_cache.end();iter++) + { + if(!strcmp((*iter)->src.c_str(), *getInfoPath)){ + //从cache中找到了 + const char *completePath = (*iter)->dst.c_str(); + if(!strcmp(completePath, "")){ + return 0; + } + + getInfoPath = &(completePath); + return 1; + } + } + + std::map>::iterator iter = all_breakpoint_map.begin(); + while(iter != all_breakpoint_map.end()){ + //curPath如果是断点路径的一部分,返回completePath + const char *s = (iter->first).c_str(); + std::regex reg(*getInfoPath); + if(std::regex_search(s, reg)){ + //命中 + //缓存 + path_transfer_node *nd = new path_transfer_node(*getInfoPath, s ); + format_to_complete_cache.push_back(nd); + + getInfoPath = &(s); + return 1; + } + iter++; + } + + path_transfer_node *nd = new path_transfer_node(*getInfoPath, ""); + format_to_complete_cache.push_back(nd); + return 0; +} + //断点命中判断 int debug_ishit_bk(lua_State *L, const char * curPath, int current_line) { print_to_vscode(L, "debug_ishit_bk\n"); debug_auto_stack _tt(L); - std::map>::const_iterator const_iter1 = all_breakpoint_map.find(std::string(getPath(L, curPath))); + const char *standardPath = getPath(L, curPath); + if(autoPathMode == 1){ + if(compareBreakPath(&standardPath) == 0) return 0; + } + + // 判断是否存在同名文件 + std::map>::const_iterator const_iter1 = all_breakpoint_map.find(std::string(standardPath)); if (const_iter1 == all_breakpoint_map.end()) { return 0; } + // 根据是否存在相同行号 std::map::const_iterator const_iter2 = const_iter1->second.find(current_line); if (const_iter2 == const_iter1->second.end()) { return 0; @@ -639,39 +694,32 @@ int checkHasBreakpoint(lua_State *L, const char * src1, int current_line, int sl //先检查行号,再置换路径 const char *src = getPath(L, src1); if(!strcmp(src,"")){ - return 3; + return ALL_HOOK; } if (all_breakpoint_map.empty() == true) { //没有断点 - return 0; + return LITE_HOOK; } - std::map>::iterator iter1; - std::map::iterator iter2; - for (iter1 = all_breakpoint_map.begin(); iter1 != all_breakpoint_map.end(); ++iter1) { - if (iter1->first == std::string(src)) { - //文件名命中 eline > sline - if(sline >= eline || sline <= 0 || eline <= 0){ - return 3; - } - //current_line不在sline和eline直接拿 - if (current_line > eline || current_line < sline) { - return 3; - } - //breakpoint 行号在sline和eline之间 - for (iter2 = iter1->second.begin(); iter2 != iter1->second.end(); ++iter2) { - int breakline = iter2->first; - if(breakline>sline && breakline>::iterator iter1; + std::map::iterator iter2; + for (iter1 = all_breakpoint_map.begin(); iter1 != all_breakpoint_map.end(); ++iter1) { + if (iter1->first == std::string(src)) { + return ALL_HOOK; } - return 2; } } - - //文件没有断点 - return 1; + + //文件没有断点,MIDHOOK + return MID_HOOK; } void check_hook_state(lua_State *L, const char* source , int current_line, int def_line, int last_line ,int event){ From 3c2a29ce8e2b9f4cfc793eac91ed1b77f7eb5fa9 Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Mon, 16 Sep 2019 14:33:23 +0800 Subject: [PATCH 074/431] bugfix --- Debugger/LuaPanda.lua | 2 +- Debugger/debugger_lib/libpdebug.cpp | 5 +++-- Debugger/debugger_lib/libpdebug.h | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 669b429..9ac3a92 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -1089,7 +1089,7 @@ function this.dataProcess( dataStr ) if hookLib ~= nil then isUseHookLib = 1; --同步数据给c hook - hookLib.sync_config(logLevel, pathCaseSensitivity, autoPathMode); + hookLib.sync_config(logLevel, pathCaseSensitivity and 1 or 0, autoPathMode and 1 or 0); hookLib.sync_tempfile_path(TempFilePath_luaString) hookLib.sync_cwd(cwd); hookLib.sync_file_ext(luaFileExtension); diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index 9085cac..0c8e6c4 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -481,7 +481,7 @@ int compareBreakPath(const char **getInfoPath){ return 0; } - getInfoPath = &(completePath); + *getInfoPath = completePath; return 1; } } @@ -497,7 +497,7 @@ int compareBreakPath(const char **getInfoPath){ path_transfer_node *nd = new path_transfer_node(*getInfoPath, s ); format_to_complete_cache.push_back(nd); - getInfoPath = &(s); + *getInfoPath = s; return 1; } iter++; @@ -980,6 +980,7 @@ void general_find_function() { lua_pcall = (luaDLL_pcall)GetProcAddress(hInstLibrary, "lua_pcall");//501 lua_tointeger = (luaDLL_tointeger)GetProcAddress(hInstLibrary, "lua_tointeger");//501 #endif + luaL_checkinteger = (luaDLL_checkinteger)GetProcAddress(hInstLibrary, "luaL_checkinteger"); lua_version = (luaDLL_version)GetProcAddress(hInstLibrary, "lua_version"); lua_pushstring = (luaDLL_pushstring)GetProcAddress(hInstLibrary, "lua_pushstring"); lua_gettop = (luaDLL_gettop)GetProcAddress(hInstLibrary, "lua_gettop"); diff --git a/Debugger/debugger_lib/libpdebug.h b/Debugger/debugger_lib/libpdebug.h index 0932031..8307856 100644 --- a/Debugger/debugger_lib/libpdebug.h +++ b/Debugger/debugger_lib/libpdebug.h @@ -101,6 +101,7 @@ typedef struct luaL_Reg { typedef LUA_KCONTEXT lua_KContext; //lua function +typedef lua_Integer(*luaDLL_checkinteger) (lua_State *L, int numArg); typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx); typedef const lua_Number *(*luaDLL_version)(lua_State *L); @@ -133,6 +134,7 @@ typedef int (*luaDLL_getglobal)(lua_State *L, const char *name); typedef int (*luaDLL_pcallk)(lua_State *L, int nargs, int nresults, int msgh, lua_KContext ctx, lua_KFunction k); typedef int (*luaDLL_toboolean)(lua_State *L, int index); +luaDLL_checkinteger luaL_checkinteger; luaDLL_version lua_version; luaDLL_gettop lua_gettop; luaDLL_pushstring lua_pushstring; From 876c4eac50d733e079dce9aa298a917df6f93f28 Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Mon, 16 Sep 2019 15:49:26 +0800 Subject: [PATCH 075/431] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86c=E5=BA=93ho?= =?UTF-8?q?ok=E9=A2=91=E7=8E=87=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/debugger_lib/libpdebug.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index 0c8e6c4..0459688 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -691,28 +691,29 @@ int hook_process_code_section(lua_State *L, lua_Debug *ar){ //检查函数中是否有断点。int check_has_breakpoint 0:全局无断点 , 1:全局有断点但本文件中无断点 , 2:本文件中有断点 , 3:函数中有断点 int checkHasBreakpoint(lua_State *L, const char * src1, int current_line, int sline , int eline){ debug_auto_stack tt(L); - //先检查行号,再置换路径 - const char *src = getPath(L, src1); + + const char *src = getPath(L, src1); if(!strcmp(src,"")){ + // 路径完全一致 return ALL_HOOK; } - if (all_breakpoint_map.empty() == true) { - //没有断点 + if(all_breakpoint_map.empty() == true) { + // 全局没有断点 return LITE_HOOK; } if(autoPathMode){ int isFileHasBreakpoint = compareBreakPath(&src); if(isFileHasBreakpoint == 1 ){ - //path中有断点 + // 本文件中有断点 return ALL_HOOK; } }else{ std::map>::iterator iter1; - std::map::iterator iter2; for (iter1 = all_breakpoint_map.begin(); iter1 != all_breakpoint_map.end(); ++iter1) { if (iter1->first == std::string(src)) { + // compare() return ALL_HOOK; } } @@ -728,12 +729,11 @@ void check_hook_state(lua_State *L, const char* source , int current_line, int } if(cur_run_state == RUN && cur_hook_state != DISCONNECT_HOOK){ int stats = checkHasBreakpoint(L, source, current_line, def_line, last_line); - if(stats == 0){ + if(stats == LITE_HOOK){ sethookstate(L, LITE_HOOK); - }else if(stats == 1){ + }else if(stats == MID_HOOK){ sethookstate(L, MID_HOOK); - }else if (stats == 3 || stats == 2){ - //文件中有断点的状态设置为ALL hook + }else if (stats == ALL_HOOK){ sethookstate(L, ALL_HOOK); } From 91c792e0b07862192cb1e0db0ee71ec22417464a Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Mon, 16 Sep 2019 16:01:34 +0800 Subject: [PATCH 076/431] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=E5=86=99=E6=95=8F=E6=84=9F=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 9ac3a92..32203ba 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -1012,8 +1012,14 @@ function this.dataProcess( dataStr ) autoPathMode = true; else autoPathMode = false; - end + end + if dataTable.info.pathCaseSensitivity == "true" then + pathCaseSensitivity = true; + else + pathCaseSensitivity = false; + end + --OS type if nil == OSType then --用户未主动设置OSType, 接收VSCode传来的数据 @@ -1638,7 +1644,7 @@ function this.checkHasBreakpoint(fileName) --当前文件中是否有断点 if fileName ~= nil then if autoPathMode then - local isPathHit, breakCompletePath = this.compareBreakPath(fileName); + local isPathHit, _ = this.compareBreakPath(fileName); return isPathHit, hasBk; else return breaks[fileName] ~= nil, hasBk; From cc16c1cc2c67195cb9d449527d5b306dcdcabf62 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 17 Sep 2019 15:10:12 +0800 Subject: [PATCH 077/431] =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=AD=A7=E4=B9=89?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=BA=86=20LuaPanda.printTable=20?= =?UTF-8?q?=E4=B8=BA=20LuaPanda.serializeTable=E3=80=82=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E5=99=A8=E4=B8=AD=E7=9A=84env=E4=B8=BA?= =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=8F=98=E8=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 32203ba..d9fc0f8 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -17,10 +17,10 @@ API: 如果成功加入断点ret返回true,否则是nil LuaPanda.getInfo() - 返回获取调试器信息。包括版本号,是否使用lib库,系统是否支持loadstring(load方法) + 返回获取调试器信息。包括版本号,是否使用lib库,系统是否支持loadstring(load方法)。返回值类型string, 推荐在调试控制台中使用。 LuaPanda.doctor() - 返回对当前环境的诊断信息,提示可能存在的问题。 + 返回对当前环境的诊断信息,提示可能存在的问题。返回值类型string, 推荐在调试控制台中使用。 LuaPanda.getCWD() 用户可以调用或在调试控制台中输出这个函数,返回帮助设置CWD的路径。比如 @@ -30,12 +30,13 @@ API: cwd是vscode传来的配置路径。getinfo是通过getinfo获取到的正在运行的文件路径。format是经过 cwd + getinfo 整合后的格式化路径。 format是传给VSCode的最终路径。 如果format路径和文件真实路径不符,导致VSCode找不到文件,通过调整工程中launch.json的cwd,使format路径和真实路径一致。 + 返回值类型string, 推荐在调试控制台中使用。 LuaPanda.getBreaks() - 获取断点信息 + 获取断点信息,返回值类型string, 推荐在调试控制台中使用。 - LuaPanda.printTable(table) - 序列化打印table + LuaPanda.serializeTable(table) + 把table序列化为字符串,返回值类型是string。 ]] --用户设置项 @@ -46,7 +47,7 @@ local consoleLogLevel = 2; --打印在控制台(print)的日志等级 local connectTimeoutSec = 0.005; --等待连接超时时间, 单位s. 时间过长等待attach时会造成卡顿,时间过短可能无法连接。建议值0.005 - 0.05 --用户设置项END -local debuggerVer = "2.2.1"; --debugger版本号 +local debuggerVer = "2.2.20"; --debugger版本号 LuaPanda = {}; local this = LuaPanda; local tools = require("DebugTools"); --引用的开源工具,包括json解析和table展开工具等 @@ -142,7 +143,7 @@ else end --用户在控制台输入信息的环境变量 -env = setmetatable({ }, { +local env = setmetatable({ }, { __index = function( _ , varName ) local ret = this.getWatchedVariable( varName, _G.LuaPanda.curStackId , false); return ret; @@ -267,6 +268,13 @@ function this.disconnect() if sock ~= nil then sock:close(); end + + if connectPort == nil or connectHost == nil then + --异常情况处理, 在调用LuaPanda.start()前首先调用了LuaPanda.disconnect() + this.printToConsole("[Warning] User call LuaPanda.disconnect() before set debug ip & port, please call LuaPanda.start() first!", 2); + return; + end + this.reGetSock(); end @@ -483,7 +491,7 @@ function this.getInfo() end strTable[#strTable + 1] = "\n\n- Breaks Info: \n"; - strTable[#strTable + 1] = this.printTable(this.getBreaks(), "breaks"); + strTable[#strTable + 1] = this.serializeTable(this.getBreaks(), "breaks"); return table.concat(strTable); end @@ -600,7 +608,7 @@ function this.getMsgTable(cmd ,callbackId) return msgTable; end -function this.printTable(tab, name) +function this.serializeTable(tab, name) local sTable = tools.serializeTable(tab, name); return sTable; end @@ -958,7 +966,7 @@ function this.dataProcess( dataStr ) if dataTable.info.stackId ~= nil and tonumber(dataTable.info.stackId) > 1 then this.curStackId = tonumber(dataTable.info.stackId); if type(currentCallStack[this.curStackId - 1]) ~= "table" or type(currentCallStack[this.curStackId - 1].func) ~= "function" then - local str = "getVariable getLocal currentCallStack " .. this.curStackId - 1 .. " Error\n" .. this.printTable(currentCallStack, "currentCallStack"); + local str = "getVariable getLocal currentCallStack " .. this.curStackId - 1 .. " Error\n" .. this.serializeTable(currentCallStack, "currentCallStack"); this.printToVSCode(str, 2); msgTab.info = {}; else @@ -977,7 +985,7 @@ function this.dataProcess( dataStr ) if dataTable.info.stackId ~= nil and tonumber(dataTable.info.stackId) > 1 then this.curStackId = tonumber(dataTable.info.stackId); if type(currentCallStack[this.curStackId - 1]) ~= "table" or type(currentCallStack[this.curStackId - 1].func) ~= "function" then - local str = "getVariable getUpvalue currentCallStack " .. this.curStackId - 1 .. " Error\n" .. this.printTable(currentCallStack, "currentCallStack"); + local str = "getVariable getUpvalue currentCallStack " .. this.curStackId - 1 .. " Error\n" .. this.serializeTable(currentCallStack, "currentCallStack"); this.printToVSCode(str, 2); msgTab.info = {}; else @@ -2001,7 +2009,7 @@ function this.changeCoroutineHookState(s) end -------------------------变量处理相关----------------------------- ---清空REPL的evn环境 +--清空REPL的env环境 function this.clearEnv() if this.getTableMemberNum(env) > 0 then --清空env table @@ -2009,7 +2017,7 @@ function this.clearEnv() end end ---返回REPL的evn环境 +--返回REPL的env环境 function this.showEnv() return env; end @@ -2217,7 +2225,7 @@ function this.getWatchedVariable( varName , stackId , isFormatVariable ) end if type(currentCallStack[stackId - 1]) ~= "table" or type(currentCallStack[stackId - 1].func) ~= "function" then - local str = "getWatchedVariable currentCallStack " .. stackId - 1 .. " Error\n" .. this.printTable(currentCallStack, "currentCallStack"); + local str = "getWatchedVariable currentCallStack " .. stackId - 1 .. " Error\n" .. this.serializeTable(currentCallStack, "currentCallStack"); this.printToVSCode(str, 2); return nil; end @@ -2558,7 +2566,7 @@ function this.processExp(msgTable) elseif var.type == "string" then var.value = '"' ..retString.. '"'; end - --string执行完毕后清空evn环境 + --string执行完毕后清空env环境 this.clearEnv(); local retTab = {} table.insert(retTab ,var); From 835cdb67ed9028735881c845e57684bdd73e3a6d Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Tue, 17 Sep 2019 15:15:03 +0800 Subject: [PATCH 078/431] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86libc?= =?UTF-8?q?=E5=BA=93=E5=8A=A0=E8=BD=BD=E5=87=BD=E6=95=B0=EF=BC=8C=E5=9C=A8?= =?UTF-8?q?win=E4=B8=8B=E4=BD=BF=E7=94=A8lua=5Fsethook=E6=9B=BF=E4=BB=A3lu?= =?UTF-8?q?a=5Fversion=E4=BD=9C=E4=B8=BAlua=E5=BA=93=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/debugger_lib/libpdebug.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index 0459688..1ad5189 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -1021,22 +1021,18 @@ void load(lua_State* L) { while (bRet) { #if LUA_VERSION_NUM > 501 - //find lua dll - void* interPtr = (luaDLL_version)GetProcAddress(mi.hModule, "GetLuaInterface"); - if (interPtr == NULL) { - } - else { + // find slua-ue dll + dll_GetLuaInterface interPtr = (dll_GetLuaInterface)GetProcAddress(mi.hModule, "GetLuaInterface"); + if (interPtr != NULL) { hInstLibrary = mi.hModule; - getInter = (dll_GetLuaInterface)GetProcAddress(hInstLibrary, "GetLuaInterface"); + getInter = interPtr; Slua_UE_find_function(); break; } #endif - - void* versionPtr = (luaDLL_version)GetProcAddress(mi.hModule, "lua_version"); - if (versionPtr == NULL) { - } - else { + // find general lua dll + void* versionPtr = (luaDLL_sethook)GetProcAddress(mi.hModule, "lua_sethook"); + if (versionPtr != NULL) { hInstLibrary = mi.hModule; general_find_function(); break; From aa43edd1e369ec42f0583654f2c92188f6b45bed Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 17 Sep 2019 17:29:09 +0800 Subject: [PATCH 079/431] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BC=A9=E5=87=8F?= =?UTF-8?q?=E4=BA=86=E8=B0=83=E8=AF=95=E5=99=A8=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 2 ++ package.json | 3 --- src/extension.ts | 11 +++++++++++ src/luaDebug.ts | 1 - 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index d9fc0f8..5ddba5b 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -484,6 +484,8 @@ function this.getInfo() else strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。如format文件路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。也可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。" .. winDiskSymbolTip; end + else + strTable[#strTable + 1] = "\n说明:已开启autoPathMode自动路径模式,调试器会根据getinfo获得的文件名自动查找文件位置,请确保VSCode打开的工程中不存在同名lua文件。"; end if pathErrTip ~= nil and pathErrTip ~= '' then diff --git a/package.json b/package.json index 6e1eef8..e8ae39d 100755 --- a/package.json +++ b/package.json @@ -175,13 +175,11 @@ { "type": "lua", "request": "launch", - "internalConsoleOptions": "openOnFirstSessionStart", "name": "LuaPanda", "program": "", "args": [], "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, - "docPathReplace": [], "luaFileExtension": "", "connectionPort": 8818, "stopOnEntry": true, @@ -192,7 +190,6 @@ { "type": "lua", "request": "launch", - "internalConsoleOptions": "neverOpen", "name": "LuaPanda-DebugFile", "pathCaseSensitivity": true, "luaPath": "", diff --git a/src/extension.ts b/src/extension.ts index d5d4a84..8c1cbc8 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -85,6 +85,17 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { return ; } + // 关于打开调试控制台的自动设置 + if(config.name === "LuaPanda"){ + if(!config.internalConsoleOptions){ + config.internalConsoleOptions = "openOnFirstSessionStart"; + } + }else if(config.name === "LuaPanda-DebugFile"){ + if(!config.internalConsoleOptions){ + config.internalConsoleOptions = "neverOpen"; + } + } + if(!config.program){ config.program = ''; } diff --git a/src/luaDebug.ts b/src/luaDebug.ts index b1c7deb..e27ff8f 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -141,7 +141,6 @@ export class LuaDebugSession extends LoggingDebugSession { Tools.rebuildAcceptExtMap(args.luaFileExtension); Tools.rebuildWorkspaceNamePathMap(args.cwd); } - //------ //去除out, Debugger/debugger_lib/plugins/Darwin/ libpdebug_版本号.so let clibPath = path.dirname(__dirname) + '/Debugger/debugger_lib/plugins/' From 394bc3d628a704bd12f05bc402c732b6e4c4533e Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Wed, 18 Sep 2019 11:55:05 +0800 Subject: [PATCH 080/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=B7=AF=E5=BE=84=E6=A8=A1=E5=BC=8F=E7=9A=84=E5=90=8C?= =?UTF-8?q?=E5=90=8D=E6=96=87=E4=BB=B6=E6=A3=80=E6=9F=A5=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 2 +- src/LogManager.ts | 3 +-- src/Tools.ts | 52 +++++++++++++++++++++++++++++++++++-------- src/luaDebug.ts | 3 +++ 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 5ddba5b..9d2743b 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -1530,7 +1530,7 @@ end -- @info getInfo获取的当前调用信息 function this.isHitBreakpoint( info ) local curLine = tostring(info.currentline); - local isPathHit = false, completePath; + local completePath, isPathHit = false, ; if autoPathMode then isPathHit, completePath = this.compareBreakPath(info.source); diff --git a/src/LogManager.ts b/src/LogManager.ts index 5469f68..fe3525e 100644 --- a/src/LogManager.ts +++ b/src/LogManager.ts @@ -7,11 +7,10 @@ export class DebugLogger { public static init() { DebugLogger.Ainfo = vscode.window.createOutputChannel("Adapter/log"); DebugLogger.Ainfo.show(); - DebugLogger.Ainfo.appendLine("hello Adapter info!"); DebugLogger.Dinfo = vscode.window.createOutputChannel("Debugger/log"); DebugLogger.Dinfo.show(); - DebugLogger.Dinfo.appendLine("hello Debugger info!"); + DebugLogger.Dinfo.appendLine("LuaPanda initializing..."); } public static DebuggerInfo(str: string) { diff --git a/src/Tools.ts b/src/Tools.ts index 1c97d38..dedb332 100644 --- a/src/Tools.ts +++ b/src/Tools.ts @@ -91,23 +91,56 @@ export class Tools { processFilNum = processFilNum + 1; let fileNameKey = nameExtObject['name']; // key是文件名,不包含路径和文件后缀 if(_fileNameToPathMap[fileNameKey]){ - //冲突, 对应的key已有值(存在同名文件), 使用数组保存数据 - let tempSaveValue = _fileNameToPathMap[fileNameKey]; - let tempArray = new Array(); - tempArray.push(tempSaveValue); - tempArray.push(workspaceFiles[processingFileIdx]); - _fileNameToPathMap[fileNameKey] = tempArray; + //存在同名文件 + if(isArray(_fileNameToPathMap[fileNameKey])){ + _fileNameToPathMap[fileNameKey].push(workspaceFiles[processingFileIdx]); + }else if(typeof _fileNameToPathMap[fileNameKey] === "string"){ + //冲突, 对应的key已有值(存在同名文件), 使用数组保存数据 + let tempSaveValue = _fileNameToPathMap[fileNameKey]; + let tempArray = new Array(); + tempArray.push(tempSaveValue); + tempArray.push(workspaceFiles[processingFileIdx]); + _fileNameToPathMap[fileNameKey] = tempArray; + } }else{ _fileNameToPathMap[fileNameKey] = workspaceFiles[processingFileIdx]; } // 显示进度 let processingRate = Math.floor( processingFileIdx / workspaceFileCount * 100 ); - DebugLogger.AdapterInfo(processingRate + "% | " + fileNameKey + " " + _fileNameToPathMap[fileNameKey] ) + let completePath = ''; + if(isArray(_fileNameToPathMap[fileNameKey])){ + completePath = _fileNameToPathMap[fileNameKey][_fileNameToPathMap[fileNameKey].length-1]; + }else if(typeof _fileNameToPathMap[fileNameKey] === "string"){ + completePath = _fileNameToPathMap[fileNameKey]; + } + DebugLogger.AdapterInfo(processingRate + "% | " + fileNameKey + " " + completePath); } DebugLogger.AdapterInfo("文件Map刷新完毕,共计"+ workspaceFileCount +"个文件, 其中" + processFilNum + "个lua类型文件"); this.fileNameToPathMap = _fileNameToPathMap; } + // 检查同名文件 + public static checkSameNameFile(){ + let sameNameFileStr; + for (const nameKey in this.fileNameToPathMap) { + let completePath = this.fileNameToPathMap[nameKey] + if(isArray(completePath)){ + //初始化语句 + if(sameNameFileStr === undefined){ + sameNameFileStr = "\n请注意VSCode打开工程中存在以下同名lua文件: \n"; + } + sameNameFileStr = sameNameFileStr + " + " + completePath.join("\n + ") + "\n\n" + DebugLogger.showTips("\nVSCode打开工程中存在同名lua文件 " + nameKey + " , 详细信息请查看 OUTPUT - Debugger/log 日志",2) + } + } + + if(sameNameFileStr){ + sameNameFileStr = sameNameFileStr + "在自动路径模式下,同名文件可能造成断点无法被正确识别。请修改VSCode打开的文件夹,确保其中没有同名文件。或者关闭launch.json中的autoPathMode, 改为手动配置路径。\n详细参考: https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/access-guidelines.md#第二步-路径规范\n" + DebugLogger.DebuggerInfo(sameNameFileStr); + DebugLogger.AdapterInfo(sameNameFileStr); + } + } + // 从URI分析出文件名和后缀 public static getPathNameAndExt(UriOrPath): Object{ let name_and_ext = path.basename(UriOrPath).split('.'); @@ -130,13 +163,14 @@ export class Tools { let fullPath = this.fileNameToPathMap[fileName]; if(fullPath){ if(isArray(fullPath)){ + // 存在同名文件 for (const key in fullPath) { const element = fullPath[key]; if(element.indexOf(shortPath)){ - return element; + return element; // 这里固定返回第一个元素 } } - }else if(typeof fullPath == "string"){ + }else if(typeof fullPath === "string"){ return fullPath; } } diff --git a/src/luaDebug.ts b/src/luaDebug.ts index e27ff8f..cb7c9bc 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -140,6 +140,7 @@ export class LuaDebugSession extends LoggingDebugSession { if(Tools.useAutoPathMode === true){ Tools.rebuildAcceptExtMap(args.luaFileExtension); Tools.rebuildWorkspaceNamePathMap(args.cwd); + Tools.checkSameNameFile(); } //去除out, Debugger/debugger_lib/plugins/Darwin/ libpdebug_版本号.so @@ -245,6 +246,8 @@ export class LuaDebugSession extends LoggingDebugSession { }); }).listen(LuaDebugSession.TCPPort, function () { DebugLogger.AdapterInfo("listening..."); + DebugLogger.DebuggerInfo("listening..."); + }); LuaDebugSession.isListening = true; LuaDebugSession.breakpointsArray = new Array(); From 91860e93dd060e293ecd61a455c896bb31fa8f01 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Wed, 18 Sep 2019 18:08:12 +0800 Subject: [PATCH 081/431] =?UTF-8?q?VScode=E4=B8=ADtips=E6=AF=94=E8=BE=83?= =?UTF-8?q?=E8=80=97=E6=97=B6=EF=BC=8C=E6=94=B9=E4=B8=BA=E5=8F=AA=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E4=B8=80=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Tools.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tools.ts b/src/Tools.ts index dedb332..0b4d7f2 100644 --- a/src/Tools.ts +++ b/src/Tools.ts @@ -130,11 +130,11 @@ export class Tools { sameNameFileStr = "\n请注意VSCode打开工程中存在以下同名lua文件: \n"; } sameNameFileStr = sameNameFileStr + " + " + completePath.join("\n + ") + "\n\n" - DebugLogger.showTips("\nVSCode打开工程中存在同名lua文件 " + nameKey + " , 详细信息请查看 OUTPUT - Debugger/log 日志",2) } } if(sameNameFileStr){ + DebugLogger.showTips("\nVSCode打开工程中存在同名lua文件, 详细信息请查看VSCode控制台 OUTPUT - Debugger/log 日志",2) sameNameFileStr = sameNameFileStr + "在自动路径模式下,同名文件可能造成断点无法被正确识别。请修改VSCode打开的文件夹,确保其中没有同名文件。或者关闭launch.json中的autoPathMode, 改为手动配置路径。\n详细参考: https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/access-guidelines.md#第二步-路径规范\n" DebugLogger.DebuggerInfo(sameNameFileStr); DebugLogger.AdapterInfo(sameNameFileStr); From 3e27f99fee1328910106b46e02b547662b6019dc Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Thu, 19 Sep 2019 11:59:27 +0800 Subject: [PATCH 082/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86win=20libc?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/win/x86/501/libpdebug.dll | Bin 37888 -> 71168 bytes .../plugins/win/x86/503/libpdebug.dll | Bin 38912 -> 72192 bytes .../plugins/win/x86_64/501/libpdebug.dll | Bin 45568 -> 90112 bytes .../plugins/win/x86_64/503/libpdebug.dll | Bin 47104 -> 91648 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Debugger/debugger_lib/plugins/win/x86/501/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86/501/libpdebug.dll index 64f33465c8d1c250ecd0e6d13e90c83fa7c2ffd7..9430f84a29d1a0a4172eeac674ffc7ca195410ad 100644 GIT binary patch literal 71168 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 literal 38912 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 T*`(jDZw2R-Y@ZjXuKN3buRL}E diff --git a/Debugger/debugger_lib/plugins/win/x86_64/501/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86_64/501/libpdebug.dll index 02a2369afb80839e52db1a91de08ecb77f219fe6..10ec166b954436ed13f96c02f2e85315a165ef8e 100644 GIT binary patch literal 90112 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 Q-QRlu-uscz|7Gg`0BmWFs{jB1 literal 45568 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 V3j-EbEL^bg!a_{PjEc}Z1OWQiIfMWJ diff --git a/Debugger/debugger_lib/plugins/win/x86_64/503/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86_64/503/libpdebug.dll index 521cf0431afa021171a5be17ec4da2fa6ebd0257..83ab7e5a817f2e519f4e7214b1f0476bacfbc9ae 100644 GIT binary patch literal 91648 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 literal 47104 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 Date: Thu, 19 Sep 2019 17:16:33 +0800 Subject: [PATCH 083/431] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BA=86mac=E4=B8=8B?= =?UTF-8?q?=20clib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 2 +- .../plugins/mac/x86_64/501/libpdebug.so | Bin 37392 -> 118016 bytes .../plugins/mac/x86_64/503/libpdebug.so | Bin 37520 -> 118144 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 9d2743b..cdb938b 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -1530,7 +1530,7 @@ end -- @info getInfo获取的当前调用信息 function this.isHitBreakpoint( info ) local curLine = tostring(info.currentline); - local completePath, isPathHit = false, ; + local completePath, isPathHit = false; if autoPathMode then isPathHit, completePath = this.compareBreakPath(info.source); diff --git a/Debugger/debugger_lib/plugins/mac/x86_64/501/libpdebug.so b/Debugger/debugger_lib/plugins/mac/x86_64/501/libpdebug.so index a1e4f3c823ad291b9065648045b3a76aaffdf77f..35dca67ce9dc6e8e37c8fe0325be62c5ad3ad3fb 100755 GIT binary patch literal 118016 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 CrJ;KO literal 37392 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 QIMXNd38bfy_EdiV7dg^tdH?_b diff --git a/Debugger/debugger_lib/plugins/mac/x86_64/503/libpdebug.so b/Debugger/debugger_lib/plugins/mac/x86_64/503/libpdebug.so index cca62cf2eb972ceab66e17132f6f3392bd55bcde..de5d29575b5ab62bf90baae552d276ab0add9a39 100755 GIT binary patch literal 118144 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

Z&AG6Kt#oXVmabg6a&iru5wOy<&VEhLgJ!5xAG+ z;R+GB!c+J60^tcdWG+|f{em|=GKD4WRxJ#9U5z;n)t!wq-3>J_O4i>?*1>Cf{#D zN!8YWp)7)(>4?2*E{KovH2%Fn*uNwidmIal6c*-p1^NLHXw{r}mOWZ4Afjjjf7XBrh+qEOLT%O)-@j1Njz)R&BM zQoYb;PUAl9qOAzHt}$69S~wqsba5Dbb@AsO^G5|(i(M6ebF&3kz;gE}$xrLJs0E<) zgC7kJWifp3hVYgO?Sb}+{MRJCLLlqnCVNV0A2||?G=Gr`It;}9R_-IO=z6Up|Aj#R z*x#@$lrT@uD!{VhFPM#F*1~x#$5V*1E2)Jyfr8v7f|aBCMaG;WiTX}sx@hciGU18# z03*A}(&q?o9&~Bp57_||7wAP&!7|(}0;e=i?`*7jQGaniEgrroIB?9YMciJwK&%|n z?&lZBQq>38YpVpgv6Th017*qHNO#4Q{=ytP(G+H)|ITha+F!I&t3OkkwWXOGsOLsw zh0wEPOU%Q=c3WK2=3T=D$lfLproZlK^ZwYywbG5#*T`OSI6*9qryWLTr}c=tVS00T zt6W9HF5ErUn)kZ?{8`1fbvGV|v8r*x$LiCa{rF_j=kXl%satJbjI+|5TIR-@SH#!m zMDDd`EwW@^oX=e@u|&AMc8$6sC+n8}@oF+J#v?P40@Obf(1%0=?Tkm_ulF zJg3=>6B})j>$-(tjnkXEHmIAq=*PON@%{{VA*?Y`DJBmWh@kb24Hw81q=kLN!X!em z6pL`tcyiRp?3vAYsW$&;7c}jHp2iFPMOJX+U)&Yk=cCnsAXIlSptjf^!p8p280q01 z(0@OycaPt^3G!F&;}TpS_pwy36~~_*&Tlwze^Ak|qIpsz>sn8vf3qw6dVt;fX`8uE zMXu7tLW2D#c%>a3*qkdn6@ksdc+?X-UfeP+DTy}vv+o%*xL@!*uDs_P$5;r*kfMe6 z3y+#IC2~M?qm>JFe8zTgY+TVSmwmoYy1H0llXm+p5I8o9KMdYv%dl2@TeuB08CGLu z#M`-ivO(if1n*ZUY-js=H#+WU)# zv#)*P6iT_`!-o6n)ep$ z>NdGsgq?gT?+bhlEp7-pP874s0(&6zm&=3FBjF1!P2i9f4E(Av@X2s5y%8wb$9Dvf zCzjFzwqi+UCrSpxW#nI6E#U0opunZa1K{L>6u`YE;7&qO0V1CyxUB$Z{9uc<$_8bR zh!e=Y_;pKU&-(kYUC%*6mlx zrG_2G>tXs<4jB00-k$95751-&{W(m=`02s;a@pH}e*c{J->1Wp$Z+B;_66bp`*>fY zr5U_G9NP5Y{m;SrFy4P8&HA_5tgl$Us76@+i}0JtW(TfPtnV@KRfsOD>BaqvbIsv* z)NfV%e-iwE0-2dW>fc;8OlHQxzX)DIYvwlbvNnXV-*IRUh8qPfC=%YtBCIx9ytW)1xj&Gb^;GP4sOXlU~AFmb?O*-TtFP?Y;2ytwXPa={&AE-~k7VO(VpgjUwxgM~YU?_5_lvsR>xM6R zzPbQiRu`StrteF$yCEgMDCrf1_$8i65(~kM%=fDpzSDU{N|RTo{F5uaUNn&NWoa_( z^A+u|Ke{3N@VqH9>{s9PQ)DQ_?Y^lxvM@!3b5wO{D&Pg)qy)%eRCqzC&stM)_4N4X2OQx;ngd8xy z!MxdLhz-%(A{9^z-#+y;jw~>?ixw1qM(+R9yc-xRTK!h~n%enfd9S+V_VPRbD4bvh zbERg6cc@!$#J*nWGBU zq2IVWmTKs9$lj7U#{NGXU!KPPwxTL7kZG=i>Vfgn13~sgG5d?B7r|D1HLnkwfpJxyNy2pJ?~}MAh{flUU)e@5@o`?`wRVR?9B-|zh| zDV>x4G%QGtrN`**H!(utkI(sWVy3*qhy9MEnNWrybc7tgSTmhqhEaQ2}zE z#;gLCwWp4o6+8*WgX3%goDVX=KYNq{A1{)<H!9%g9&F*DZs&Dk~HU z48RUrP`AG(I0n4r8g9>HT)-Wps~R$-VE8y%)YZz}>~-%RYV@wI+utX!5U{Ibe*rgN zq_RM+c?k@y+kbX&KwW8#Rxh4g-wLsvF#trZUX0o)s9IRg-z&(6OOfIC>- zppIvy-7|h8H7oZF$KudXpAU;-QdIsK+U*xmgYCuem?X&JY$tk5teSXj-4*UMDB*%0 zpg8L0Y|v=y#f-wd+xl(}d+6;0I_5d&#LUUdd}Hsbqo{WK9>zCSEz<2He^S+VPGoEM zJ&BL3#3Rf0$I!x`(yHEwM#x1;LDITVF#LmEY*D({D-_fI_6$hSD@Vp*feocXpgcT^ z%I6ZHIKAFQoZeoa%L8=5$X~#14fdHYu>u?-vaS?2yRUfBO_fkr#tkPQO7766zIr4g zFw(qya4-o*du#~ilW*&!OToJbWqY^%9+nKfI%(`dNU)apo}Eo0VWm>bH+^ z#ndVx$&dBF%~sv4I%q0iJcw-~;-7TtgBfLBIRRwX5YdyPyu|dT>R7v2zVL$FNgKPu zE|$Sj`NaH_%17Ez6v8v5@}pHmk`>al5Sena%@HV7YnY9jwL)*5R^)ARM6Fm9NiZYA zgW_+k6)G@VQ8ix-vKiD+44UToU&4IpG1^3k58?^+u~q)c)3_pG9PEr^lCR{F{(CoY zPO!gx9Du1;?t!gl0b^J!af4`tptJsb_KlS<7sHvgYGrsulPHVT%?(+{v24bu(WEY7 zR=|i~Ym2{Dro+XLHP%Ec!w0EF3;(C^1LqNA5Af3HZBh!tu~HzOmqbi(iM>sFQcp!= z(CSBFlxwVxKI#s?=;)H!wic^W6WAt_tqoj;@$Xk$*kvoU)u3OJ#-19h749|74UEhh zHiWi^Cncmc+yRogwX8G@qH8+I2o;=juk=k5M3;V5{nBiAQWK4cBKSKv#ynfPiRqeG zId6!tn5iCAP^1o4%*LVY`X!g@5j(-Wv>W$E_OUL-%yH9hc(?JTqB41LRGVizJ8kOlN)s8r5W{7fJOZOP{$U~#KSr^F)7ut>Z^Rx zsn#wPDM;EZAb47@s7PtE9a$_nqY|0^OxhzVnEKTEuT>FOs)$G;D?%h1kNC8dB{he@ z4GnH_XN-U6Tjk@D^XG9KG*q>$PnWmOHX*OE%7Nz%e;VMTt@mX^Z}lcoOEXkihqtYq zV^|TerKhe4uqwH+F5Y50R1}Hu#lj4uOM>zk(T9h`W|2!>?=68iS=1-~ zWSQT4v^-3rGg<<->ZTeg@ym~tvo0ein`1;1qc^sm~n!cU(FldW472`EH3Vdn51+8^;*mqxRl0w~))V3$U1J2OekxUFbB=?+QAi;0h8(oAxqs{SP3>b3^bB(I>K&lDY--(y~U+)i0* zG$z$tq!MCNJTlv;eEISjRwl1r{tF61X0DH6p zG;nJVfN5n8ce^hSQ@OqGP+eNzZnA4cl?!r>^gine);=*j4SJ|XfyoVNEEi8A@7van z-3+w(C{QU)C@_XYBF~Cq{Wqmp_o!*{7^%U!67X^)(Oy{ue&EQ5)3m>JPlpj&!i9 zY(|B;iY4a}hEb2cNgg9USY*e3L~Qbcf_1%0oNt$Sm#ma{)G6^-VpHLPo>RBPb*GXWsOP6%TOCs-1e#ZuKoP#^`v)=x!OK z;~ArS^~fZ~=$P~v-Og8Pl4JB!AW>!N0LTv|Y>v*e8xmV+*B6&q8Kdm0bA5=~%YMVU zhq1*lI@&Yf4&fc?1gM_jEwiQ<@S%j`zlw`ckX9H3g%rzs7E-oe*3*{%`2s{RRe(5?z;kU3(Q)2^c>m$VCsv0b$a zN-Du)qF2iIij<+LA82D}s?qZ6!Pqx!1&XdP*Vh(Ne&^{f0816)o$&) z&)GS!&uUZ)VeR7@&jCiANx6E}si8xctr{=8k8cAybf{9RKgbIQG#=uS6}z3Rp+k#T zEe;*J2G4tyhvOEn*?E4Y@?53zaNy&2DwzWxEq1bi=yk^9zlm}*>z-#kbk2B8(L&ou z=cvV(JVJ+-1m=bgEe+039~ViV*3iQBM*@{Pv7v>;hXYW5=iywJ_ky);JaiKroCa3J zqzMlEirBpba2tmB>U3f3vFB0IA}cGBYox$s&hZYgt(vl!3+&mv{a)tsFfgIV*^Z0I z@d*diLTweiea3!p#wm}Dar#eAbtq_Z7)(xe=wh_C4}Jtje&a!pPi4EG;~vWe#!h=q zEvIq9BrI$clRW9+X^y`BMtO`VlLxFbmR!ytE8tal=6W)w&-KVI497;e3sJ5MwvUZm zy=qwK(3Pvs2^~5mP#!vTZlE+iL!BeZSvppajIa+*WZka2JCkQf#G5>HXjXtv_g)=5 zLw#se9iU+gA#j|WoCvE7*973KdBFkpnUWvIml?YYy2ll3_0LLjTc=MQGT9!uxsr1o zm2$A7yY4`7@LEqKuv-%4UgN+O+WK71D!kuacd$6&ygH$pCcJ; zpCie(*#Sh3+-A?*i4kzqQ3Myz>p{-+S2eEek|LB!Jk8s98tDg{*4teb&=@9Of`765jo{XOic?pYug*-3e z+0!n|7o6?YWi)A<{eQcgv=d}{*!%xSc9SZowa0E!;zFV6|CPH**ZvdK{-xcd5`g?0 zyGfN~|AyV9Ka>MW?Iyi_H>|35lV0KtM(weiaS5n-Ruz5__^CrRG{#Pv@{xC4mI@r3n~6gF4kE8Jy01Xd_4C?o39kq$ZgA-;8d zt*VvF2+ZkG{BO-$Fh1Sd%@aG*6&Rns&+k@?>&%E3W7JKS9`TVjJ<8=F#Pj5yL`?ii zVAQ|_M!L@!UVwttqH`CL&j?TtH{D2un6@tG4u@&H7&vSi{jJYHlbN|VrMAl+?Bin; zeFcQ|oMeE3A0#e=vdU*xEH%Av$obYgLv|^^|K6P;e@`MaI`=9YmG4T7nf=sU9!Wpn z(L1h{$PrEQ0Nsbl<4nju;Z@21vUCgNMudZYxekKkEZij>I8~46&~(!O)84lLL|Ns1 zpW!B&30j(!xl~r(wg45u%=H2}C@P7XTj|JU6cT}82DL0HwIpKWZEM#}E4SL#%D3pw zwpOT>)Rtk}x^}nLYDjD8vPpK~`~A*2&oj?FGr)Lh-~GPtJuuHXzjMD||L1?=CD8{S zlLXO6iVTNrO+f1Kh4)=&&H0kFms7}=lVK?5lJ=3ppuLz-{ij6v36yi*wA`P5Wa>1>VdV znFD;6@%TidY)Ep46^BFrV)jKN%zy?qlo}-M4kFCBC6zgDZHzxk9q@L6e1v@-C%GZ= zCzv*6oeaxQm4Q_LM6@Y`5mE>J(aodnS@50I0sl|P)>ebwXfPHGnRtrrS;Q*Iw}XLPf>def5Mr;PHhir{@0!o?*~$gMJ(ApeLNz z3Uw>&_+Y0EKd7gmm!x~#s$8`dwOsNA^WO8*@&ucsxdB>uf?*{ACQ09pV!{ocU|@oS zV-5?Sq^%!lt^UY7&>C+kS?)xGV0`Cs?0l|IyKQRE`Vfqdp;L6``%9p8T=UR z=x%QVlayz)wiCd{lC=#?hQV16gZ!>G zXBudPv3>F^Cf^jGn}D_9$mu9lFTc7W-oQwsll$TYDyC%9W`<;7EF_ogy?If8-3>$ zblc2RoR2|HNUvUuelMf3deU%64Y+o7V@CYiNh3`nHx-w2q~~*Eaiw_QWhw%E2(4yD zD*7VmPQqRkE+AK524XzCQB+-;pelnw83Zm^c;_X0qjW1Hl2voojX+E3b$ zYpdE5J;xLLC_$?CBE{jrlUeOhcUwGT{oS?ykk-GWbpUDoyHxKPt9CT6YH#

nmzl=|+ygr@KNK7_8W zs(*o!*%1fXUsa7N8*pc8B0Vu`KROwIej@8n3ow+K9r6;E>9bO>#>%z}FFs`KI`aRS z07GkGB0;hR&ue-6JmcQyfEHwRe_eT0bKJ zH-RR^-Lfq!?d9^5p{_U)2)AUjM6C0C+<=X{ZCggdTQu#SvHEq8B*72WBnek*=>4X&;@9?K1X8`NKekn| z|F)Fp;=P?|7bk!ceAP-kNIpY_CV8}0PY({nlYUqM^xF}WfXuLP;zvaI5}NFtB6!^w z%=<^CwR$nP#qvKV;EZx-hNFI9lU`LwjsXPmbqOjNRQt{dQYGkC$z52>XFV)RU*x zT#dKR+<5B@L!z8Q7?KD)C0vWnLULt#sf? zU{^$DT*muk|2ChEvHS^A=U+HL@|u4iI^2B#rDQJ*;b`5k=lz7fO*4E;m%fdoZ$m&{ z9f7-9|70wN!)=ZC4c}6D*m5~sn|=i*sigohSNnc<4@VxM2f=B9>?;z8Yev1wk+7!k zoq9mr2wmNSR71%~zdFp{6B;+$IWy0wenmcegr15#rs7s}3--pyu|vIQ%J+3X(2vQO zw`F~!`0R4~_Lkwy{n{Ml*Ozgte+DoX4_=)li)2~@j%u&Us=X>AD=y%&M;w=>B+LyisAgGcL8l4RjEK5lh9JhKDz>QeUl{u=u#n^Oplb2MB&+m}0?a8v$w^;6PgC!+C1+-fcvs!|b;-&3*7akUc<|A04bw#%JucK_3W4c;-2+02q?rg_KwR-17aKzDsf9L;@tqo9#qKJM^P%yjq3#WFIoaG5l>g|6z2e&td^}&^P=~=yhw1 z@lJAYo9x7^!r)8g8Am>hX>m^`R=1ud=K*br-X66VzP73@wzA*;1n9~ML0hW#M5)`o zqUWj?n|&8NjWSoqm1+c3Jrl=M>HjFh|Kao>tVKkv^PN@Sj#)au`82PAq5?}MB9Wzt1ht zJ=orE&R=DFIMvTBaj^4GyA-!Xwt%e_I9^k=4!r4BwMBblSFIc*yr1rmm0T1f%J=$; zF@&O_@82Eh=XfV*hdAvY%{G>dv%i=Lx|PK{8#G5ohS5~s9R_PweH&TPFC8q12hhKO z#@j%8|1&4|U)46=+X7DT%%piO@&5=uH|wunp?Ss3ZM-iup#4P*vlFiUNT9psD{WhS z$6?zUtZg|wG_T`>8ZTw6`D_C2z2l-Q291O1sEMj*KY$C`=rh3%P9cPiFe>hB0OOyjf;l0GHr-nXACj0rr#;;mAKzL3BrP53DT1X(RRJ(tR=t(`q$HvRy+5=6{ORxTmDlNPj zG`mV2ny6#XdPxL5B%^K`PC^EQ2{5=AVj6~c)jrW5aj1@|zHlxl=lD7C8;>74s|(TY zFC2_t0)GARi^mTWnXBu3tB+%YmBe{mo$-OCx$wxh?F{TQ&qI;_H`4|isg$&h@wBlK zHn>1XPq7aB+4as^Pdw%mt4SJ95~Rnia#cnSt2Q>xRQ9JYY1TCdT@LQ7nC~J$@&p{HSZ4jwbz(5iV$F zteujUJ}h1_BLxeZZ=Q!*&TDHjsbLq>W`S}qD3@Go43^~DN*`z z8{Z{(aZMw>sBn_tx_V&seDu2W(d*84;x`^Y^t$uW>&_pHUjlw;dGpca=Cjvr^nJVz zQLw+xGy|Ch%>@i*4UF$#fU-v}gu<67jjwLfFS2D-mu|wZ-dXKx0EebVc9MLHjgj^B zm;Ph?!&_{s_e`fwZ3Z|uEQp;}yV&T(2J-+Id$vLBhcF=MS~(D$-4nxPZ?PUI79O)Y&9 zRkA9o&m4BypiQLE<;dp&#l@bhSLlpoQ_>mB=Hwqz*s74RY^cs!De;VdIA>suB>ZSX zwz4_;&O{GP-96OZ3thHcUr|5mny=#}Ko8rW(avg;+af17#;vJiN5^+$YA{*B79J8| ztsLK>Bf{F>RyjVRF1b2<%T&J`Z5@;&#-*Ip+38{*>|8r z<~0@e+(Dz+Rj`J|pgEd-dlJ1Hb>BoveV0PwXto@-jL|GpyD&zx9m<7AxyaBiCc~EP zHN3&}q^sBP-j}`^{jJA*4UeIyp)5omJfIu}<-sk~XC7R%fu-}l?+esjoQ@2{_0wo% zp7nPwGL64%n61H&YB~0i8iq6p?3Pq}+6MM!Jh9<2W$}+go$asT2o-afLzy*|gEJ#5 zaTamV+n@QiD}rsMGQn^Q!@=YPH(X80olhH6a_7Mh}pmFOfdBZ``(axl6~G_Cm5<$&p?^KixG4om`p2!!v zWvj594B$K$jRVWrRc%A#uDgY!;;P2oxOjkSUx~^wCq4_W{;YZty9|U_@8C#n%|6*Q z#yP9Mz#Eit*PjT;$IzU$6CCnIvD(WV4(BdB1RV7)2ii>X=6T*Z1gt3jmbvu@T)x|@ zm`fbQCE!ndd59V6Rb*x)CUez$rq-T#fKP%U60t30(a(m9Mu=8~3N#0AE*-+OcxUFY z6!oxGq%-YM+^PnI^PDU;JkhMT)l0g1X{7zc$R zZB9O@^=$+$d8ykJyuV!iCE9xgh?cnIs`q`~O~w(~gDRBPq+SD%tCJcOf3j4q+J>Z& zzOj*{kz}=`I;57TIB~%me`_1U_{IpM)%5(o;JHkf?}k3KiRFNIld~E(R}k_;GD+mq zim7ngc25E*N$Rnog*hm?%=dh4*dsyiA;|4~kZV4&aU5ZMWV2OP@h?i3W4ND|Q%Kn@`$alIh zJ<;u@49VNcmq%B9jO5|I3uZmsPw@3af@IyV9)laC@gTSgWc+G|Yt794wR&TA4_24^ zqt#U#tZXq0!g@J$14aC65M=}!?fX5Pv7UB^Y@w_(=|~L9Bhv1GxP$GGvjWm?lH60a z#Y#Ng|l?VVi7+nFrq?8O2)&ICJa1$gIfxSTs?z zLmbO;0z4_U<=L)^6O~1^hP_;lkW2{#BcuY>#hDb;61JjRHhFQTq3kLGUzr*<*%3xr zf=Ef0rHTsITcm738CF+dn8pT!%GwUgatgb05IkWH&1vqcNwPRGB%0g&#tDldn|-87 zV=WIU(D5TCX*>1tr=+2hC#_8z(0z7pXs+Xyq6UlByXKaJ-2CVsv%woo-p!#D*tTPrXQ`yBpwr4EnVW`{8 z#Yyq|=POsJGu{T3%c!8J_bQhmv%oXJe3Q96yBV0d+}vRWZc;5~-|>uG1$rXn@`Y`B zxSsPY)l-C9 zi&aK8__nemv1H_bR4pDT_wK{5#gb}@+dB5U0{!IkxxNd$=S`^{`!Dvrz9#OcO5#V% zDL9#&8jF6pm2NGQTXoKOx3r6)e$+QVr>pmU{i#zEea|RJ26@(~7e-RE@AZ^mrw(@X z5VRahjwR1@4<1W!K8Otk&it36Q(T##_xBr&LfeUBqz z(81JQ@j4&uyPGc`0Pvz#?)zKh|NVUyh?<@!}XJz87Rb;NiJ)wXabj$OA|m}JlN^@3TGvMW+2YA_sa)kEd+FXv#K)DCIlgv2^9 z7IR?y0TurlC$Fl&|12$@TH zOr2ksJczN7M~jlvbHt+=sjBkLz{U^eU>N2w+XA5nCM479oSd42*9}x0FRLkYYQBvV zlG(7E(a8BFv~h_WQ?xA5(qgiQyttZtlj<>usEd=Z08-nbjAo z`P7iD4a(oGA^jyAKBN$1{17}M-RxYo7jx%U&a%}s_ARVA(1zw(CRn;tYJ|xV%!{kx zjC~o-@i{NH3ZrdGPPe{(*!dwB+G%*#o~PVkhjPAes*Db@7U$0Ygg5@aw&m$o+o^sw z`ID&qqUzVcMir+~T&`wrF&+$=7WeQ0tTwnHWxW_;yzBi&X4>E4u3y8_K!4UR6OX_8 zUPpAvCY4wCu|mU*e*Y~!ypnpuZrUcx@VJMccmB!$^mmhf`rC(>nO~4(kq3QqR^luL z3$I^sfsU&>nFsfgdS>f^C`lDf!pcLwzDVg*uo~Z=CzpI!y4H@w3{r)Vnf8J+?n3k> z?|Dv+i;s-!-R;Jl__f#{ShWMg&vq;)zVdzoOO@y82ZD#8qd+jW2ZA5r#h2Boi-NH!ZDTKcAKMIr8sc`^y6Jg5GDwT?k?r z>|DI*IWw#F!q&_ody-y{i;p@Xu6NW)lEwuL=Kh(vYH#b5+7;d68KF}$ha5!yUo(-} z&Ah&!=P!e;#FjQU*LU(V^tAl(= zFspVcLi@r;Dh~9;+>NiiaZ&;}lr@v5RsP`pvE*O|{^%b}xG|1w%cj+o#zGUkDxvu) zxbRyz_NR=065O!9prw`Z`y(^kcZ^@%N{Zf!#Qh+>0ULuC6F?8oPUd;Uh+NRY%0HH@ z{LwLkL|~7tob7RbO>$($1^BlWw*|1Rkj!#=OsgqDqpXbI-@VxfYAZy|hh!*5I)TXu ze5~L!FfT#;u1Z8#T#LCv`wkvVpCcpZ#na=k9rxQt(DWhSCvL?;DRvDQ184pvD=rf^ zbWSFV)ZeO$ZPw~(L>rU0+EF)-#=UX8PXFSfsRmqCZ;p{K2cA`5&zKvJ7k zdqMA0HR0|dA2|xbX=#wtdC-Bwg>*=I;X}UnWyzgZtPG@i?WpNQwb3)AX7qSUH5cr{ z3;`}I-P1jATi1S86T)vl>t*?UMSge6Z?pWqF28Tc?{4|sBfoFS?>qAQp8W2W-w)+? zpZtC-zdrf>RDKW0@8|N{D!*UK@7MDCjr_LB?;-j9UVeX+Uoo8VjF8_b`Hhj^So!TC zzdhx*m;A=dZy)(RQGWZ$Z-4ncMScg!??Cw_4RrfiXUOj$`8`{H2g~nJ`5i95=gM!Q z{3grqNcl~X-&FY>Bfn$icbxo=$G7l1^r0nRqLplN7b*W zDyM2SRcooblBx|T#+{r~+5%_QFS~+DKJ2!fE*pRdcDjiK+*vx{j(J zsp6q-;dJzNEhSXlNmT(=pHg)RRedmuwD7>Va4J<7QdLRSSgP)(Dw(S7R1Kzzn@TMM zsrrGc6RA3tWz~bK5mX7Pim3Vqlc&N}R2`sdJyjo4)j$OHDFRDDL(x{<%po$<8m)6D|c5^6qS~Qk%LD5F@EkvMJ33^ z^2KO%72Z6nKW4o!>?1$ezPqq(#t+s}eaZr&9?-OPUTB_QItd6GpB$$`G%iOsh z*@FCj8RdienOlr5q9k;Glg$1|b{Zw6C2WZSjZih!fcU_^S$~aKx39l7BJ#g5q6qPf z;e-nA)AU0JEl5X$y`Ur6u)zzoPvf<%0hAxqJ|{!iCdRf)(aVMB;K zrKuF0ZM;hd58yWtzc&f?;)kP4@ppnR@na(2Cdh#o%(8n4E(KT)S&BCR7?-T6`B}>PY=k_w^aa~5J}%yaR{UbEWtSdQnassJRR7Pzo>t@(O~x0YCyO3J4AWFznd`JR4_077`2w;EXPh zV7}F)T$?PQ3HSe)ebUVV0H$#oOdPCn=Nl%hN{riBx_Jozo5M={2rvQ4aWt8Z+QTfD zNhs9dQkq;1zzM5N_RpciikV826nu&yOM&D-w68yOEsFi1M1Pf9_)x)udWNpjV8%MI zk%0Nbc;87tw)(VIOwa~kdR~C!(L^S^6krg56u$2YoX|g-&}%PDE^6`6f2-ZYkZ_aT(7}xv{r);`w}T=%CL2RI8{P?sG##) zYOqse#H46nza7z-K((1?RIp86Mei2iw;w+#rb34ehYKMY%P~sdNH6Qw8Td)7J+YvQw+eIm z{{w3D#>cFQX9CdVeVQa%O(trScWE*MA2am%+T?ATEVi0lsZIERqu{B(>E<`uoFha)PJv`#XM8=sNOi0QM8tp=T7|;0Mxg zv6_H%RoJQ!&k>x2ETgAna4WbgM{qsCY=F-p*Ah%ZY-B}-TJ(nwbIMB-Qe?64D+tcV z$4uxH09w0(CKuyFYo!EB@F|2Wh1vGGB_{?-f+0RajavND zsGuT{k(1D4i&V`%^TqZU^J!RuuhXXG>O8;G-2DN z$t;?%shB3`X_J{W;nnz(BGG-@i=~#`m{wvj->XN z{7_KQ6Tchj@c?{&2KhS3j`Q)^2OtGaEp^unoeFj)pV0Uj{4S(|qJ8~8Q0#IhvrFj+ zK?OUdAt(s(0e(I3I~~Bm$qT{HXu`Pz0Xrwha{!EBUz+>{pa!xOP(zsMXXsK;!8md3 z7u)f>7e6V?`ELo}6#VWv4xb3v;jpNRy?} zD%+%+R0IuYVlzGX2H@wAHxRtlO;x262_~R-ptT1GHUO~tNo&mjtZ~=TIw0E;||)(!x$ua&+y7e$RZvBI#DiDLXmL|+4 zUaY>J;7eqe8Mp&F^k5N9df~&s-2{X1F|CaNptZR)8IKRGN#EuG$ch3Dl;?KTn+a4- z;fI0>I&C1h7{6>PDE^2aO`arRUAOc*X8oH*LkcQr`&6VuPA#WFmf|6Nk!>OoCJqKO zLu%vG4LWplGToer&mhBu8kYL^wZd4DLqQj;zQTdeFxsQAq>Zgh3My!um0mdUIaBFl zLZMBrq{%XTLZ$6LsBP)_a*YvxDmVsCV*EKDc@aM;%r?8+(4m4gWivI_;+IARg=x1@ zLVTz=6~8F@`!;?V_(@^f4Xc0B@eRm9v=-4uzuv(wnFAL2W!Ne}4Ix1ZC54QK>pDat$v^#|wBk{4= zHTJ@;f)PijI`r*wphdSXens#N9F#%cNw6NV;(+v9g3TJ-Lcp!EB*?!bU=LRTS-N=) zKt>Z9Vi1fOmuqP)2_JTZD+wm!V`kDE09xY?kI2V|)~+I0j?ZGqQkd(Uj{q6{Y>YW# zB4W&?>`VgEj8U%Try7xD7{4UgpusGHZ2)w0DZy8W@fnbn8w40{m@subVU*%yi`V{Q+q07c@BwA6nz1fZ}|7)gsVs>DoMa8RO#X|^LmH`2%hSUNf7y^B?Uzu96BWU zEhoV8!crI(mo7?>&iy)Y70PC2No8(vQGwOSv%JiGx=21Z`P@;7;@q<;1de!07P)77 zOLBO+D9XxlI5?|xPR=BpD2hwd-FeY0JTV4(yW!+L%w2l)oGuVbLOG zmcO(>DHawLyK&IxQ3y2=^?i=JoQHl&E3eFjYO2)CK>Ri>Cuxg?@6%1EUw@OwpM2y>za$kxwoOJw%o%mrO61(O`V^Qd! zmIG?X=~#i}IwCLXeOwgP7eVcS`l5v14$+EXU;!L0faN@ngAl~A7^g4$92*-aV0rUT zA%8d}Ith!%e_@!&KzbmrLt<`%Ts0Ll1;~Y%vRw8J7Nl6e z?15Z17wUtE>m_(p6S5~4cH6Kh%!hr*>lVTu7@uCQ^h9CH5NeL>lNbG?_jn9vu4OEu15MG=iLam-{TOh2Fo$XTWVnrc|aY^ zA@|<^`3DSWcOf5sL_9Vk9*~=Vk9kcyPC@TMTp&OG2mB!S*u-*li1Pbceh%@<14s+x z_Z~!kL;exd`d1)FVC-yz{OrS+1)*qTFjdWleBxtV|2V|29_JCJL#${(njo+H6XqRQ zc;5F6Ue1F&{8=I1fPCvV6mX)Sr{!M5@LiSFGfUM4f!F+S=~gpN4ts0P2EMr*dC($ojrx)<(?w)&%H3*_ZE@Y zp#CJBETVom8J;8v@#z`DaoU+8s_{(Wcx8}?{rOoU#&@=ey7nC5_~0B7Q#BazA1b0! zhY3gFFxVR=jsx9a6e!<%fKn~Gez=G_G+a2w{9HtS`g7qJcCLuH{X7wqk|-i?N)nEp zNyy(3B4XPJ;W%-mh{ElV?op$J_)UuF_Hhc5l`6UqOhcUf4)?iRL?_%MB6i**qHn!d#C&tFi0yZuh~9Reh#2%oZ2oK#-74=Fj=>Lz zh<=+@Q#A~xl5;rRY>5n1x2h`9Gj^a+1P zytj#{XSa*k>z@}5xMzQ5fl5Gh;DdIM1I|jcJ_vdefFORpLXDRh{^@X$UzXTCUUb?OMK9%MWR}LCd?f-2Acf@hvUy)AHw9ZqssvPG?Uo_tSEM zmWOJ2q?X5N*{S83TE0xn3$5PrOF=VjWTH?-V;PUrr$cHrLv?O&F5{~IlT*oA-b z`&D>Gei-Sk*Z#f8eQk(S<|>(ULyC^lo85tbLicwobUOEHS^3tne^nj$m#zI9x=i`t z(Q>1fJBnX@2mWo;{`Fa|{JTuco3z}Kf2|$(*Q)(nt<&k#@_{b=OFW>$x0lCwJ#GxX zQkj=)`B^P@6u;~a{HxRc-FTJq?+q;{tWdZk|LQvMZ?E>xo?g!JDLV46xdZhE7x2%sQJYL9ZsW`JM90o{fWAN zEY$Kg9j}hcqgjV9Z2fP%p6}SxyGQ%CuY>fqc95P0+CO{zx*A{NKi4^8i(kF=?^a!| zZCWnInvbHR^p4m5+3U+JZrDN?vO-czekvvTmRkE$;|7g?)nD29oyP0>D*S-Puk}&* z8I9XCepTamjo;MxbgUUEKGgV5ZQiQ!5{)Cfs~G;Xx3V9n@l0)ghQ@ECDD$BjH){K1 zHQu9fmd2YkR<8c{`@cExzd7)~IS`x!y-!b=nZDrUNelWpGQgX zKDnqMLsZ3E%|@Hokd&!3o0Vx^sImB)A#8?e=Iy+tIP-Aj<5HOi{HS0t}14Mit(&K+wyW?Q3waIjS6f7_1g-CCnE3c@e0Ebys&ERdK z-LT;OnQy=Cb8m~_UT<5H6 z{IY|%!)h2e1*@8)f`bUWaTOek;7fW{4MuV4dSxam#D&bNwO|($GQUIKzO0(Naouqn z*V#P||0ZQs!@oKR?=Wr?R_%$jWfUBTxJp{pU?%R7XHfq)uC=@C;EG+47C4W|!H~z0xWl zSo?%ZknFR5ste5>R_xBMJyvZx-j-RNj9Tc8*MZGX$dqwJ>+C9MRa3Mrpsp{QR&COO zwc9Er0y8gvR@vJo49#2RRc+>Y>2Jfq<3PQw|Hv`MKYJHkwNCfIRvVr7z*d_fdtlQ- z$33vsimeB3vh~1LtKsy(O}YoRy6d0^Hm!uw1Dke3^}tPLC#9-{X*uls_f=ILm00Lb zyuO<)q{HaH_e9v-qJkN>u)DeiZgwSR65%*hzil74P5T}7*T&#%wHWGdwAnmNi$~Wt zTfMRLiHF-a8{Qmo-)!~35|6|0o2?%GWXvXl`erj!&Z#=Ml5Y0Rrsc!yn@wk^bK&*P zri&x!n+>-J%-=T~GYN~Kzi(b^_RX?^skwKZIf&cl+n3nq;8^xuQ6Ir+_Uw|Sm`l56 zx+}a(+@elg(GU@^5=%KyGNGfE^(`X_Jp*M=0#i==H|OSTz@9IDXofB6-e{3IihHe2LBCrc_r!(6TbEs_?TAattgaZPlhay zx?|uc3U21qoKY^uaosWSFE_{U-^OF(pG@nfK)*14lXOvT7s&dK%84lKx? zVoxYTxf2Ah_XZfIdB`(`9b85c1NJG?98Ve;qAV#QOBCs4RTQf>HeGVTD@8IzA`Pjg ziKfG~QF7}-TJX4+fqoR4b$(ZhLrgyT`p{&Z--LsVslU;$zp&hG3uBYtu-q-XNqSZ9 z*ERJTRBZekDGNa@Ov{Z?Gz;4+?)=4M4F$?#nluHP6sugJNwaAJvRsmdR#113 z)^+8BcGu(f7kJ4RO!HWEp~Uiw;Z(bJJ> zFtj|Sd7w6S=a$f7qhD8N=`w0J`L(V2Y3h? zrL^5jTu~xP_ZQMao7C`>=NHO?tcsyIpz>|4h8R$3xsK3NBu9K>3)tZj(c(DQC1Pd1 zxHAgnh8y9M#9FM0E*1~PpoU7a=NEe@!gxPHbj_)XvO2Z)$t+~!OYjS;D`r_L>3lqp_~RNXc}MRpoV zoO9%bh2KSuM*OltS8dVdK>M$5vji?eMvavD!bWN#D#t!VnZ9ZmG!xpg82M0gEefp!=vmM_+W06l-x<*lm;w6sfDM$OoOX#TDXKB$^`A zWPTb1?8t{K+?DXBt4Q3BT=*^~C113IJ~H64gvFZl?1k77MHQr`Mh=taJ3C*z9Gfa$ zi;Wb!&j2xOQAVZ3$t;(+F{;3>b#oNFvTNQ7-UzGD1WoBJ{A}RozB57QY9nQTI!aR2 zyTk{lM2gL{;3^jHMzI02e052y(p^75Lue-~vTlCO%66d;_96no%HOrCf)I$yjM z?Gc|xql_(7`E@ZS&HimMfn@);gJxHe>;EmTlZ2%49UfUwViLqtI~$nAHb;GA`b8flovAX{ws%rf(q+s)Ke14UL&x51z`FtGWz>z>+w?Man$XUHW z?S&A3j#aaId5cB1KDN0=RJpn-@a40q_h;mN%wr?zJf(tDOCnO1y8o*!V^#)OHV>J@ke{G`JymY z%kno+t5;j#)!hr>)ffEiT7*w)AwF*`!Dmwmyf+qZ!q>ytR2M(=5s^uvtp`?m;*n5pT;lfk3Ec5I*e5Eg>aUSVzPVWag#Iedbq~UHBTb_j#e>Ip zx+uS`ch^hlyZUssK>tIZPPPfYKymzJ8yEF)hqJlzUGKwTKlnRjWFs;%Dysesep~TH zKNrj(b5(q}`)xPC%R2JXhzRDR*%Tip@5}1mh!H)B4A|NIAwFRHc2#d9QnKRx8X-5s z5t1Rlb-Sr!mbD1C9{wX-`K{k0!))czUiqyfhaZ*QHhzom_X)L=_z^>b8~7-{t@2y<4s{yw6_ISdwI?Kr2Tw>Ae?QUE zdj4>N*?P900{8df7CyKV}6FmvhMcmilXpLQM$?r#8 zHo_ZJT6z}P#y{vE(8fP8eU)weAe=VdPp5Sc@Vi%j>mQ`LYBOVI$-*w$_?su25$-ax zzd*Rn@E;NXZ+=_lxA7sW>mKHJul&~6Q(g54zs>lDZr#tE5~_8-gu1@*QMznY-^Zw~ zdz|0B@>@^-Fp<1`+I~vlWzsdLayk3RsZpXCcA~@{`E7kF%E8S~u?_}pPtl;NL2Eq- zt+fr*s*~S(`E9@#Ga8q8@6@10kND#N1g>u7Vp@v((bWTRg;yzW9ssftj|p!Z5G5L= zkI&0*ll(TzZ>#*S{S!jM-Nuu8^xE0u++IC;#GKgwq|+y!nv^tT$f*mziR{1P!>Hk3 zM1B?B9C`O~?>g4>^hJ-j$8l3c?w=#4%vf-jV_(#)#JN4^3@D#6zTPq6pAj1zyCWvv z898TW`8BshX5SuhXT+zDdm|o?IJ-yBn3&6BdJO0{r(ooOM;%oTU-Xu!Z@N{!=$JTi zO4dHdtU0$t&adk6VMO}4#HNVP9WOc-Zj0RJcrW5{$DNMyapet;&!gsKXYF;|8@Voa zU&P0bDOoe8WTlUtlJyFdEA~1zM*YU|8^_Mx3yN1q?2c-S@HxIe>CtXG9SsqiqZ%T2 zNBJV&irD7J-Wahu;#Uz5!T-FC5t|*!iH9QgI2O!oh$!#Z^Nh+35idu*;aD(d%=M1F z5w|;Lm46wLa#N4*kH00N$#H!|$^+dFMZ6R7DSq{iEfE{KO?)R}Ga~quNrpP0AMZ>= ziBwE$2Sa|`i@TUCT->D`1bNvGrSI9P&`~AtxUw7;X>8of>UokfzgyFrUZC;Q znx3^x<2z5IYj7FU__QR2cWFF#w8E#r9mA{FI9cN@8V@;Hne%QeMY_hkBTI3Q#v3&r zdy2CEsm7%m4^30{*Pg1(-_kg1fWoJaQReG3zVUp8dks|PXOC5Q#LpC7ae>0K6BOoM zU5cNbuJC2QQ20+8KdP|{t7oP+YP>QZeWt>d8lO8z;jcCJXnZ~HQ&QZj@otUxY0SI8 z6lrHE_q-EK@n0IZY5cCn112l;p;&AVL~SwXt7q8oGKs5%aS!RY+T6Gw)bAYS-k=*l z--Zh$t`f%mrBxam_n4m2*r2=qOk;yy{nWuKJ-pjY@jHzpG~M=l8XNbSoI{lTKHB_I zjg9+F!-pz!8o*>5cU?^UJvJGFD^be#B)qe5J<5{e%ZJ zHtrYj?G5^8(4!xexJnrJsra@9&5e6Ze1C%2xTkc9#>PFPWf~jzaPHCAxTmt+hCk5Q zxHr-J=gNQM-or06Ht6K%OI#(4dtNKGxj~Qrj5as$R~k>BqRMafx%9tEv0R1L?=|L~ zb&4-F=G}FQapx)fyu(iMh{m_iQuteq<7X>8DN)%s?r(wgPljjQzq(&z<37~~8XNbj zPDVe)_!;-B7HVwVm%3eJPg|9g#jr=KEyl#XA4!fQ3&t?}y`^X@;zz!YWw zl0^!;G$u~~ia%;h-T)LW8k0u=#X0D=nI9`OF4XvGjUUjMyaXtI(3m_0C@x07P4_cP z6yB^cw>&7?HEz>*F8XoWCockuhcq5krf^U6>og~i0*bpd-s@HPJ&n_sDttQnecCtf zpIxT0aS!dc8XNb~KGE2?Up5Hi1l=3=%yKn0?wdWPv2kC_r?GMW>vW7GbZ^`PyF_E- zKG-IWjr(2y(Ac==H4uAkbZ^}ED$&@uul0M4$(w=VQ^S0v!slR|qWk13g$p!p()dY@ ze^af@PZ_W5f1~kD8k6S(#li8)oV*_>N+&2x9uO2COAI~}H!J*ejB5;kq{ihMlUD@A zry7%I1VsVHJ=!Pl2#R+!Ubj&~QJSvIn}4tH&oUJL{vL%lYfRn}6lYzi%*kVd;$e-+ zYl33vWMxjC6BM^<{Hq5QKBO^uQBb5gm3{K0pm<7S@}{5|m#NI-A6EE%jmfiu;^HaF ze09CTf6@43jT5FSbMm&JSg5ga|LsAIjr(h#YfK&(6jQU5d-B4dxKm;wjQeBTH8$>Z zeW>jl_&aTG+%rp>G`Z`(s0=tN0rC z$QEiG)1bn8N@Mc$py)nB*(YxgimNpK@Xrdrt?`pv6dszb?Du;{;j1+^?uR|1F?obg zL|&xqlUE4EFEzgDIfb9r`0Pf7d(Bk#uhiJB@d1sG&r#;{w<-J2X)Jk=K1~A@G?qM6pcVZ~Wxr~#GQUvcZ5sExM41o# zP?>+I@sxikeCSeT{-ee@^AsC3<9_`W#8Kcm(xUADnmAhV?V-*eG$#KZiUy6z$A{uC z8k3(7#d{i)uMfo+8k4^dMbv!dKl%JnoTM@N{ZI_mn0$XIF3_0#e<-pwCLbV*e2vKu zh@w(s@&%%()|mW(C^l$JK0y=@Yn-m}HjT+Qh~jS=lYbC}Ph;{CqWDf@@)M%yXNY2o#^g6dF<)cy9iqS%gDem7AELNkWAY)QxLsrNBcganWAY`U z*rqZ06H)Ben0$&TKGm4~iYR{6n0$*U`Ycf4lYbG#*$WgVA0vt}3lt_lBZ}z@6eeFI zio6Bdy~dRqlg|;wjSIAYKS(I<)R=saC>~v)%*p?V;>86DlMfQbTMHB>KO~CJ7br}= zNE8vd3X?w)ML&(nCy8RH#^jeoF-~LhO`@2o@hciH)R=sfD6Z6){FEqur7`&`QQWQZ z3XPxCn0%HfUe=iWmMGrSn0%KgzSNlfmnd*zE9(RKFj1VMG5Il3oU1YUGEq#_nEaV2 z<{0iZzT9xH@9ka#Jn;A`lRwM`jSc=SI4zdu27j2dG&cCcI5jr-&bT!;_|IIYvB6j7 zPZ}G1Xbxy>@Q3M#c{$@_@RiBd*x)O3lg0+$ng=yD_|^PFV}n1R48!5?Rg#s(=u)cS_Oygx5{|2~M zFYpf2_+E`$HGYgZ9(=vXEF7Xq<9jv!tHzr&{#fJ98XwZQUgJKClz)vHN5RiHcuihy z6vOc&uJ0?M%rIf|P!-jl5GqZ(f^Lg9THZ%I`6xCrGxdDBslqb|eSrR`s?@fjN5 zsxf)iQ9Pva1|vNh-=gsWjaO@oV{7UEeHx!hjQU~lkr=OWqrR6<)~Yl&_@-QGU|s&} zG&cC*JgKq4$E3x;+I}|_DE%||beyg6cpct_8XJ5I3N<$PtlVYT*L*MjuCa0NpO0|S ze}m7$z-WaV4L%AQ*J<~B>xuRaz9vs9WQZIl`!~q++yHQW$}xLH8%Luykg+bl=-I`8~lc1 zW0ijfznJqiHuxv}Qscw}%Kb8p4SqiB409d+PL1m|Zq+z`zjA+0cO9Pg&!uslwtt<* z^*X-yX>9PXc-gS8-ADCM{u%sa#%XNuAGy-NI(#z8XZ{)dk$!fZ!Uq3|$r>B{Zm!VS z;1@zB{&b(HdQd71XFNt+w|Bi_{5 z;4g7N+t1eaqmNhVOVzj!G5k09XPl+6!9QcP#)C(z{F z#s+_l>oqp`Yt(6M@aMQ!V}swuV;UR$Hg;%i@Yi@-V}qZ^0b-P&d<+B94;sfB=|$Nf zx#(q;I74A*DN$j=kJ<3oHarqx!LjLnx($16_+}g4WW)Pxm<+nC{!g>v-`Vg!8&1Nw zVRe6{4R5#M*gk>whuH9?HoVe?@3rAAHoV)057=-7#${`K2iWik8&0=jmknPhag|v< z>ul!F*>H;ux7*xzJCX78``1fiMp=o$3Y+yS#b%yq!=Xjo(A~)#LXFew^bzj^7jbZNcvu{GP>+ zZ}l|dw-vu__-)7UdHi0)uL-}G@FSD_zu@-@ey`%U6TjE+YsPOEetb3JulT)z-{0`t zjo;t#+k@Ym_`QYS+xWeM-@Ev|haVr8*o)r>_AN7CA-=7i23;6B8@BhcLUruXKObsx4vi}Uv$n+OB4x=A3ogHRBWOdg;KV(|zq#v@{>8Kwv?HqPLWOZrj5yI$Z4VOpK4_Vz> zLJg}Qvbz0A`yn%+F8U$UUYGrlX)~OD$g~_@KV(?9_d^zae?Js_BUiZaL{b28IyFps zbb;^d0kbT`Gg?Z|yl$&t;B8!`XUkjZmF4*@+yv%RT$aqXX{gM$F`+@9YVZL) zHr!_{9C2_h^!b&u_-+K__jMjWZ-?Q;T~WqncookQ{1gEi`KyZ4%5bRT&_* zN5HJ61Gkd-hQ;iNSi=NxusM3q{H$w^)-Masnxpk9fLYDadS-H|Ia-fQ_B6-9qkQh( z7@PtzD?;aDXGmkQ5GE&@E?h_!G=4km3S_Xsyl4ED0{Q>?_3g}PLYY)r(x~m*T7aE{ zu-}&ejx^8?WJLoF{|14Te{lwb^c#iBH*F<|ks}=jatRK}Q#ja~T$Y7kCM<1+3Pv(3 zgDIJkb<9o2Fi~uDG_vx~(OO(pD8@Nj!^Sa3>l&M7|0dF9KrxjIZ^|aP_f7{kmikJK*}bH9 zM#^AILz#CR6(gD;=FX@gx`P;5TvXx7%uY(>OPVh5ohzxpQ>KzrX&~#loMac6&)FK; z2(Wzt{{`2P%_YE^Ezy-(l$7Y-qJ>{0i@_KsvnT_mBVF`-WLa)edFIrjoY9N{#Ppn0 zS7uHMkhU_xl{pnSCqr22zk8oVnqrxd~GA}b3EFyKfp0}~hINk|7|2@~if zC&|^Nlf!foXq`bCaWXn`^r$Q9wtU}Mvj=Ax0q-h047Kt z@WWE2iHTfpu@?`gl0o~?l&?$HkWPwtRA3RO=^|#)x{}bxqJrtTXtsx$s0KMs*Yq3| zx~vhBts$(#C+MSkj4p7a_LnZt$fh5dR5D$P_bx1CS7yj=dU{fdTCU`Ju>g^sk~xTl zY7JmFXcR@z+$s^l1o3T5v@>qZKot!u!vnIblbk5Z8G(H8Hy9%)tO3JH7g;jGpCy{D zV4{BoE(I~D&?f(%5&_~l8h-07z`DIQKZXTQgj8X>0rA zms2vMB}iwSn_%o_3qkj2&UR7l)XWFd7qw)Xs%O{sWG5x5eOJjPTk#=JRvfeajL0)E z3jo`3&J)1cG6O9N^YGEu%uBMn!Ias$PZL%s%oQ1o%bmX@7kjo??Q|4gII(7*q5LzG zcnmy6=cFUK%!6r_y8!0}i;mu3j&91|MK}~Zx`ZcT)~@5&xo0TX;1ft=39Xkr9Y57# zv&fkV=b4hC3@6|=W4WL8(>yf8D1yiJmF{w^=2Q@xiMD_C$z8V)X-y2Mrk$iU&|*+p z4P*V#n%x{VyXzwe^N|?V1zLAil!0$SW(;pG_7$=91j<#TZ8_ zym=V&@I*re7*B@?8@-&BG{@!{vs*pe(m@9tI-3J)qCJ~~O|97+XxeEu2U-ozW}7)m z+d@laZ!TSCbD(d@U1W2hZFb!O*=#co&St}c(WE#IhI~J#(;iy84lc${UFn`Roaqp| zR>cFp7|jt~G-{ce@gsy_dZxe~%kU;}<{SnAEIGz)_nBLy+qH)Ep2ytnj(01e4IqG0x*( z)iYK5zwS>#)8)y<7B!c5T*_Le41s~mhR*%nJRJAopA+CDTl}Ft3u{`M1U>OI zN(H#EICqhH=gHbkQWT+*jDSDAGRVL<;S7=)pthnimY|u8w61v%)1Op5KjPy{{$3RWbRlpStrQwBXl&-?-~;bX0Fw_oYu)zwejeatD+dsiShhc zRhUZKo{B%KyYvj9dnH4E0McAuYvLx`V;)wjQAB_1EZ)sN@77Ipa{fJml;f9Kh-AjAQWZhLM3)rc# zRJg7xiX}!}WUR1gfXV^%U7QW$#jf1)+v**UGX{|KjsauFtroH5D>plS@uIg8gEqi}}{@6Y+i zTrPyv1VIvRbb2+yKJ`2tr}l~5VYm%rKF0-tB^6yPRmiV8_@b==_BRTjIF{3e%x2;o-XsC;q4pW;713_*jF(c4|+VTcio>zbegsUZ5r!*p!R#lv$QPNoFUCXSdU z2DFpdy}{bWKHmrqL(SY|hFR}lg!>?IhNNIo1bC?dAsV&AelVD(=uGiqVP>{kpd4W` zG5MLGmSY_S#WLa&-CKq;3;AXdUqL+Kiz5R@;-%%-nIUD3?8elt z+mY2Abla13OaeQyBOin0O#n6Eb=>tyb6e*ZYG36DGZ>ZE9Cg*M3mzV_EII6(S4W;& zYe?q!-cfC0JvN3wHas-|vMybYf*9q>>%2}_2J4@uB3QD>7|;;Vv7VH4R4cHB+~I)u zQ$z#Pz{A|)#MXBX??qVhDO9CBCK-l`#d{QT8mFqTo?q!%dx$E0%)>P+bWq=*g33qD zMacwh;dWTU+;$72)%$(tC=}$q$_`DZ2|*$e+H+&=X5^U7^FU*Z=Z1kUEWZg<;gECbNFEM3S7SBW zB!7e%Vrhxm&~=r9RR^Z(E>KD>Ir=;@7d#UuOqx0~j#w&6ueQ!*%q2nk!XH8F%2VSp_z0*f&?*CC4BE|#qGcckM#fhB$44Inb;#)dPeoq!8>0%aMNE?=m6S=t+DU{pb*d>K1;iTjc@e5JxNy#DN9HNwyMg(Vi z(ufdo9u>mgs8IHTvot9sM4UsEe^N?_IEN_iq!8tuloDLUl2StCX-bIrjSdmN(ILum zbcj3{9U>1#2UpRg(ILuwbci^Q4iUf95aEWXx=A7GZgOI99wa9QhmjnjP9`S>$1gcV zT}uv8*OHS%gfSwxe3M6{urmagJ7e=j?P;6qrvOvV-F~7Ahl&NC84U~}f%oBT=2-Iw z?|%ox)pi@s<{k;L+;_1VVyp@4rislN#(5ss37X$6HUw?PC!@Nba!|WLShV;LD6AK!>1?cfOUeQvM^pQZ%c3BLJmvxACfJv<0B<=Q3mjmAKGJc7`>I&$w< znr5XImoCb3SGtSYwzAU9S(JoHBf+EE^2UqQ95pe!un3%{VLd6CJle8x!DJe^l_;$d mbOH{}YKKPYjYe;izqr8dCassZ1e6L=e>8bNXO%7z;{O2g;?Udx literal 37520 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 From ed7488be9278f8bc692e360fa45127a43fe97506 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Fri, 20 Sep 2019 11:56:36 +0800 Subject: [PATCH 084/431] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BA=86=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E7=AD=96=E7=95=A5=EF=BC=8C=E8=87=AA=E5=8A=A8=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E8=B7=AF=E5=BE=84=E4=BB=85=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 144 +++++++++++----------------- Debugger/debugger_lib/libpdebug.cpp | 67 +------------ 2 files changed, 58 insertions(+), 153 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index cdb938b..9d98fb3 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -47,7 +47,7 @@ local consoleLogLevel = 2; --打印在控制台(print)的日志等级 local connectTimeoutSec = 0.005; --等待连接超时时间, 单位s. 时间过长等待attach时会造成卡顿,时间过短可能无法连接。建议值0.005 - 0.05 --用户设置项END -local debuggerVer = "2.2.20"; --debugger版本号 +local debuggerVer = "2.2.70"; --debugger版本号 LuaPanda = {}; local this = LuaPanda; local tools = require("DebugTools"); --引用的开源工具,包括json解析和table展开工具等 @@ -133,7 +133,6 @@ local stopConnectTime = 0; --用来临时记录stop断开连接的时间 local isInMainThread; local receiveMsgTimer = 0; local formatPathCache = {}; -- getinfo -> format -local completePathCache = {}; --format -> complete local isUserSetClibPath = false; --用户是否在本文件中自设了clib路径 --5.1/5.3兼容 if _VERSION == "Lua 5.1" then @@ -656,7 +655,7 @@ end --return:nil(error)/path function this.genUnifiedPath(path) if path == "" or path == nil then - return nil; + return ""; end --大小写不敏感时,路径全部转为小写 if pathCaseSensitivity == false then @@ -697,14 +696,6 @@ function this.genUnifiedPath(path) return newpath; end -function this.getCacheCompletePath(source) - return completePathCache[source]; -end - -function this.setCacheCompletePath(source, dest) - completePathCache[source] = dest; -end - function this.getCacheFormatPath(source) return formatPathCache[source]; end @@ -851,20 +842,20 @@ function this.dataProcess( dataStr ) this.printToVSCode("dataTable.cmd == setBreakPoint"); local bkPath = dataTable.info.path; bkPath = this.genUnifiedPath(bkPath); - - this.printToVSCode("setBreakPoint path:"..tostring(bkPath)); - breaks[bkPath] = dataTable.info.bks; if autoPathMode then - -- 自动路径模式下,要清除路径缓存中保存失败路径 - completePathCache = {}; + -- 自动路径模式下,仅保留文件名 + bkPath = this.getFilenameFromPath(bkPath); end + this.printToVSCode("setBreakPoint path:"..tostring(bkPath)); + breaks[bkPath] = dataTable.info.bks; - --save + -- 当v为空时,从断点列表中去除文件 for k, v in pairs(breaks) do if next(v) == nil then breaks[k] = nil; end end + --sync breaks to c if hookLib ~= nil then hookLib.sync_breakpoints(); @@ -1401,12 +1392,9 @@ function this.getPath( info ) return cachePath; end + -- originalPath是getInfo的原始路径,后面用来填充缓存key local originalPath = filePath; - --如果路径头部有@,去除 - if filePath:sub(1,1) == '@' then - filePath = filePath:sub(2); - end - + --后缀处理 if luaFileExtension ~= "" then --判断后缀中是否包含%1等魔法字符.用于从lua虚拟机获取到的路径含.的情况 @@ -1418,25 +1406,44 @@ function this.getPath( info ) end end - --拼路径 - local retPath = filePath; - --若在Mac下以/开头,或者在Win下以*:开头,说明是绝对路径,不需要再拼。 - if filePath:sub(1,1) == [[/]] or filePath:sub(1,2):match("^%a:") then - isAbsolutePath = true; - else - isAbsolutePath = false; - if autoPathMode == false and cwd ~= "" then - --查看filePath中是否包含cwd - local matchRes = string.find(filePath, cwd, 1, true); - if matchRes == nil then - retPath = cwd.."/"..filePath; + if not autoPathMode then + --如果路径头部有@,去除 + if filePath:sub(1,1) == '@' then + filePath = filePath:sub(2); + end + + --绝对路径和相对路径的处理 | 若在Mac下以/开头,或者在Win下以*:开头,说明是绝对路径,不需要再拼。 + if filePath:sub(1,1) == [[/]] or filePath:sub(1,2):match("^%a:") then + isAbsolutePath = true; + else + isAbsolutePath = false; + if cwd ~= "" then + --查看filePath中是否包含cwd + local matchRes = string.find(filePath, cwd, 1, true); + if matchRes == nil then + filePath = cwd.."/"..filePath; + end end end end - retPath = this.genUnifiedPath(retPath); + filePath = this.genUnifiedPath(filePath); + + if autoPathMode then + -- 自动路径模式下,只保留文件名 + filePath = this.getFilenameFromPath(filePath) + end --放入Cache中缓存 - this.setCacheFormatPath(originalPath, retPath); - return retPath; + this.setCacheFormatPath(originalPath, filePath); + return filePath; +end + +--从路径中获取文件名 +function this.getFilenameFromPath(path) + if path == nil then + return ''; + end + + return string.match(path, "([^/]*)$"); end --获取当前函数的堆栈层级 @@ -1498,51 +1505,19 @@ end ------------------------断点处理------------------------- --- 断点路径处理 --- @currentPath getinfo路径 -function this.compareBreakPath(currentPath) - if type(currentPath) ~= "string" then - return false, ''; - end - - local pathFromCache = this.getCacheCompletePath(currentPath); - if pathFromCache ~= nil then - if pathFromCache == '' then - return false, ''; - else - return true, pathFromCache; - end - end - - for k,v in pairs(breaks) do - if k:find(currentPath, 1, true) then - -- 如果是子串 - this.setCacheCompletePath(currentPath, k); - return true, k; - end - end - --查不到也保存下来,避免反复查询 - this.setCacheCompletePath(currentPath, ''); - return false, ''; -end - -- 参数info是当前堆栈信息 -- @info getInfo获取的当前调用信息 function this.isHitBreakpoint( info ) local curLine = tostring(info.currentline); - local completePath, isPathHit = false; - - if autoPathMode then - isPathHit, completePath = this.compareBreakPath(info.source); - else - completePath = info.source; - if breaks[completePath] then - isPathHit = true; - end + local breakpointPath = info.source; + local isPathHit = false; + + if breaks[breakpointPath] then + isPathHit = true; end if isPathHit then - for k,v in ipairs(breaks[completePath]) do + for k,v in ipairs(breaks[breakpointPath]) do if tostring(v["line"]) == tostring(curLine) then -- type是TS中的枚举类型,其定义在BreakPoint.tx文件中 --[[ @@ -1644,7 +1619,7 @@ end -- 如果填写参数fileName 返回fileName中有无断点, 全局有无断点 -- fileName为空,返回全局是否有断点 function this.checkHasBreakpoint(fileName) - local hasBk = true; + local hasBk = false; --有无全局断点 if next(breaks) == nil then hasBk = false; @@ -1653,12 +1628,7 @@ function this.checkHasBreakpoint(fileName) end --当前文件中是否有断点 if fileName ~= nil then - if autoPathMode then - local isPathHit, _ = this.compareBreakPath(fileName); - return isPathHit, hasBk; - else - return breaks[fileName] ~= nil, hasBk; - end + return breaks[fileName] ~= nil, hasBk; else return hasBk; end @@ -1890,14 +1860,8 @@ function this.real_hook_process(info) this.changeHookState(hookState.LITE_HOOK); end else - --文件有断点 - --判断函数内是否有断点 - local completePath = lastRunFilePath; - if autoPathMode then - local _, tempPath = this.compareBreakPath(lastRunFilePath); - if tempPath ~= '' then completePath = tempPath end; - end - local funHasBP = this.checkfuncHasBreakpoint(lastRunFunction.linedefined, lastRunFunction.lastlinedefined, completePath); + --文件有断点, 判断函数内是否有断点 + local funHasBP = this.checkfuncHasBreakpoint(lastRunFunction.linedefined, lastRunFunction.lastlinedefined, lastRunFilePath); if funHasBP then --函数定义范围内 this.changeHookState(hookState.ALL_HOOK); diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index 1ad5189..a58573f 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -9,7 +9,6 @@ #include #include #include -#include //using namespace std; static int cur_run_state = 0; //当前运行状态, c 和 lua 都可能改变这个状态,要保持同步 @@ -36,8 +35,6 @@ struct path_transfer_node; struct breakpoint; // 路径缓存队列 getinfo -> format std::list getinfo_to_format_cache; -// 路径缓存队列 format -> complete -std::list format_to_complete_cache; // 存放断点map,key为source std::map> all_breakpoint_map; @@ -394,9 +391,6 @@ extern "C" int sync_breakpoints(lua_State *L) { print_to_vscode(L, "[Debug Lib Error] debug_ishit_bk get breaks error", 2); return -1; } - if(autoPathMode){ - format_to_complete_cache.clear(); - } //遍历breaks all_breakpoint_map.clear(); @@ -467,57 +461,12 @@ extern "C" int sync_breakpoints(lua_State *L) { return 0; } -// 根据文件名,从断点列表中获得完整路径,如无法获得完整路径,则返回当前路径 -// 为了提升效率,此处应有一个命中表cache,表中找不到默认为不命中。 当有新bk的时候需刷新命中表 -int compareBreakPath(const char **getInfoPath){ - //遍历断点列表,做路径匹配 - //检查缓存 - for(auto iter = format_to_complete_cache.begin();iter != format_to_complete_cache.end();iter++) - { - if(!strcmp((*iter)->src.c_str(), *getInfoPath)){ - //从cache中找到了 - const char *completePath = (*iter)->dst.c_str(); - if(!strcmp(completePath, "")){ - return 0; - } - - *getInfoPath = completePath; - return 1; - } - } - - std::map>::iterator iter = all_breakpoint_map.begin(); - while(iter != all_breakpoint_map.end()){ - //curPath如果是断点路径的一部分,返回completePath - const char *s = (iter->first).c_str(); - std::regex reg(*getInfoPath); - if(std::regex_search(s, reg)){ - //命中 - //缓存 - path_transfer_node *nd = new path_transfer_node(*getInfoPath, s ); - format_to_complete_cache.push_back(nd); - - *getInfoPath = s; - return 1; - } - iter++; - } - - path_transfer_node *nd = new path_transfer_node(*getInfoPath, ""); - format_to_complete_cache.push_back(nd); - return 0; -} - //断点命中判断 int debug_ishit_bk(lua_State *L, const char * curPath, int current_line) { print_to_vscode(L, "debug_ishit_bk\n"); debug_auto_stack _tt(L); const char *standardPath = getPath(L, curPath); - if(autoPathMode == 1){ - if(compareBreakPath(&standardPath) == 0) return 0; - } - // 判断是否存在同名文件 std::map>::const_iterator const_iter1 = all_breakpoint_map.find(std::string(standardPath)); if (const_iter1 == all_breakpoint_map.end()) { @@ -703,20 +652,12 @@ int checkHasBreakpoint(lua_State *L, const char * src1, int current_line, int sl return LITE_HOOK; } - if(autoPathMode){ - int isFileHasBreakpoint = compareBreakPath(&src); - if(isFileHasBreakpoint == 1 ){ - // 本文件中有断点 + std::map>::iterator iter1; + for (iter1 = all_breakpoint_map.begin(); iter1 != all_breakpoint_map.end(); ++iter1) { + if (iter1->first == std::string(src)) { + // compare() return ALL_HOOK; } - }else{ - std::map>::iterator iter1; - for (iter1 = all_breakpoint_map.begin(); iter1 != all_breakpoint_map.end(); ++iter1) { - if (iter1->first == std::string(src)) { - // compare() - return ALL_HOOK; - } - } } //文件没有断点,MIDHOOK From f52590ff9fb5b259e7d9f35cfdf27df40a48a08b Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Fri, 20 Sep 2019 11:57:32 +0800 Subject: [PATCH 085/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=AE=BE=E7=BD=AE=E5=90=8E=E7=BC=80=E7=9A=84=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/extension.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/extension.ts b/src/extension.ts index 8c1cbc8..08b95fe 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -125,6 +125,11 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { if (!config.luaFileExtension) { config.luaFileExtension = ''; + }else{ + let firseLetter = config.luaFileExtension.substr(0, 1); + if(firseLetter === '.'){ + config.luaFileExtension = config.luaFileExtension.substr(1); + } } if (config.stopOnEntry == undefined) { From 13df65f7888c4ef4e6b37a13fe0469b6363bcbda Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Fri, 20 Sep 2019 16:23:18 +0800 Subject: [PATCH 086/431] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E4=BA=86=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E4=BD=BF=E7=94=A8=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 9d98fb3..56c3975 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -93,7 +93,6 @@ local DebuggerFileName = ""; --Debugger文件名(原始,未经path处理), local DebuggerToolsName = ""; local lastRunFunction = {}; --上一个执行过的函数。在有些复杂场景下(find,getcomponent)一行会挺两次 local currentCallStack = {}; --获取当前调用堆栈信息 -local debugMode = false; --是否开启调试模式 local hitBP = false; --BP()中的强制断点命中标记 local TempFilePath_luaString = ""; --VSCode端配置的临时文件存放路径 local connectHost; --记录连接端IP @@ -697,6 +696,7 @@ function this.genUnifiedPath(path) end function this.getCacheFormatPath(source) + if source == nil then return formatPathCache end; return formatPathCache[source]; end @@ -1707,7 +1707,7 @@ function this.real_hook_process(info) --如果当前行在Debugger中,不做处理 local matchRes = ((info.source == DebuggerFileName) or (info.source == DebuggerToolsName)); - if matchRes == true and debugMode == false then + if matchRes == true then return; end From b7a6809427f206f342e94cf9663ad4f8dd72e221 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 8 Oct 2019 17:37:36 +0800 Subject: [PATCH 087/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0mac=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/debugger_lib/libpdebug.h | 2 +- .../plugins/mac/x86_64/501/libpdebug.so | Bin 118016 -> 37040 bytes .../plugins/mac/x86_64/503/libpdebug.so | Bin 118144 -> 37168 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Debugger/debugger_lib/libpdebug.h b/Debugger/debugger_lib/libpdebug.h index 8307856..13b649b 100644 --- a/Debugger/debugger_lib/libpdebug.h +++ b/Debugger/debugger_lib/libpdebug.h @@ -3,7 +3,7 @@ //1.使用源码编译,要打开宏USE_SOURCE_CODE. win下要设置LUA_INTEGER和lua版本号 #define LUA_DEBUGGER_NAME "LuaPanda" //debugger's name in LuaDebug.lua -#define HOOK_LIB_VERSION "2.2.0" //lib version +#define HOOK_LIB_VERSION "2.3.0" //lib version //#define USE_SOURCE_CODE //using source code to build #if !defined(USE_SOURCE_CODE) && defined(_WIN32) #define LUA_INTEGER long long //set LUA_INTEGER. In 501 is ptrdiff_t. 503 can set longlong(64bit) or int(32bit) diff --git a/Debugger/debugger_lib/plugins/mac/x86_64/501/libpdebug.so b/Debugger/debugger_lib/plugins/mac/x86_64/501/libpdebug.so index 35dca67ce9dc6e8e37c8fe0325be62c5ad3ad3fb..653ecbb0075c76620c3508a93ecbfcd2feb73c53 100755 GIT binary patch literal 37040 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 literal 118016 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 CrJ;KO diff --git a/Debugger/debugger_lib/plugins/mac/x86_64/503/libpdebug.so b/Debugger/debugger_lib/plugins/mac/x86_64/503/libpdebug.so index de5d29575b5ab62bf90baae552d276ab0add9a39..77d2035f5397a3ee4f18cff19d99c49e3f1fa12f 100755 GIT binary patch literal 37168 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

Z&AG6Kt#oXVmabg6a&iru5wOy<&VEhLgJ!5xAG+ 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 G9QfZ@SbRkQ literal 90112 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 Q-QRlu-uscz|7Gg`0BmWFs{jB1 diff --git a/Debugger/debugger_lib/plugins/win/x86_64/503/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86_64/503/libpdebug.dll index 83ab7e5a817f2e519f4e7214b1f0476bacfbc9ae..358f73d562b0a2dad0ed28539a3dd6db85a92770 100644 GIT binary patch literal 46592 zcmeFa4SZC^^*?+!$%Z8mc6nJyKy=YiqX-59nh>J9B*D9|!R1vHFbPQ@(U7dkE^i71 zH>oVwt<-9@tyQeHMXMIy5YX1}ViE);Vk=Nv1W83)h1AN{8_neu#y9r=@KF|O8 ze4gk3c`l#LnK?6a=FFLyGiT1sy%gWDRY_D7B?-SsL{WAD(&Oa6-~Hz_k_TO|XOQw- z|JTOsGI?GbGry|3!Qrc~TTx%O(otSkTU+OMEUR?X2WlPFwT{AT=Q&o^Ra8z$O-;#= zq<_J9m8-vfMq)2X$8 z1`NC#S@U;>CmH(Q?Y~yUKj-+|>hdb8!)TGWNKq<&*iSii!vjkVT#s_0V?e?nMOg)m zDzKRpwsE-8M1aBxijvHz7*uRXB_ZNTP)ZRIg$!_JTwuJNLC-^JZ_z}G!fIl|;sJ*fs2=U`k zl+p?H6=nW1MVT}XD9}_c!*3maagP(jW`fA3I8u?&f*)k1{06_c$BC2)K9P~z*nva~ ze%s?RA?PG}E0$MRG>GbyP9TZi4*cRCC*`Yes4oYOW!HlM<$DIdxW~!)Dr@SHk!7hs zFqDr4AIpe*(_^v!vqNg|<4k>pM^Um57G<|&A5}xCT`ytuhf+TR(3ch<98O(@A)Jr2T^0;luk3 z!V=*L6=tM)LY@rAyafxdLv1;3tw#;lWUNuOzo^<5`iqfBL=DwsWO}sMJ=%V?tuVtu zU8ZWsRL!CW4<vAzStV75q8fnyzY}f`~gbtHm9f*Ipbd=zu`l3ev2^ zN@$i%4c?k&t2e7!Vs|2_Z?>r6TODfKH8R7s$gojl=tmjaT2U>oZ)lpv`6hgI#s0@p&xPLx~QOLs53b6I$P1xOx4qqVP3oYS_LC1l4fy zE`7mx=H0w>4-i_8ns?gT^fq*?8otiK8SbIRYsKxVwpTsXp$1QztUr8$GhA;{gI|4X zy<;oIa+h{A4E7+8_9hp5?J7m-PFI`X4veO%)o{@+HMqXRrdkV%c5O~$ip_8PGkYhr zCRtL{(9%BHTa(hjLWxt=MyYuvPHR&;^d#EWLu~_fy|w7L;@Xvh7@GFtMgqmh^>y4W z;RVN;p~Dlnp+!Atf~~$#jkJJ=<7z(X-ukSQdoQpycM@66bz05aYYiTz$hdYj_=UxK z`!0$Ezqr_X$8R}LyWYP_b4JbWW+ zKBK9mv(ePf4Ftf!U058pszy`a6Mgz!O&uT4LV7$4<|qrFCxW`xuAdJUv{{*bxoAFU zZF(1aJlJKjHkDD}3llM8ZR!Mfu3c$@#|OZp{+~xvU%UJ5x_Z+`|no~_%jkFTpJzOISUx*W2uA*idX8iZWC zMu_%3x*qMb_G({Q?|R4gt=D?H9Vi}hUnG!>Wjp^t5u=@NP=wprf>4)`>0nW38tUZc z-gim7T)TJ_XhwUXOM180diyVd;(C7>UvDVB-axe83WU0EcI`S(R2sZZR(fHtO8xPb zo_$_<;w#IEuPh^4*-*~Yu0Oq)YMGaX=IzqcK)bK*8Achyw?OxN3*B>?WSbi>bkAE{ zY|d0LK2mKy894t;-Q(PhMF;Av`Q(|(#{}gQI79g)D~-3ND*=zH71$crAatRs9alAl z!&g`@Xo7r*PXp)wyxW1i7ET|k<}I=XQaRPhDF44GLVBz@2cxxdBPgn>c8#DtQq@iy zv?s;FpqYU@g60V81x_qTYnU!_$LKdLx6(<>=WQc0iF}!NdbN%z(WGuFTjrl*djnsfZGHJ2v94)3IR$5xL$y{ z0?ZPiP=I^^t`OjI0urme^l35_HqOUF7JeWD%~9Oi;!L;Jkmc5H zg~|1ISBZTHd8toQu+98906qTm)zFd*48wH2gzCu~ zeJ2+@6!=)xkO0F5=48|ufz3zsms@L7n_y0SX8q^Ei2ZJac42-&4I!(j-~Qy&B;z}J zB?)^H<%9V}NKpKP_fWBjy&aiD=G*c2%=*~=b8tr3ZxQ-v;`7dc_Z_xuh3b|uf> z$lk_j7A0^hlsW}`oI#>j{SS%q+s|J9&p@A1-bpsQmn_UIVKgquC{;uLj4HC;KT%=W z=S1wkMM>>6S<<1=vrtE&c8CmGUk;WPGUH#5*yke)j2kMgp){MZG;WAL+0F0$p1OGe z%ExgLvQI_H=A-_rf*+aulj+aM;FqR=yD&UGxd=9T*uHic#1R=g9r*;J3W%bxD-p=? z0@uu?F9e&W7iU=J!+^a zqXls_T$rI!q@5yYWvLZ`Z0vb%%UI;xd|QU<%*hLw3$?cHRClmF;*PXT&zY7OIK}%8 zPll>DIcU7LHDxrSAQh&fYg!94s+7j7pqkX+5jp?b8mC=_`RCEvR1JoMC!;kql#7l|0iTo8tiHLh2Y*3zLUB2U`57uSKl!W)$D%kaeg2#`^D76aj(LDGc^o? zrnmzRn~42sAFWf7eQL;_Oc_E{T7@n*xoEOMG#_I5!DPb@QVxnu2WYU+8W6vCWc@_@ z!}%_;M+{dzj7?$>wYIJ3g|loDfBF!Tc$0XsNBbgTe+m^9YCWN%yD$$o!Oi2=jzC{y zR=I<(MO@mSIqraB3Z6FmuL$N}hM;0?x(U0=VE)E!7=+flmLd{25N8T9dcqYLfi9#$ zW3B?upmrhZG{UW@Nm4$FASm0I@>oGRu{Y%$NqPGeQ2vm%o0|Oz6jQai7D)GD1ohiS zQ`~$np=n9f%v(4}$VP#*6=i?m35{Kc7&osPi;N5X{4K{W0ve;W>0;2g?z}A{i)P32 z<;MIFYmLZiBYIkoCsdJ<;|W#Xq1R2MS_?C=)q3bHnlw|9Ar9)xpm zeM}%`l%Xo511bNJUR(CWA{ZvYin<|dTEyowe18PYKxA~XxY=Bd`A50&P( ztxZcYUxVG)wS9$z;8!MV^YhsBwH3Wf8bzC*F&S2LKYj7P;c9@T8ZP=!&D-yq^E{mMbg0^^ z`a#V5zPt(F!H4=72hW0{3*xux{d#THzkx8L`=&062y@GN`=2So`=$e&r(M5MRCR$A z!-&?ReoEJ~XewF^NzgF8{FYcx-1=xQsb)MzHN{D_0O^f+O2AyK9q2AE)?UF7Da43^ zCTg6Ps02=S&n^sAz6+`cG2e|29ow7g>)ZQK{nsOLR8v7UM$Zt-KTy7!!U25K6{N}t_j`dSWwN6$;MfZ8aMfZ`q%h8YL zQR`I)4P6KM@WKlo5-Ed7qiIVY(u&><6<}*U3mY;T2km}qvGy7U9kPC?tJoUGhTElR z0!Ge7AHf3tdEOd)_090iVI%W?}AF9 zR^^$W2Q~jeFeV)t3I2 zs`G>!oFv#BPhO9;DTL8PYeo<2BJ`A7J0I)n5fUv_6(v1SEeRE%|BCK#hh_jbT-9b; z8rNbMc(tmTxKpjx3s6J5(TSg{p%j@9V_xhNv7@H#VJvLC{b;F)Lozz5vZcy7mPKtm{|2S6y-w z7RQKvfdI1wxCUTr#O@TaTmdEtFpfYl|0f{DmeEH)>uVWRuVh89-*P$lr-9i%{2Y89 z!9XUjZH_(>d=_efySf@dHezqBX0BcqV3z<-6QE47u|Hv(sA|SXq%`e!V79BUee;6( zpCOnSm=w&v6j>DiC0G-5@|cnxnxu7f+k&SPIM6S6Ix&!j~cp zrXaQqbHHw>2v*gbG8#lq22yZI3E0pcl$pSnW2vl>2Ikt`lfvLE3~Gqh~*(1^ZnqMKjqH**4p$K zPr7TIY!+(AwFNH}=B!N*jD$YOox}Rw&HDWWOn6Em{eB$!eV$`Ita|82cwZ|)qcHc@ zOl$KyBysYkwH5tGXx;T6qN-!YF-ExfnBEK_!{RN5s#yOY8@wUK$D($8HD(y~;NI~h zFF(}fyWOMNibp4VehFJaEQ{Rfmmv<*wdg;rbG*XQdQ1v$8k~;gDOtUoWyk(blHCf9 zi=~@ncOA#2r(~wc+^+xf8kShJ4Xs7Tl&(!^T=3RRQ{a}q&2#O-9uW<<@5VgENIItb zfPj0Py^6>5eWV3?wK$kx3=O9EM+NgAy;o688;86IAu7Uy^142892WVekq56m5XIY?TY?m&8I^hF5gjt=9me^l=1f82wqIg~iZ)awwXOBoC0F5-Sn4A)MiqHFn^JAE^=asq;3H< zUit0!OS;=37_GHCfm+_zK_K?yn)!3ud1xnsr;`E;v>}>#38)3XObCo680wQ zWqC1!}g#+L?g=Tnp(Lg{&Mg^Pr9L3c*Edz@OI;(rQ zSUj32jnus+t>KqWlOp<<7RL64E|!5^RCex?y-kRBa`+ zvp++H)#%Rqx5qmD6|xuy=qtTwTMs&AD9~6hUXOJ5&pwH;(|TVk(W;-}4qsy|6O&GY zNtjrF1WRz(W07dH1|O%$xYKGd0u$?}6bVLPVl{J~(=^}qOb7Dp4Q@VZZCa0AIH|fBWA`+0Hp8K!*Sa2|!|*-2=GyIB0$` zL4iPyp_e1}D`6?H-t%BUK=HkhPpy6+gU3toKv+i^uoQ<%xDILjJe--PU zR)jos77ougTmzV(DVT-1sW*al;0ny_FR&&RYp;67wa58CurE@`-)NEk#un*sv^M=4 zlRr0Aq0+f1{VYnmwWDw+utUc1$Dq6gza(4Hxb}brnijswz(+-ND*Yq~1iu&%NTXs{ zx0XTAKZ`vKGEC~)%8BMcCcB{NK8@JFgH#G}KeaF=5*Pq^B?mt4DknX}%b*yG z2PTKiU;TtInIZFA2*?I#r^tZF{#P)+6xk92S75?en>K-JFfSpH`3JO1X*2Ie0eVo= zr)9>PxV===x$7ci{?_EbHu#OnKU2~jdKz>S(Ll8Ah&~o(O84a$PaklZSq?pS7E68< zoI-)&n)w5$j9|;xk6~IzXdU&SLhN%;He%PYjKR`)Afr*CK3{BeYd5148ywi&WYXs5 z#+c8a{O_bO9W-&<%m--u2!x=t0bcM~z_mmuwCgrjf`g8IDv6gSrpS~v>JI7rCr z1k#3+G%temu-_l|apZZDc0#{9kqP{rrYBa2i?NIynoH)9= z3+cvDnmj{L!{+`LV!=EWj3V}SKaLF(v0sYVTeRYa%@>H+4yrP2elMAGek#&_B4VVU zkX9sO!$qv0h%FMa-DWN~UBomIs}NN3MQnqJMQB8Z%r=qpX%V|n#O8_Eogyb+7r{6q z9TPUcK%xnmw~5$V5vv!mJP{j)a>n_Qs-=Fjl?vK-mXi5%dJ!U8YL~$60S?51C?2uD zBa&VhNx$dp2L*1A!2M2Sr_&Yqw?)!JB59jQ+RaHn5lKxV>0Xgk%SmfQQng6hB9b&t zS}Kxei=;b5l7(5DE|RiE(rqH?UQE-7{bG@nCX#LuNw0F!K#}y#UEKcVBIy`n5&I|C zu^8SLNsC3&2b}blNNN*FUXfJI1YZ` zNq2G5CkwgbZ$Jd2;cb!QYb0=*_P0hUhhXCZjXv!!BCi`f3 zrX^zELS?Z@4xWx!n@F#cUFaYclEcN?BlbFE!IW-bdkUvX7@7BQy*F}M+!|>KTt$u| zN_ijmq9XP}N&$KpQ{&m5%Txk?=pLuSFu`$_c?8;^r$FU(rx~auYE~%qUtmP zsP3HYe{&-DS9E=e*iUHGCW!h?67b@#FDS>E?UD3 zPCoJD$0^2-96mvm#_%bmaRb@n3U49qGP7ZZkdH!{G`945FhE1ft71qkq9Ij^dYmOO z+k#I0#1xx{d>95zdZGf`Fa%D&Ng31GC^a!xS&x^u+QyU zI0a+3lMI(z(mWy_yPWj-T#Aq5i>>5x`+(!p<#voCxbt}_X&~bkHQk^_#0HhA(CvXy zt%;<4<1Rz6JUkhec?+OBG8@;WqkSLIjbZICfpQu|UUEF4_490KxZVMi&7&1LNo8Wr zj)IfUDUJ^GBC3^EG^q?uGd}j1!IrUC_ z|G0x|(rh5FYWwOFi|J~*JTyvh(|rbQosFcN_Z7DMZM5aLy0tfmOTUv1*YlCoFc{t( z91z9S?0y({d0z>aaU53E9j!lp{s=wB``jB;ZB81FMEPF2iSMPWc|G+7jDmpstBJU{ zp7;8yiAE-Ic^$_z9u22S7{QnVxT@1z5$~ooEg1QB6;b+grgJDP z0w>&gEqtHi0&d*(*P?Omajm$tu3E{}^0z>)JDilG=DKX0?KEtRhnq%%^*CQWv-N1W@TeKBze2Wt0=NF8-%2AJ1K6#-rH>?M(Yb~Qn3F>U zL&bj<0mSq#&u5`D8-{pj!~|P#*(_o&D~1zz2#v~QRZGA%8?`L~?Zg1YObA^A!4%*n z3cL?-Rz)`$6QGqc)98ozOJbv*W3j2uA@=9vsHITsNQpfs4QJ@LFEA8T%?FwMt#Jd+ zdHH6E(1l0zVb~UJWgR#>OTQRS21H)hAD_V3&q(3<|DpzP�*O%36MZHYAO_7~$l z2zEV^HRd2Y>XBNZQjI!xh%YjIu;rP-gNewc-_JP9Ft(+LPz9 z1%{9h#L2ITxH-wMOH2!`1?ciadO7-t4wIdpJQ&Y`I|M^G#tZcm-5^>RYZ_6oh_{KN z(kC0o9=ZdR;M=&?llN)>?h3vv$dN6?@52ro@8+a0imxQq>u*DNXPZ_UB z8C}gVZa!$3g*4~CWF`0+*7S&d{7jnj=;3kuphQ4Gv+NdE>DE>2Q$m>&WtV!IS z*!n4K3fhp6O)+lyRxy8G*Z;)h7be8DS-O6by7h=&GtMv-zVc(ULrvf{Cw|_>=*Q*< zcPOtkU%-A3EOE;V7J;$UA@aum5aBP3Vf>#H1!wnoWEU6o#dvq}c&C9(h2)_or7B${D<9E%_9#&sCg=E>V{ZQhRY=c0^guO*P=4$+%p{nXq=mO!#6 zq*}TMsktL@mL5v!PV(Ruh)3(^&P@wsaTz~4>ecQsZq4M@4)Vp`r8romzUKJ*1hc=A+>wW$LU(Lbm+4TEu?M?31#{$g$3$=Omoc?Ye{ zucJY@bz?&oB{09$l?Jsq)7CnjUNbYPq3Nj6#NtX)LtgNQ>sH*ferg`tfg3iEJNN`T z56x6VmTqLk_1e&2T*N_sqMWW+oBzr6fK-|(Fi2e80mn^;7)=*>i2pA{rdB7hYXUQn zHQF3Pp9%2>h&ZUaSO_F7YHIVZP>#gc^#lUkk_DnADWV}TT0#k;Qt0aMXvt8~60eP0 zW`j8zLVKYexGh4%L)9DnJ}vka%s+|Dm=z zIB=a&3zO{+~L#|OWeSudBX!ErB^#lq8S+I|6BUN#odZ4c)I0N z(r<_KJAXie#qD9Jm^-AXFm^(b6ARa zx%dB?zVn__-|_0zSKoP6ZIGewX0yJVai+d&wKh{{NqskiRR*b))R#A+!MV4v&U3TQ z%c5?;yn_zJXi0sLGfWIz9@Tpt-RW+vKelpIYan&2N}D>vKG9NFQh^ZOST&a;xwb{^t6RC|RY9nnxW@Gwe-tU}EI?xLpsHSaRnAW&~bja7N z+*0oc8Bd-Ydhnk>NDbKH(KDf zGFrx(&8#a@XsCO%1kzxz9ziRG0Cyn~2i2J@25|Db^~A{>D4WMYiDcjP90J^;>qU!X zgP>1H>Ow1%ChXOsa;6h)5wsz-2*xV({2bPX(CSzcxJ^;R*WjD?+$1aN2GYdDI=D*( zRn~}3Xhav7tR;Va%$vg+(Zw3kM8n4uf(C=kXnor}GtJP1JokbAFWvIsZL(XS z6(OZiLRTkv5lu1SIFnYUgs#Jc6J6BR!s(({7L#y<=%@2C=q5{dCPuxm-}{O_i))+1 z(@_jpYSQ4i;pz^_2K8CD5Qa_JsyDms6BXZ88{DcPQBnB?^m?UcG<{ zWh;?3HW&%C-;fG4b_U5#3S7+l5^tDT*$o5h>&xybSZQ#E*{;6PrSAHjctzxK_0)&z z8y~58udW)dwzcuq12UoadSIF-%?wY&i`3VeR9q`a%0AhBg>lh-tQvM*jF;0_Cr9in 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 literal 91648 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 From c9d16d8f2d6c9e54f78a35b9ef0d2a2df30c5d38 Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Thu, 10 Oct 2019 11:45:30 +0800 Subject: [PATCH 091/431] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=BD=98?= =?UTF-8?q?=E5=A4=9A=E6=8B=89=E5=B7=A5=E7=A8=8B=E4=B8=ADstopOnEntry?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=97=A0=E6=96=AD=E7=82=B9=E6=97=B6step?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 2b5b295..1b6aa6e 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -827,16 +827,19 @@ function this.dataProcess( dataStr ) this.changeRunState(runState.STEPOVER); local msgTab = this.getMsgTable("stopOnStep", this.getCallbackId()); this.sendMsg(msgTab); + this.changeHookState(hookState.ALL_HOOK); elseif dataTable.cmd == "stopOnStepIn" then this.changeRunState(runState.STEPIN); local msgTab = this.getMsgTable("stopOnStepIn", this.getCallbackId()); this.sendMsg(msgTab); + this.changeHookState(hookState.ALL_HOOK); elseif dataTable.cmd == "stopOnStepOut" then this.changeRunState(runState.STEPOUT); local msgTab = this.getMsgTable("stopOnStepOut", this.getCallbackId()); this.sendMsg(msgTab); + this.changeHookState(hookState.ALL_HOOK); elseif dataTable.cmd == "setBreakPoint" then this.printToVSCode("dataTable.cmd == setBreakPoint"); @@ -1399,9 +1402,9 @@ function this.getPath( info ) if luaFileExtension ~= "" then --判断后缀中是否包含%1等魔法字符.用于从lua虚拟机获取到的路径含.的情况 if string.find(luaFileExtension, "%%%d") then - filePath = string.gsub(filePath, "%.%w+$", luaFileExtension); + filePath = string.gsub(filePath, "%.[%w%.]+$", luaFileExtension); else - filePath = string.gsub(filePath, "%.%w+$", ""); + filePath = string.gsub(filePath, "%.[%w%.]+$", ""); filePath = filePath .. "." .. luaFileExtension; end end From b09269a100674acf2181c397a2c14129f4fd59c3 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Thu, 10 Oct 2019 15:10:21 +0800 Subject: [PATCH 092/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86adapter?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E8=AE=A1=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/LogManager.ts | 3 +-- src/Tools.ts | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/LogManager.ts b/src/LogManager.ts index fe3525e..be1451a 100644 --- a/src/LogManager.ts +++ b/src/LogManager.ts @@ -27,8 +27,7 @@ export class DebugLogger { public static showTips(str:string , level?:number){ if(level === 2 ){ vscode.window.showErrorMessage(str); - } - if(level === 1 ){ + }else if(level === 1 ){ vscode.window.showWarningMessage(str); }else{ vscode.window.showInformationMessage(str); diff --git a/src/Tools.ts b/src/Tools.ts index 353de08..f22a3a2 100644 --- a/src/Tools.ts +++ b/src/Tools.ts @@ -78,6 +78,7 @@ export class Tools { //建立/刷新 工程下 文件名-路径Map // 评估执行效率,这个函数可以考虑应该区分同步,以优化体验 public static rebuildWorkspaceNamePathMap(rootPath : string){ + let beginMS = this.getCurrentMS();//启动时毫秒数 let _fileNameToPathMap = new Array(); // 文件名-路径 cache let workspaceFiles = pathReader.files(rootPath, {sync:true}); //同步读取工程中所有文件名 let workspaceFileCount = workspaceFiles.length; @@ -115,10 +116,23 @@ export class Tools { } DebugLogger.AdapterInfo(processingRate + "% | " + fileNameKey + " " + completePath); } - DebugLogger.AdapterInfo("文件Map刷新完毕,共计"+ workspaceFileCount +"个文件, 其中" + processFilNum + "个lua类型文件"); + let endMS = this.getCurrentMS();//文件分析结束时毫秒数 + DebugLogger.AdapterInfo("文件Map刷新完毕,使用了" + (endMS - beginMS) + "毫秒。检索了"+ workspaceFileCount +"个文件, 其中" + processFilNum + "个lua类型文件"); + if(processFilNum <= 0){ + DebugLogger.showTips("没有在工程中检索到lua文件。请检查launch.json文件中lua后缀是否配置正确, 以及VSCode打开的工程是否正确",2) + let noLuaFileTip = "[!] 没有在VSCode打开的工程中检索到lua文件,请进行如下检查\n 1. VSCode打开的文件夹是否正确 \n 2. launch.json 文件中 luaFileExtension 选项配置是否正确" + DebugLogger.DebuggerInfo(noLuaFileTip); + DebugLogger.AdapterInfo(noLuaFileTip); + } this.fileNameToPathMap = _fileNameToPathMap; } + //获取当前毫秒数 + public static getCurrentMS(){ + var currentMS = new Date();//获取当前时间 + return currentMS.getTime(); + } + // 检查同名文件 public static checkSameNameFile(){ let sameNameFileStr; @@ -134,8 +148,8 @@ export class Tools { } if(sameNameFileStr){ - DebugLogger.showTips("\nVSCode打开工程中存在同名lua文件, 详细信息请查看VSCode控制台 OUTPUT - Debugger/log 日志",2) - sameNameFileStr = sameNameFileStr + "在自动路径模式下,同名文件可能造成断点无法被正确识别。请修改VSCode打开的文件夹,确保其中没有同名文件。或者关闭launch.json中的autoPathMode, 改为手动配置路径。\n详细参考: https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/access-guidelines.md#第二步-路径规范\n" + DebugLogger.showTips("\nVSCode打开工程中存在同名lua文件, 可能会影响调试器执行, 详细信息请查看VSCode控制台 OUTPUT - Debugger/log 日志",1) + sameNameFileStr = sameNameFileStr + "调试器在自动路径模式下,可能无法识别同名lua文件中的断点,导致打开错误的文件。请修改VSCode打开的文件夹,确保其中没有同名文件。或者关闭launch.json中的autoPathMode, 改为手动配置路径。\n详细参考: https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/access-guidelines.md#第二步-路径规范 \n" DebugLogger.DebuggerInfo(sameNameFileStr); DebugLogger.AdapterInfo(sameNameFileStr); } @@ -180,7 +194,7 @@ export class Tools { } } //最终没有找到,返回输入的地址 - DebugLogger.showTips("调试器没有找到文件 " + shortPath + " , 请检查 launch.json 中后缀是否配置正确", 2); + DebugLogger.showTips("调试器没有找到文件 " + shortPath + " 。 请检查launch.json文件中lua后缀是否配置正确, 以及VSCode打开的工程是否正确", 2); return shortPath; } } From b1d95e07d7dc4ec6d4182a6fe973d07127c3613b Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Thu, 10 Oct 2019 15:10:57 +0800 Subject: [PATCH 093/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/luaDebug.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/luaDebug.ts b/src/luaDebug.ts index cb7c9bc..325b79b 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -183,20 +183,18 @@ export class LuaDebugSession extends LoggingDebugSession { //向debugger发送含配置项的初始化协议 this._runtime.start((arr, info) => { DebugLogger.AdapterInfo("已建立连接,发送初始化协议和断点信息!"); - //设置标记位 + //对luapanda.lua的版本控制,低于一定版本要提示升级 if (typeof info.debuggerVer == "string"){ //转数字 let DVerArr = info.debuggerVer.split("."); let AVerArr = String(adapterVersion).split("."); if (DVerArr.length === AVerArr.length && DVerArr.length === 3 ){ - //比较大版本,大版本相差1就提示 - if ( parseInt(AVerArr[0]) > parseInt(DVerArr[0]) ){ - this._runtime.showTip("调试器Lua文件版本过低, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); - } - //比较小版本,小版本相差20就提示 - if ( ( parseInt(AVerArr[1]) - parseInt(DVerArr[1]) ) >= 3 ){ - this._runtime.showTip("调试器Lua文件版本较低, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); + //在adapter和debugger版本号长度相等的前提下,比较大版本,大版本 <2 或者 小版本 < 1 就提示. 2.1.0以下会提示 + if ( parseInt(DVerArr[0]) < 2 || parseInt(DVerArr[1]) < 1 ){ + DebugLogger.showTips("当前调试器的lua文件版本过低,可能无法正常使用,请升级到最新版本。帮助文档 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); } + }else{ + DebugLogger.showTips("调试器版本号异常:" + info.debuggerVer + ". 建议升级至最新版本。帮助文档 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md ", 1); } } if (info.UseLoadstring === "1") { @@ -514,9 +512,9 @@ export class LuaDebugSession extends LoggingDebugSession { type: String(info.type), variablesReference: parseInt(info.variablesReference) }; - this._runtime.showTip( info.tip ); + DebugLogger.showTips( info.tip ); }else{ - this._runtime.showTip("变量赋值失败 [" + info.tip + "]" ); + DebugLogger.showTips("变量赋值失败 [" + info.tip + "]" ); } let ins = arr[0]; ins.sendResponse(arr[1]); From 9350195bc96e0408ed304ad5763710ad85c49736 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Thu, 10 Oct 2019 16:06:33 +0800 Subject: [PATCH 094/431] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=B9=E6=97=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=85=BC=E5=AE=B9=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 5 +++-- Debugger/debugger_lib/libpdebug.cpp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 1b6aa6e..63f5268 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -1099,8 +1099,9 @@ function this.dataProcess( dataStr ) if hookLib ~= nil then isUseHookLib = 1; --同步数据给c hook - hookLib.sync_config(logLevel, pathCaseSensitivity and 1 or 0, autoPathMode and 1 or 0); - hookLib.sync_tempfile_path(TempFilePath_luaString) + -- hookLib.sync_config(logLevel, pathCaseSensitivity and 1 or 0, autoPathMode and 1 or 0); + hookLib.sync_config(logLevel, pathCaseSensitivity and 1 or 0); + hookLib.sync_tempfile_path(TempFilePath_luaString); hookLib.sync_cwd(cwd); hookLib.sync_file_ext(luaFileExtension); end diff --git a/Debugger/debugger_lib/libpdebug.cpp b/Debugger/debugger_lib/libpdebug.cpp index a58573f..6b330a4 100644 --- a/Debugger/debugger_lib/libpdebug.cpp +++ b/Debugger/debugger_lib/libpdebug.cpp @@ -15,7 +15,7 @@ static int cur_run_state = 0; //当前运行状态, c 和 lua 都可能 static int cur_hook_state = 0; //当前hook状态, c 和 lua 都可能改变这个状态 static int logLevel = 1; //日志等级(从lua同步) static int pathCaseSensitivity = 1; //大小写敏感标志位(从lua同步) -static int autoPathMode = 0; //自动路径标是否开启志位 +//static int autoPathMode = 0; //自动路径标是否开启志位 static int BPhit = 0; //BP命中标志位 static int stackdeep_counter = 0; //step用的栈深度计数器 static char hookLog[1024] = { 0 }; @@ -255,7 +255,7 @@ extern "C" int sync_bp_hit(lua_State *L) { extern "C" int sync_config(lua_State *L) { logLevel = static_cast(luaL_checkinteger(L, 1)); pathCaseSensitivity = static_cast(luaL_checkinteger(L, 2)); - autoPathMode = static_cast(luaL_checkinteger(L, 3)); +// autoPathMode = static_cast(luaL_optinteger(L, 3, 0)); return 0; } From fab7884143169d1e7792910e73ad10243126a5f8 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Thu, 10 Oct 2019 16:26:00 +0800 Subject: [PATCH 095/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86mac=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/mac/x86_64/501/libpdebug.so | Bin 37040 -> 37040 bytes .../plugins/mac/x86_64/503/libpdebug.so | Bin 37168 -> 37168 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Debugger/debugger_lib/plugins/mac/x86_64/501/libpdebug.so b/Debugger/debugger_lib/plugins/mac/x86_64/501/libpdebug.so index 653ecbb0075c76620c3508a93ecbfcd2feb73c53..5374e1c6de96f5345829ca4123cb2dc8f6b643d5 100755 GIT binary patch delta 7028 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 O1{+x7mS-0vXZ;5+<>cQ0 delta 7296 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 From 8842661753fb4885f6fd6e8d8623b42c3d01efe9 Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Thu, 10 Oct 2019 16:33:21 +0800 Subject: [PATCH 096/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86win=20libc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/win/x86/501/libpdebug.dll | Bin 36864 -> 36864 bytes .../plugins/win/x86/503/libpdebug.dll | Bin 38400 -> 38400 bytes .../plugins/win/x86_64/501/libpdebug.dll | Bin 45056 -> 45056 bytes .../plugins/win/x86_64/503/libpdebug.dll | Bin 46592 -> 46592 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Debugger/debugger_lib/plugins/win/x86/501/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86/501/libpdebug.dll index dc95bb456aa60ee272316f4439c410b1c92b881d..4a276013ff8fd095ffd2825cd32d1ee80c6009cd 100644 GIT binary patch delta 188 zcmZozz|^pSX#pd%(3^RinHdjo>0~kfFXi|z`ey}$Ko%2_xp>9`1_21a`G|n=f!M=m z;9&E6?$RV{pw?IhAYcOGJRsiD1;hm)5e5dB91oB!0>m2KKwJot0n1IEpC<{ndUqZp zlfa#uypsjEBD_}RXG-@>`^CBWOu-Elf4&7emH}}3j`_07isLf{zZg7F6msfA+VLxMj#r&4}9`1_21a`G|n=f!M=m z;9&E6?xktgK&`P1K)?jVc|iQ43y4cVA`A>LIUXQe1c)QLfw&YT1D2b7zDN>m_3I)= zCV{S`^2d=sjeX~LHodJkx0|;4Pst4~=EFdjU9WHFV?AYl#r)Rf)V>3Z44YN@@2~*? DR*y+o delta 188 zcmZoz!_=^bX#pd1U-X>K%!~)Pbi%qzIkFhT{);lKWDv+=3R^s50fPXP#|#y2J|ba! zATIXs=J(u7)2xA7V;O*e35fH6_(c~Gmw-eV7+`WdK(+`FM|1;mDM$t^H~D;#B-rZL zMT|@W*F3u3w9d3}ZkFC09BKS#)8;=VH@KL4fiAmV-_FN=#{7!;E%V2dllu;AR_(vd F1^|LUKcxTw diff --git a/Debugger/debugger_lib/plugins/win/x86_64/501/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86_64/501/libpdebug.dll index 5a3fc7159c378196a13978c9a8d222658ce19e03..9f8b9882e0d8f8cc5600f37bed691c0df96a17fe 100644 GIT binary patch delta 11266 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 delta 11269 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 diff --git a/Debugger/debugger_lib/plugins/win/x86_64/503/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86_64/503/libpdebug.dll index 358f73d562b0a2dad0ed28539a3dd6db85a92770..49ca8834ec41b2b2e6e5fd4478e0ca25cb84ec7e 100644 GIT binary patch delta 11797 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 delta 11801 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 Mi)l9Sg(JTI2SDwTCjbBd From bebb46fd25c4dd333092451ec79227d0859b6a75 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Thu, 10 Oct 2019 16:48:44 +0800 Subject: [PATCH 097/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=AF=B9lua?= =?UTF-8?q?jit=E7=9A=84=E7=89=88=E6=9C=AC=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 63f5268..5490d41 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -302,7 +302,12 @@ end --返回版本号等配置 function this.getBaseInfo() local strTable = {}; - strTable[#strTable + 1] = "Lua Ver:" .. _VERSION .. " | adapterVer:" .. tostring(adapterVer) .. " | Debugger Ver:" .. tostring(debuggerVer); + local jitVer = ""; + if jit and jit.version then + jitVer = "," .. tostring(jit.version); + end + + strTable[#strTable + 1] = "Lua Ver:" .. _VERSION .. jitVer .." | adapterVer:" .. tostring(adapterVer) .. " | Debugger Ver:" .. tostring(debuggerVer); local moreInfoStr = ""; if hookLib ~= nil then local clibVer, forluaVer = hookLib.sync_getLibVersion(); From a6e796162d46a5ac35ae0e5909ffe50054d130f1 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Thu, 10 Oct 2019 21:13:59 +0800 Subject: [PATCH 098/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 8 +++++ Debugger/LuaPanda.lua | 4 +-- Docs/Manual/access-guidelines.md | 42 +++++++++++++++++++-------- Docs/Manual/debug-on-phone.md | 41 +++++++++++++++----------- Docs/Manual/quick-use.md | 42 ++++++++++++++++++++------- readme.md | 50 ++++++++++++++++++-------------- src/luaDebug.ts | 2 +- 7 files changed, 125 insertions(+), 64 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bff0d0..2572cb4 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 2.3.0 + ++ 增加了自动路径识别功能 ++ 支持在cocos2dx下的c库引用 ++ 修复了开始运行时step不正常,lua后缀替换异常的bug + + + ## 2.2.1 + 修复了单文件调试 文件路径中的 \ 被当做转义符的问题 diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 5490d41..8161ce6 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -415,7 +415,7 @@ function this.doctor() if isAbsolutePath then strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。"; else - strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。"; + strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是相对路径,调试器运行依赖的绝对路径(format)是来源于cwd+getinfo拼接。"; end strTable[#strTable + 1] = "\nfilepath是VSCode通过获取到的文件正确路径 , 对比format和filepath,调整launch.json中CWD,或改变VSCode打开文件夹的位置。使format和filepath一致即可。\n如果format和filepath路径仅大小写不一致,设置launch.json中 pathCaseSensitivity:false 可忽略路径大小写"; end @@ -485,7 +485,7 @@ function this.getInfo() if isAbsolutePath then strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是绝对路径,format使用getinfo路径。" .. winDiskSymbolTip; else - strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的是相对路径,format来源于cwd+getinfo拼接。如format文件路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。也可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。" .. winDiskSymbolTip; + strTable[#strTable + 1] = "\n说明:从lua虚拟机获取到的路径(getinfo)是相对路径,调试器运行依赖的绝对路径(format)是来源于cwd+getinfo拼接。如format路径错误请尝试调整cwd或改变VSCode打开文件夹的位置。也可以在format对应的文件下打一个断点,调整直到format和Breaks Info中断点路径完全一致。" .. winDiskSymbolTip; end else strTable[#strTable + 1] = "\n说明:已开启autoPathMode自动路径模式,调试器会根据getinfo获得的文件名自动查找文件位置,请确保VSCode打开的工程中不存在同名lua文件。"; diff --git a/Docs/Manual/access-guidelines.md b/Docs/Manual/access-guidelines.md index 1b8fa35..f7dba05 100644 --- a/Docs/Manual/access-guidelines.md +++ b/Docs/Manual/access-guidelines.md @@ -14,23 +14,42 @@ lua调试器依赖于 **luasocket** 和 **规范的路径**,需验证这两点 +### 第二步 路径说明 -### 第二步 路径规范 +**2.3.0增加了自动路径模式。开启后调试器会自动处理路径。用户只需保证VSCode打开的目录中不存在同名lua文件即可。当开启自动路径模式后,可跳过本节继续接入。** -调试器运行需要从lua虚拟机中获取当前文件信息。所以要求工程debug.getinfo或debug.traceback能输出较为规范的路径,就是**绝对路径**或者**对于固定位置的相对路径**。目前的slua, xlua, slua-unreal框架都已经支持这个特性。但还是建议初期接入时做一下测试。 +launch.json文件中配置项 `"autoPathMode": true/false` 可以设置是否使用自动路径,无此配置项时默认关闭。 + +#### 关于自动路径配置和手动配置的说明: + +调试器需要获得当前执行文件的绝对路径,以便做断点匹配和命中断点后打开对应文件。但是通过getinfo从lua虚拟机获取的路径可能是一个相对路径 ,调试器要把它转化为绝对路径。 + +把相对路径转为绝对路径的方式有以下两种: + +1. 自动路径模式 + +自动路径处理,原理是VSCode端在启动时扫描当前工程中的lua文件,创建[文件路径表]。当需要绝对路径时,把从 getinfo 获得的非完整路径在[文件路径表]中查询 ,就可以获得绝对路径。这种路径策略易于配置使用,也有利于真机调试。因为[文件路径表]的查询key是文件名,所以需要用户保证工程中不存在同名lua文件,否则断点可能会指向错误。 + +2. 拼接路径模式 + +本模式下会使用 cwd+getinfo 和 VSCode 传来的断点路径作对比,完全一致才算命中。这种策略比较准确,不会受到同名文件的干扰,但是配置较麻烦。如果希望手动配置路径或了解处理的细节,请继续阅读。 + +调试器运行需要从lua虚拟机中获取当前文件信息。所以要求工程debug.getinfo或debug.traceback能输出较为规范的路径,就是**绝对路径**或者**对于固定位置的相对路径**。 **测试方法**:在代码中加入`print(debug.traceback("debug test"))`, 查看打印的堆栈。 如下打印出文件的绝对路径,可以进行下一步 ![absolute_path](../static/access_introduction/absolute_path.png) -打印出的信息是一个相对路径(路径前可能带有@),可进行下一步 +打印出的信息是一个相对路径(路径前可能带有@),这不会影响调试器工作,可进行下一步 ![relatively_path](../static/access_introduction/relatively_path.png) 打印出的路径包含在[string ]中,只要是符合上面的要求,是一个可以定位的路径,可进行下一步 ![string_path](../static/access_introduction/string_path.png) -下面案例测试不通过,原因是仅输出了文件名,而这些文件其实不在同一个目录下。调试器无法仅根据文件名确定文件位置。 + + +如果仅输出了文件名,而这些文件其实不在同一个目录下,如下面的案例。此时需要调试器根据文件名定位文件路径,必须开启自动路径功能( launch.json 中设置 autoPathMode:true ),否则无法正常工作。 ![filename_path](../static/access_introduction/filename_path.png) @@ -54,15 +73,15 @@ lua调试器依赖于 **luasocket** 和 **规范的路径**,需验证这两点 文件:`LuaPanda.lua`, `DebugTools.lua` -下载位置:本git项目的 `Debugger` 目录下 +下载位置:github 的 `Debugger` 目录下 -把以上两个文件放在lua代码可以引用到的位置,并在用户代码中引用。 +把以上两个文件放在lua代码可以引用到的位置,并在用户代码中引用: ``` require("LuaPanda").start("127.0.0.1",8818); ``` -*8818是默认端口号,如果需要修改,请同时修改launch.json的设置。 +*8818是默认端口号,如果需要修改,请同时修改launch.json的端口设置。 @@ -77,15 +96,16 @@ require("LuaPanda").start("127.0.0.1",8818); 切换到VSCode的**调试选项卡**,点击齿轮,在弹出框中选择 LuaPanda (若无此选项说明以前用别的插件调试过lua , 要把先前用过的调试插件禁用)。会自动生成launch.json文件。 ![vscode_debug_ui](../static/access_introduction/vscode_debug_ui.png) -launch.json 配置项中要修改的主要是luaFileExtension, 改成lua文件使用的后缀就行。(比如xlua改为lua.txt, slua是txt),如果保持为空则尝试自动获取。 -各配置项鼠标悬停会有提示,可根据需要更改。 +launch.json 配置项中要修改的主要是luaFileExtension, 改成lua文件使用的后缀就行。(比如xlua改为lua.txt, slua是txt)。**各配置项鼠标悬停会有提示**,可根据需要更改。 ![debug_config](../static/access_introduction/debug_config.png) **注:调试时提示找不到文件的处理** -上面配置项中的`cwd`,其默认值`${workspaceFolder}`。${workspaceFolder}指的是VScode打开文件夹的路径。 +如果是自动路径模式,请检查lua后缀是否配置正确,以及VSCode打开的工程是否正确。 + +如果是手动路径模式,请按如下步骤: 如果开始调试时弹出了如下错误 @@ -103,8 +123,6 @@ format是调试器拼接出的文件路径,filepath是文件真实存在的路 - - ### 第三步 开始调试 **先运行VSCode端,再运行Lua代码**: 点击调试选项卡左上角的绿色箭头,再运行unity/ue4工程。如果有stopOnEntry或是执行到断点处,就会自动停住。 diff --git a/Docs/Manual/debug-on-phone.md b/Docs/Manual/debug-on-phone.md index dcf65a7..aea1514 100644 --- a/Docs/Manual/debug-on-phone.md +++ b/Docs/Manual/debug-on-phone.md @@ -60,31 +60,38 @@ require("LuaPanda").start("pcIP",8818) ### 关于真机调试的说明 -+ 当调试lua文件时,当前正在执行的文件路径是由lua虚拟机返回给调试器([http://www.lua.org/manual/5.3/manual.html#lua_getinfo](http://www.lua.org/manual/5.3/manual.html#lua_getinfo))。 ++ 安卓手机连接windows开启反向代理后,游戏运行会因为attach连接而卡顿。建议准备进行连接时再开反向代理,不需要调试时拔线或者使用下面命令解除反向代理 - 调试器获得的路径可能是文件的绝对路径,也可能是相对路径。这取决于加载文件时传给lua虚拟机的文件路径。 + ``` + adb reverse --remove-all + ``` - 如果调试器获得的是绝对路径,那么在命中断点时直接把这个路径传给VSCode。 + mac上无此现象。 - 如果是相对路径,调试器使用cwd+getinfo拼出完整路径,再传给VSCode。可以调整cwd,以确保拼出的路径是正确的。 -+ 如果调试器获得的绝对路径,或者拼接成的路径有偏差(参见 [issue #18](https://github.com/Tencent/LuaPanda/issues/18)),我们提供路径映射配置 docPathReplace - 比如lua文件在pc上路径 C:/GameProcect/Assets/script/test.lua - 放置在手机里,路径变成了 /data/data/com.project.test/script/test.lua +### 真机调试时的路径说明 - 在launch.json docPathReplace中设置 ++ 自动路径模式下,无需特别设置。 ++ 如使用手动拼接路径,请参阅如下内容决定是否使用路径映射 - ```json - "docPathReplace": ["/data/data/com.project.test/"," C:/GameProcect/Assets/"] - ``` +当调试lua文件时,当前正在执行的文件路径是由lua虚拟机返回给调试器([http://www.lua.org/manual/5.3/manual.html#lua_getinfo](http://www.lua.org/manual/5.3/manual.html#lua_getinfo))。 - 就可以完成路径映射,把运行环境的/data/data/com.project.test/script/test.lua映射到观察环境C:/GameProcect/Assets/script/test.lua +调试器获得的路径可能是文件的绝对路径,也可能是相对路径。这取决于加载文件时传给lua虚拟机的文件路径。 -+ 安卓手机连接windows开启反向代理后,游戏运行会因为attach连接而卡顿。建议准备进行连接时再开反向代理,不需要调试时拔线或者使用下面命令解除反向代理 +如果调试器获得的是绝对路径,那么在命中断点时直接把这个路径传给VSCode。 - ``` - adb reverse --remove-all - ``` +如果是相对路径,调试器使用cwd+getinfo拼出完整路径,再传给VSCode。可以调整cwd,以确保拼出的路径是正确的。 + +如果调试器获得的绝对路径,或者拼接成的路径有偏差(参见 [issue #18](https://github.com/Tencent/LuaPanda/issues/18)),我们提供路径映射配置 docPathReplace + +比如lua文件在pc上路径 C:/GameProcect/Assets/script/test.lua +放置在手机里,路径变成了 /data/data/com.project.test/script/test.lua + +在launch.json docPathReplace中设置 + +```json +"docPathReplace": ["/data/data/com.project.test/"," C:/GameProcect/Assets/"] +``` - mac上无此现象。 \ No newline at end of file +就可以完成路径映射,把运行环境的/data/data/com.project.test/script/test.lua映射到观察环境C:/GameProcect/Assets/script/test.lua \ No newline at end of file diff --git a/Docs/Manual/quick-use.md b/Docs/Manual/quick-use.md index b30ff2d..090ae07 100644 --- a/Docs/Manual/quick-use.md +++ b/Docs/Manual/quick-use.md @@ -6,14 +6,21 @@ ### console -使用console调试请先确认安装了luasocket。windows下调试console中lua进程, 请调整launch.json中useCHook: false(见附录) +使用console调试请先确认安装了luasocket。 -验证luasocket方法:console下执行lua,并 `require "socket.core"` 不报错说明已安装luasocket。 +验证方法:console下执行lua,并 `require "socket.core"` 不报错说明已安装luasocket。 1. **安装VSCode插件**:VSCode 商店搜索 LuaPanda,安装插件。 -2. **添加被调试文件**:创建一个文件夹,名为`luaDebugTest`, 其中放入被调试lua文件。 -3. **配置**:使用VSCode 打开 `luaDebugTest` 文件夹,切换到调试页卡(shitf + cmd(ctrl) + D),点击页面内的齿轮符号,选择 LuaPanda,会自动生成一张配置表。检查配置表中的"luaPath", 填入lua.exe位置。 -4. **开始调试**: **代码编辑面板中点开要调试的文件**,配置项选择`LuaPanda-DebugFile`,点击VSCode调试页卡下的绿色箭头,VSCode会拉起terminal ,并执行命令调试运行当前窗口的lua。VSCode有时会报窗口错误,请选择正确的文件,重复步骤4即可。 + +2. **添加被调试文件**:创建一个文件夹,取名为`LuaPandaTest`, 其中放入被调试lua文件。 + +3. **配置**:使用 VSCode 打开 `LuaPandaTest` 文件夹,切换到调试页卡(shitf + cmd(ctrl) + D),点击页面内的齿轮符号,选择 LuaPanda,会自动生成一张配置表。 + + 如果仅在指定目录下可以调用lua命令,需修改配置表中的"luaPath", 填入lua.exe位置。 + +4. **开始调试**: **代码编辑面板中点开要调试的文件**,VSCode切换到调试选项卡,配置项选择`LuaPanda-DebugFile`,点击VSCode调试页卡下的绿色箭头,VSCode会拉起terminal ,并执行命令调试运行当前窗口的lua。 + + 如出现错误,可检查当前激活的窗口是否正确,luaPath配置是否正确。 @@ -21,24 +28,37 @@ 1. **下载 slua 工程** 下载 slua 工程源码 https://github.com/pangweiwei/slua 2. **slua 工程设置** 使用 Unity 打开 slua 工程,切换工程平台到 Android/iOS , 点击菜单 Slua -> All -> Make,选择 `Slua/Editor/example/Circle` 场景。 -3. **放入调试文件** 把`/Debugger`中的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到slua工程 `Slua/Resources/` 目录下, 并修改文件后缀为 `.txt` +3. **放入调试文件** 把github中 /Debugger 下的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到slua工程 `Slua/Resources/` 目录下, 并修改文件后缀为 `.txt` 4. **配置工程** VSCode 打开 `Slua/Resources/` 目录,点击 VSCode 调试选项卡下的齿轮图标,选择 LuaPanda。把配置项 luaFileExtension 值修改为 "txt"。 -5. **开始调试** 在 `Slua/Resources/circle/circle.txt` 中加入代码 `require("LuaPanda").start("127.0.0.1",8818)`. 配置项选择`LuaPanda`,点击 VSCode 调试的绿色箭头,再运行Unity,在加入 require 的位置后会自动停止。也可以打断点调试 +5. **开始调试** 在 `Slua/Resources/circle/circle.txt` 中加入代码 `require("LuaPanda").start("127.0.0.1",8818)`. VSCode切换到调试选项卡,配置项选择`LuaPanda`,点击 VSCode 调试的绿色箭头,再运行Unity,在加入 require 的位置后会自动停止。也可以打断点调试 ### xlua 1. **下载 xlua 工程** https://github.com/Tencent/xLua -2. **放入调试文件** 把/Debugger中的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到xlua工程 `\XLua\Examples\07_AsyncTest\Resources` 目录下, 并修改后缀为 `.lua.txt` +2. **放入调试文件** 把github中 /Debugger 下的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到xlua工程 `\XLua\Examples\07_AsyncTest\Resources` 目录下, 并修改后缀为 `.lua.txt` 3. **配置工程** 把`\XLua\Examples\07_AsyncTest\Resources` 文件夹放入 VSCode , 点击 VSCode 调试选项卡下的齿轮图标,选择 LuaPanda。把配置项 luaFileExtension 值修改为 "lua.txt" -4. **开始调试** 在`\XLua\Examples\07_AsyncTest\Resources\async_test.lua.txt` 中加入`require("LuaPanda").start("127.0.0.1",8818)` 。配置项选择`LuaPanda`, 点击 VSCode 的开始调试箭头,运行Unity,在加入 require 的位置后会自动停止。也可以打断点调试。 +4. **开始调试** 在`\XLua\Examples\07_AsyncTest\Resources\async_test.lua.txt` 中加入`require("LuaPanda").start("127.0.0.1",8818)` 。VSCode切换到调试选项卡,配置项选择`LuaPanda`, 点击 VSCode 的开始调试箭头,运行Unity,在加入 require 的位置后会自动停止。也可以打断点调试。 ### slua-unreal 1. **下载slua-unreal工程** https://github.com/Tencent/sluaunreal -2. **放入调试文件** 把/Debugger中的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到slua-unreal 工程`sluaunreal/Content/Lua/`目录下 +2. **放入调试文件** 把github中 /Debugger 下的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到slua-unreal 工程`sluaunreal/Content/Lua/`目录下 3. **配置工程** 把`sluaunreal/Content`文件夹放入 VSCode , 点击 VSCode 调试选项卡下的齿轮图标,选择 LuaPanda。 -4. **开始调试** 在执行的lua代码中加入`require("LuaPanda").start("127.0.0.1",8818)` 。配置项选择`LuaPanda`, 点击 VSCode 的开始调试箭头,再运行ue4,在加入 require 的位置后会自动停止。之后可以打断点调试。 +4. **开始调试** 在执行的lua代码中加入`require("LuaPanda").start("127.0.0.1",8818)` 。VSCode切换到调试选项卡,配置项选择`LuaPanda`, 点击 VSCode 的开始调试箭头,再运行ue4,在加入 require 的位置后会自动停止。之后可以打断点调试。 + + + +#### cocos2dx + +可能存在的问题:LuaPanda目前支持标准lua虚拟机,cocos2dx集成的是luajit,可能会在调试函数尾调用时出现跳步的情况,后续完整支持luajit后会解决此问题。 + +1. 下载cocos2dx并创建新工程 + +2. **放入调试器文件** 把github中 /Debugger 下的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到cocos2dx工程 /src下,和main.lua 文件同级 +3. **配置工程** 把`src`文件夹拖入 VSCode , 点击 VSCode 调试选项卡下的齿轮图标,选择 LuaPanda。 + +4. **开始调试** 在main.lua文件 `require "cocos.init"` 行之前加入代码 `require("LuaPanda").start("127.0.0.1",8818)` 。VSCode切换到调试选项卡,配置项选择`LuaPanda`, 点击 VSCode 的开始调试箭头,再运行cocos2dx工程,在加入 require 的位置后会自动停止。之后可以打断点调试。 \ No newline at end of file diff --git a/readme.md b/readme.md index e134832..3393705 100644 --- a/readme.md +++ b/readme.md @@ -15,9 +15,9 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` # Tips -+ 升级建议 ++ 版本说明和升级建议 - 大家在使用中如果遇到问题,建议先把调试器的 `LuaPanda.lua,DebugTools.lua` 两个文件更新到最新版本。`LuaPanda.lua` 的版本可以在此文件头部查看。 + 目前调试器最新版本是2.3.0(推荐使用),2.2.x和2.1.0 也可使用,更早的版本不再支持。如调试遇到问题建议大家手动把调试器的 `LuaPanda.lua,DebugTools.lua` 两个文件更新到最新版本。`LuaPanda.lua` 的版本可以在此文件头部查看。 Release下载地址:https://github.com/Tencent/LuaPanda/releases @@ -29,18 +29,36 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` xlua允许用户重写文件加载函数`CustomLoader`,sluaunreal也提供类似方法`setLoadFileDelegate`。 - 发生此问题的原因之一是用户重写了加载函数中没有加入对so/dll的处理,加载so/dll时会报找不到文件,但随后执行lua原生loader能够正确加载libpdebug。 - - 查看libpdebug.so是否加载的方式是在控制台输入`LuaPanda.getInfo()`, 返回信息中有 hookLib Ver 说明libpdebug已经加载。此时可以忽略报错或在文件加载函数函数中正确处理.so/dll. + 发生此问题的原因之一是用户重写的加载函数中没有加入对so/dll的处理,加载so/dll时会报找不到文件错误,但随后执行lua原生loader能够正确加载libpdebug。 + + 查看libpdebug.so是否加载的方式是在控制台输入`LuaPanda.getInfo()`, 返回信息中有 hookLib Ver 说明libpdebug已经加载。此时可以忽略报错或在文件加载函数函数中正确处理.so/dll。 # 近期更新 -+ v2.2.1 ++ v2.3.0 - 小幅更新,优化了单文件调试和调试控制台的使用。 + + 增加了自动路径识别功能 + + 2.3.0版本插件在launch.json文件中新增了`autoPathMode`设置项。当设置为true时,调试器可以根据文件名查询完整路径,用户在接入时不必再进行繁琐的路径配置。当此配置项为false或者未配置时,使用传统的路径拼接方式。 + + 另外,开启此功能需要用户确保工程目录(VSCode打开的目录)中能不存在同名lua文件(如由同名文件,开始调试时会弹出警告)。否则调试器可能会把断点指向错误的文件,造成执行异常 + + + 测试了在cocos2dx下的运行情况 + + 之前的版本在cocos2dx中运行时会报查找 c 库错误。2.3.0 修复了此问题,测试 cocos2dx 在 win/mac 下都可以使用c库。 + + 另外调试器目前支持标准lua虚拟机,cocos2dx集成的是luajit,可能会在单步时出现跳步的情况,后续完整支持luajit会解决此问题。 + 如希望体验新功能,请按照 [升级说明](./Docs/Manual/update.md) 手动替换工程中的 `LuaPanda.lua,DebugTools.lua` 文件。 + + + ++ v2.2.1 + + 小幅更新,优化了单文件调试和调试控制台的使用。 + - 修复单文件调试 文件路径中的 \ 被当做转义符的问题。 - 修复单文件调试 首次运行窗口报错的问题。 - 优化调试控制台的使用,动态执行表达式不必再加p 。 @@ -48,31 +66,21 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` + v2.2.0 - + 增加了`LuaPanda.doctor()` 命令,可以检查环境中的错误(需更新LuaPanda.lua和DebugTools.lua至2.2.0)。 - + 修复了VSCode请求变量信息但在lua中发生错误,导致调试器卡住的问题。 - - 修复了c库在一些框架下无法正常运行,导致程序自动退出的问题。 - + 修复了c库在一些框架下无法正常运行,导致程序自动退出的问题。 -+ v2.1.0 - - 增加真机调试中对替换路径的支持。相关文档 [真机调试说明](./Docs/Manual/debug-on-phone.md) - 优化了attach造成运行卡顿的问题。 - - 建议把LuaPanda.lua更新到最新版本。 - - # 特性 + 支持单步调试,条件断点,协程调试,支持调试时变量赋值。 + 支持lua5.1- 5.3, 支持 slua/xlua/slua-unreal 等框架 + 在断点处可以监视和运行表达式,返回结果 -+ 可以根据断点密集程度调整 hook 频率, 有较好高的效率 ++ 可以根据断点密集程度调整 hook 频率, 有较高的效率 + 支持 attach 模式,lua 运行过程中可随时建立连接 + 使用 lua / C 双调试引擎。lua 部分可动态下发,避免打包后无法调试。C 部分效率高,适合开发期调试。 diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 325b79b..fc088b6 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -191,7 +191,7 @@ export class LuaDebugSession extends LoggingDebugSession { if (DVerArr.length === AVerArr.length && DVerArr.length === 3 ){ //在adapter和debugger版本号长度相等的前提下,比较大版本,大版本 <2 或者 小版本 < 1 就提示. 2.1.0以下会提示 if ( parseInt(DVerArr[0]) < 2 || parseInt(DVerArr[1]) < 1 ){ - DebugLogger.showTips("当前调试器的lua文件版本过低,可能无法正常使用,请升级到最新版本。帮助文档 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); + DebugLogger.showTips("当前调试器的lua文件版本过低,可能无法正常使用,请升级到最新版本。帮助文档 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md ", 2); } }else{ DebugLogger.showTips("调试器版本号异常:" + info.debuggerVer + ". 建议升级至最新版本。帮助文档 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md ", 1); From 15f68d553bbace70e79f3b2f2adde3c9af140263 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Fri, 11 Oct 2019 09:50:22 +0800 Subject: [PATCH 099/431] =?UTF-8?q?=E9=9A=90=E8=97=8F=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E4=B8=8D=E7=94=A8=E7=9A=84=E9=85=8D=E7=BD=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 6 ++---- readme.md | 4 ++-- src/extension.ts | 2 -- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index baa3be7..d427a1e 100755 --- a/package.json +++ b/package.json @@ -177,15 +177,13 @@ "request": "launch", "name": "LuaPanda", "program": "", - "args": [], "cwd": "${workspaceFolder}", - "pathCaseSensitivity": true, "luaFileExtension": "", "connectionPort": 8818, "stopOnEntry": true, "useCHook": true, - "logLevel": 1, - "autoPathMode": true + "autoPathMode": true, + "logLevel": 1 }, { "type": "lua", diff --git a/readme.md b/readme.md index 3393705..d6dff58 100644 --- a/readme.md +++ b/readme.md @@ -41,9 +41,9 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` + 增加了自动路径识别功能 - 2.3.0版本插件在launch.json文件中新增了`autoPathMode`设置项。当设置为true时,调试器可以根据文件名查询完整路径,用户在接入时不必再进行繁琐的路径配置。当此配置项为false或者未配置时,使用传统的路径拼接方式。 + 2.3.0版本插件在launch.json文件中新增了`autoPathMode`设置项。当设置为`true`时,调试器会根据文件名查询完整路径。用户在接入时不必再进行繁琐的路径配置。当此配置项为false或者未配置时,使用传统的路径拼接方式。 - 另外,开启此功能需要用户确保工程目录(VSCode打开的目录)中能不存在同名lua文件(如由同名文件,开始调试时会弹出警告)。否则调试器可能会把断点指向错误的文件,造成执行异常 + 另外,用户需要确保**VSCode打开的工程目录**中不存在同名lua文件,才可以使用本功能。否则调试器可能会把断点指向错误的文件,造成执行异常。 + 测试了在cocos2dx下的运行情况 diff --git a/src/extension.ts b/src/extension.ts index 08b95fe..bd8d508 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -119,7 +119,6 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { } if (!config.TempFilePath) { - // vscode.window.showInformationMessage("请在launch中配置TempFilePath路径!"); config.TempFilePath = '${workspaceFolder}'; } @@ -138,7 +137,6 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { } if (config.pathCaseSensitivity == undefined) { - //vscode.window.showInformationMessage("请在launch中配置pathCaseSensitivity") config.pathCaseSensitivity = true; } From 13816469dedb5de83dafaee1f42ed6a33803fdf2 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Fri, 11 Oct 2019 10:15:52 +0800 Subject: [PATCH 100/431] =?UTF-8?q?=E6=B8=85=E9=99=A4=E4=B8=8D=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index d427a1e..ae28c7e 100755 --- a/package.json +++ b/package.json @@ -189,7 +189,6 @@ "type": "lua", "request": "launch", "name": "LuaPanda-DebugFile", - "pathCaseSensitivity": true, "luaPath": "", "packagePath": [], "luaFileExtension": "", From 229e5248295b296f75594c345ef120b4454d4d33 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Mon, 21 Oct 2019 17:29:25 +0800 Subject: [PATCH 101/431] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E7=9A=84?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=B7=AF=E5=BE=84=E7=9A=84=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=E5=86=99=E6=95=8F=E6=84=9F=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Tools.ts | 15 ++++++++++++++- src/extension.ts | 3 --- src/luaDebug.ts | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Tools.ts b/src/Tools.ts index f22a3a2..71b6dec 100644 --- a/src/Tools.ts +++ b/src/Tools.ts @@ -8,6 +8,7 @@ export class Tools { public static extMap = new Object(); // 可处理的文件后缀列表 public static fileNameToPathMap; // 文件名-路径Map public static useAutoPathMode = false; + public static pathCaseSensitivity = false; // 把传入的路径标准路径 public static genUnifiedPath(beProcessPath) : string{ @@ -179,7 +180,19 @@ export class Tools { let nameExtObject = this.getPathNameAndExt(shortPath); let fileName = nameExtObject['name']; - let fullPath = this.fileNameToPathMap[fileName]; + + let fullPath; + if(this.pathCaseSensitivity){ + fullPath = this.fileNameToPathMap[fileName]; + }else{ + for (const keyPath in this.fileNameToPathMap) { + if(keyPath.toLowerCase() === fileName){ + fullPath = this.fileNameToPathMap[keyPath]; + break; + } + } + } + if(fullPath){ if(isArray(fullPath)){ // 存在同名文件 diff --git a/src/extension.ts b/src/extension.ts index bd8d508..9802953 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -109,12 +109,10 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { } if (!config.request) { - vscode.window.showInformationMessage("请在launch中配置request方式!"); config.request = 'launch'; } if (!config.cwd) { - vscode.window.showInformationMessage("请在launch中配置cwd工作路径!"); config.cwd = '${workspaceFolder}'; } @@ -132,7 +130,6 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { } if (config.stopOnEntry == undefined) { - vscode.window.showInformationMessage("请在launch中配置是否stopOnEntry") config.stopOnEntry = true; } diff --git a/src/luaDebug.ts b/src/luaDebug.ts index fc088b6..70de590 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -136,6 +136,8 @@ export class LuaDebugSession extends LoggingDebugSession { let path = require("path"); Tools.useAutoPathMode = !!args.autoPathMode; + Tools.pathCaseSensitivity = !!args.pathCaseSensitivity; + //1.1.生成文件map if(Tools.useAutoPathMode === true){ Tools.rebuildAcceptExtMap(args.luaFileExtension); From 352745cc17d79c286f9f347bc282a8275152e6ec Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 22 Oct 2019 16:01:16 +0800 Subject: [PATCH 102/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86lua=20code?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A7=A3=E6=9E=90=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 23 +- package-lock.json | 3003 ++----------------------- package.json | 131 +- res/lua/coroutine.lua | 49 + res/lua/debug.lua | 92 + res/lua/global.lua | 123 + res/lua/io.lua | 124 + res/lua/math.lua | 109 + res/lua/os.lua | 75 + res/lua/package.lua | 77 + res/lua/string.lua | 133 ++ res/lua/table.lua | 55 + res/lua/utf8.lua | 49 + res/others/launch.json | 30 + res/snippets/snippets.json | 99 + res/web/settings.html | 249 ++ src/code/server/codeCompleting.ts | 401 ++++ src/code/server/codeDefinition.ts | 182 ++ src/code/server/codeEditor.ts | 30 + src/code/server/codeHighlight.ts | 1 + src/code/server/codeLinting.ts | 137 ++ src/code/server/codeLogManager.ts | 49 + src/code/server/codeReference.ts | 27 + src/code/server/codeSymbol.ts | 479 ++++ src/code/server/codeTools.ts | 524 +++++ src/code/server/docSymbolProcesser.ts | 1833 +++++++++++++++ src/code/server/server.ts | 411 ++++ src/code/server/typeInfer.ts | 246 ++ src/{ => common}/LogManager.ts | 0 src/{ => common}/StatusBarManager.ts | 13 + src/{ => common}/Tools.ts | 59 +- src/{ => debug}/BreakPoint.ts | 0 src/{ => debug}/dataProcesser.ts | 2 +- src/{ => debug}/debugAdapter.ts | 0 src/{ => debug}/luaDebug.ts | 31 +- src/{ => debug}/luaDebugRuntime.ts | 6 +- src/debug/updateManager.ts | 49 + src/debug/visualSetting.ts | 87 + src/extension.ts | 126 +- src/tsconfig.json | 7 +- 40 files changed, 6238 insertions(+), 2883 deletions(-) create mode 100755 res/lua/coroutine.lua create mode 100755 res/lua/debug.lua create mode 100755 res/lua/global.lua create mode 100755 res/lua/io.lua create mode 100755 res/lua/math.lua create mode 100755 res/lua/os.lua create mode 100755 res/lua/package.lua create mode 100755 res/lua/string.lua create mode 100755 res/lua/table.lua create mode 100755 res/lua/utf8.lua create mode 100644 res/others/launch.json create mode 100755 res/snippets/snippets.json create mode 100644 res/web/settings.html create mode 100644 src/code/server/codeCompleting.ts create mode 100644 src/code/server/codeDefinition.ts create mode 100644 src/code/server/codeEditor.ts create mode 100644 src/code/server/codeHighlight.ts create mode 100644 src/code/server/codeLinting.ts create mode 100644 src/code/server/codeLogManager.ts create mode 100644 src/code/server/codeReference.ts create mode 100644 src/code/server/codeSymbol.ts create mode 100644 src/code/server/codeTools.ts create mode 100644 src/code/server/docSymbolProcesser.ts create mode 100755 src/code/server/server.ts create mode 100644 src/code/server/typeInfer.ts rename src/{ => common}/LogManager.ts (100%) rename src/{ => common}/StatusBarManager.ts (58%) rename src/{ => common}/Tools.ts (82%) rename src/{ => debug}/BreakPoint.ts (100%) rename src/{ => debug}/dataProcesser.ts (99%) rename src/{ => debug}/debugAdapter.ts (100%) rename src/{ => debug}/luaDebug.ts (97%) rename src/{ => debug}/luaDebugRuntime.ts (98%) create mode 100644 src/debug/updateManager.ts create mode 100644 src/debug/visualSetting.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index c51acbd..5a355cd 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,13 +4,24 @@ { "type": "extensionHost", "request": "launch", - "name": "LuaPandaExtension", + "name": "Launch Client", "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "outFiles": [ "${workspaceFolder}/out/**/*.js" ] - + "args": ["--extensionDevelopmentPath=${workspaceRoot}"], + "outFiles": ["${workspaceRoot}/out/**/*.js", "${workspaceRoot}/out/common/*.js"] + }, + { + "type": "node", + "request": "attach", + "name": "Attach to Server", + "port": 6009, + "restart": true, + "outFiles": ["${workspaceRoot}/out/code/server/**/*.js"] + } + ], + "compounds": [ + { + "name": "Client + Server", + "configurations": ["Launch Client", "Attach to Server"] } ] } diff --git a/package-lock.json b/package-lock.json index 80ea915..1ab7295 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,30 @@ { "name": "luapanda", - "version": "2.2.3", + "version": "3.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/@types/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-0QEFiR8ljcHp9bAbWxecjVRuAMr16ivPiGOw6KFQBVrVd0RQIcM3xKdRisH2EDWgVWujiYtHwhSkSUoAAGzH7Q==", + "requires": { + "commander": "*" + } + }, + "@types/diff": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-3.5.3.tgz", + "integrity": "sha512-YrLagYnL+tfrgM7bQ5yW34pi5cg9pmh5Gbq2Lmuuh+zh0ZjmK2fU3896PtlpJT3IDG2rdkoG30biHJepgIsMnw==" + }, + "@types/get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Rq+8rwnpT+Alr6B66ZSsMWitvfM=", + "requires": { + "@types/node": "*" + } + }, "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", @@ -13,47 +34,13 @@ "@types/node": { "version": "7.0.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.55.tgz", - "integrity": "sha512-diCxfWNT4g2UM9Y+BPgy4s3egcZ2qOXc0mXLauvbsBUq9SBKQfh0SmuEUEhJVFZt/p6UDsjg1s2EgfM6OSlp4g==", - "dev": true - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } + "integrity": "sha512-diCxfWNT4g2UM9Y+BPgy4s3egcZ2qOXc0mXLauvbsBUq9SBKQfh0SmuEUEhJVFZt/p6UDsjg1s2EgfM6OSlp4g==" }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } + "@types/vscode": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.39.0.tgz", + "integrity": "sha512-rlg0okXDt7NjAyHXbZ2nO1I/VY/8y9w67ltLRrOxXQ46ayvrYZavD4A6zpYrGbs2+ZOEQzcUs+QZOqcVGQIxXQ==", + "dev": true }, "ansi-regex": { "version": "2.1.1", @@ -67,21 +54,6 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -91,105 +63,11 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "await-notify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/await-notify/-/await-notify-1.0.1.tgz", "integrity": "sha1-C0gTOyLlJBgeEVV2ZRhfKi885Hw=" }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -227,30 +105,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -266,17 +120,6 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", @@ -289,30 +132,12 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -364,67 +189,6 @@ "parse5": "^3.0.1" } }, - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -440,55 +204,16 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -507,21 +232,6 @@ "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -531,30 +241,6 @@ "ms": "2.0.0" } }, - "deep-assign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", - "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "denodeify": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", @@ -564,8 +250,7 @@ "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" }, "dom-serializer": { "version": "0.1.1", @@ -602,110 +287,6 @@ "domelementtype": "1" } }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", @@ -730,850 +311,53 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" + "pend": "~1.2.0" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fill-range": "^2.1.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", "dev": true }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", - "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==", - "dev": true - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "gulp-chmod": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", - "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", - "dev": true, - "requires": { - "deep-assign": "^1.0.0", - "stat-mode": "^0.2.0", - "through2": "^2.0.0" - } - }, - "gulp-filter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", - "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", - "dev": true, - "requires": { - "multimatch": "^2.0.0", - "plugin-error": "^0.1.2", - "streamfilter": "^1.0.5" - } - }, - "gulp-gunzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", - "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", - "dev": true, - "requires": { - "through2": "~0.6.5", - "vinyl": "~0.4.6" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "gulp-remote-src": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/gulp-remote-src/-/gulp-remote-src-0.4.4.tgz", - "integrity": "sha512-mo7lGgZmNXyTbcUzfjSnUVkx1pnqqiwv/pPaIrYdTO77hq0WNTxXLAzQdoYOnyJ0mfVLNmNl9AGqWLiAzTPMMA==", - "dev": true, - "requires": { - "event-stream": "3.3.4", - "node.extend": "~1.1.2", - "request": "^2.88.0", - "through2": "~2.0.3", - "vinyl": "~2.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "vinyl": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.0.2.tgz", - "integrity": "sha1-CjcT2NTpIhxY8QyhbAEWyeJe2nw=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "is-stream": "^1.1.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "dev": true, - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-symdest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.1.tgz", - "integrity": "sha512-UHd3MokfIN7SrFdsbV5uZTwzBpL0ZSTu7iq98fuDqBGZ0dlHxgbQBJwfd6qjCW83snkQ3Hz9IY4sMRMz2iTq7w==", - "dev": true, - "requires": { - "event-stream": "3.3.4", - "mkdirp": "^0.5.1", - "queue": "^3.1.0", - "vinyl-fs": "^2.4.3" - } - }, - "gulp-untar": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz", - "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=", - "dev": true, - "requires": { - "event-stream": "~3.3.4", - "gulp-util": "~3.0.8", - "streamifier": "~0.1.1", - "tar": "^2.2.1", - "through2": "~2.0.3" - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-vinyl-zip": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.2.tgz", - "integrity": "sha512-wJn09jsb8PyvUeyFF7y7ImEJqJwYy40BqL9GKfJs6UGpaGW9A+N68Q+ajsIpb9AeR6lAdjMbIdDPclIGo1/b7Q==", - "dev": true, - "requires": { - "event-stream": "3.3.4", - "queue": "^4.2.1", - "through2": "^2.0.3", - "vinyl": "^2.0.2", - "vinyl-fs": "^3.0.3", - "yauzl": "^2.2.1", - "yazl": "^2.2.1" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "queue": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz", - "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -1582,21 +366,6 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -1617,463 +386,85 @@ "readable-stream": "^3.1.1" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dev": true, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { - "uc.micro": "^1.0.1" + "safer-buffer": ">= 2.1.2 < 3" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "lodash._root": "^3.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "dev": true, "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" + "uc.micro": "^1.0.1" } }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lua-fmt": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/lua-fmt/-/lua-fmt-2.6.0.tgz", + "integrity": "sha1-75rAVz0dpzMNygnAIsOaM67TR6M=", "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" + "@types/commander": "^2.3.31", + "@types/diff": "^3.2.0", + "@types/get-stdin": "^5.0.0", + "commander": "^2.9.0", + "diff": "^3.3.0", + "get-stdin": "^5.0.1", + "luaparse": "github:oxyc/luaparse#ac42a00ebf4020b8c9d3219e4b0f84bf7ce6e802" + }, + "dependencies": { + "luaparse": { + "version": "github:oxyc/luaparse#ac42a00ebf4020b8c9d3219e4b0f84bf7ce6e802", + "from": "github:oxyc/luaparse#ac42a00ebf4020b8c9d3219e4b0f84bf7ce6e802" + } } }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true + "luaparse": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/luaparse/-/luaparse-0.2.1.tgz", + "integrity": "sha1-qo9WEysN6X0388mRqd9C4OF/ZWw=" }, "markdown-it": { "version": "8.4.2", @@ -2088,136 +479,18 @@ "uc.micro": "^1.0.5" } }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2265,61 +538,12 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node.extend": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.8.tgz", - "integrity": "sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==", - "dev": true, - "requires": { - "has": "^1.0.3", - "is": "^3.2.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -2329,46 +553,6 @@ "boolbase": "~1.0.0" } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2378,48 +562,6 @@ "wrappy": "1" } }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -2442,41 +584,6 @@ "os-tmpdir": "^1.0.0" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, "parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -2495,12 +602,6 @@ "@types/node": "*" } }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2521,244 +622,37 @@ "minimatch": "^3.0.4" } }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - } - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "psl": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", - "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", - "dev": true - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "queue": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", - "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "mute-stream": "~0.0.4" } }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } }, "resolve": { "version": "1.12.0", @@ -2769,40 +663,6 @@ "path-parse": "^1.0.6" } }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", @@ -2812,45 +672,12 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" }, "sprintf-js": { "version": "1.0.3", @@ -2858,91 +685,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", - "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "streamifier": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", - "dev": true - }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -2961,25 +703,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } - }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", @@ -2989,81 +712,6 @@ "has-flag": "^2.0.0" } }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, "tmp": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", @@ -3073,53 +721,6 @@ "os-tmpdir": "~1.0.1" } }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -3169,21 +770,6 @@ "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "typed-rest-client": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-0.9.0.tgz", @@ -3214,63 +800,24 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", "dev": true }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - }, - "dependencies": { - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, "url-join": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", "dev": true }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, + "urlencode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/urlencode/-/urlencode-1.1.0.tgz", + "integrity": "sha1-HyuibwE8hfATP3o61v8nMK33y7c=", "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "iconv-lite": "~0.4.11" } }, "util-deprecate": { @@ -3279,178 +826,6 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "dev": true - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "dev": true, - "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", - "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "vinyl-source-stream": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", - "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", - "dev": true, - "requires": { - "through2": "^2.0.3", - "vinyl": "^0.4.3" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, "vsce": { "version": "1.37.5", "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.37.5.tgz", @@ -3476,48 +851,6 @@ "yazl": "^2.2.2" } }, - "vscode": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.10.tgz", - "integrity": "sha512-MvFXXSGuhw0Q6GC6dQrnRc0ES+63wpttGIoYGBMQnoS9JFCCNC/rWfX0lBCHJyuKL2Q8CYg0ROsMEHbHVwEtVw==", - "dev": true, - "requires": { - "glob": "^7.1.2", - "gulp-chmod": "^2.0.0", - "gulp-filter": "^5.0.1", - "gulp-gunzip": "1.0.0", - "gulp-remote-src": "^0.4.3", - "gulp-symdest": "^1.1.0", - "gulp-untar": "^0.0.6", - "gulp-vinyl-zip": "^2.1.0", - "mocha": "^4.0.1", - "request": "^2.83.0", - "semver": "^5.4.1", - "source-map-support": "^0.5.0", - "url-parse": "^1.1.9", - "vinyl-source-stream": "^1.1.0" - }, - "dependencies": { - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - } - } - } - }, "vscode-debugadapter": { "version": "1.27.0", "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.27.0.tgz", @@ -3540,6 +873,48 @@ "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.27.0.tgz", "integrity": "sha512-cg3lKqVwxNpO2pLBxSwkBvE7w06+bHfbA/s14u8izSWyhJtPgRu1lQwi5tEyTRuwfEugfoPwerYL4vtY6teQDw==" }, + "vscode-jsonrpc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", + "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" + }, + "vscode-languageclient": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.2.1.tgz", + "integrity": "sha512-7jrS/9WnV0ruqPamN1nE7qCxn0phkH5LjSgSp9h6qoJGoeAKzwKz/PF6M+iGA/aklx4GLZg1prddhEPQtuXI1Q==", + "requires": { + "semver": "^5.5.0", + "vscode-languageserver-protocol": "3.14.1" + } + }, + "vscode-languageserver": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz", + "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==", + "requires": { + "vscode-languageserver-protocol": "3.14.1", + "vscode-uri": "^1.0.6" + } + }, + "vscode-languageserver-protocol": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", + "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", + "requires": { + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.14.0" + } + }, + "vscode-languageserver-types": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", + "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" + }, + "vscode-uri": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz", + "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==" + }, "vso-node-api": { "version": "6.1.2-preview", "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.1.2-preview.tgz", @@ -3558,12 +933,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index ae28c7e..a53ee67 100755 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "luapanda", "displayName": "LuaPanda", - "version": "2.3.0", + "version": "3.0.0", "publisher": "stuartwang", - "description": "lua debug adapters for VS Code.", + "description": "lua debug and code tools for VS Code.", "author": { "name": "stuartwang", "email": "3030078087@qq.com" @@ -12,17 +12,17 @@ "keywords": [ "lua", "debug", - "panda", "analyzer", "luaanalyzer" ], "engines": { - "vscode": "^1.18.0", + "vscode": "^1.25.0", "node": "^7.9.0" }, "icon": "images/luapanda_logo.png", "categories": [ - "Debuggers" + "Debuggers", + "Programming Languages" ], "repository": { "type": "git", @@ -32,31 +32,36 @@ "url": "https://github.com/Tencent/LuaPanda.git" }, "scripts": { - "vscode:prepublish": "tsc -p ./src", + "vscode:prepublish": "npm run compile", "compile": "tsc -p ./src", + "watch": "tsc -watch -p ./src", "package": "vsce package", - "publish": "vsce package", - "postinstall": "node ./node_modules/vscode/bin/install" + "publish": "vsce package" }, "dependencies": { + "lua-fmt": "^2.6.0", + "luaparse": "^0.2.1", + "path-reader": "^1.1.0", + "urlencode": "^1.1.0", + "vscode-languageserver": "^5.2.1", "await-notify": "1.0.1", "vscode-debugadapter": "1.27.0", "vscode-debugprotocol": "1.27.0", - "path-reader": "^1.1.0" + "vscode-languageclient": "^5.2.1" }, "devDependencies": { - "@types/node": "7.0.55", "@types/mocha": "2.2.48", - "typescript": "2.6.2", + "@types/node": "7.0.55", + "@types/vscode": "^1.39.0", "mocha": "5.0.1", - "vscode": "1.1.10", - "vscode-debugadapter-testsupport": "1.27.0", "tslint": "5.9.1", - "vsce": "1.37.5" + "typescript": "2.6.2", + "vsce": "1.37.5", + "vscode-debugadapter-testsupport": "1.27.0" }, "main": "./out/extension", "activationEvents": [ - "onDebug" + "*" ], "contributes": { "breakpoints": [ @@ -72,13 +77,105 @@ { "command": "luapanda.LuaGarbageCollect", "title": "LuaGarbageCollect" + }, + { + "command": "luapanda.openSettingsPage", + "title": "openSettingsPage" + } + ], + "configuration": { + "type": "object", + "title": "lua-analyzer configuration", + "properties": { + "lua_analyzer.codeLinting.enable": { + "scope": "resource", + "type": "boolean", + "default": true, + "description": "Enable/Disable code lingting. This is the master switch of code linting." + }, + "lua_analyzer.codeLinting.luacheckPath": { + "scope": "resource", + "type": "string", + "default": "", + "description": "The laucheck executable file path, use plugin default config if not set." + }, + "lua_analyzer.codeLinting.luaVersion": { + "scope": "resource", + "type": "string", + "enum": [ + "5.1", + "5.3", + "5.1+5.3" + ], + "default": "5.1+5.3", + "description": "Set standard globals for luacheck." + }, + "lua_analyzer.codeLinting.checkWhileTyping": { + "scope": "resource", + "type": "boolean", + "default": true, + "description": "Controls wether to check the syntax while typing." + }, + "lua_analyzer.codeLinting.checkAfterSave": { + "scope": "resource", + "type": "boolean", + "default": true, + "description": "Controls wether to check the syntax after file saved." + }, + "lua_analyzer.codeLinting.maxNumberOfProblems": { + "scope": "resource", + "type": "number", + "default": 100, + "description": "Controls the maximum number of problems produced by the luacheck." + }, + "lua_analyzer.codeLinting.maxLineLength": { + "scope": "resource", + "type": "number", + "default": 120, + "description": "Set maximum allowed line length (default: 120)." + }, + "lua_analyzer.codeLinting.ignoreFolderRegularExpression": { + "scope": "resource", + "type": "string", + "default": ".*/res/lua/\\w+\\.lua;", + "description": "The regular expressions used to ignore files in some specific folders. Use semicolons to separate different regular expressions." + }, + "lua_analyzer.codeLinting.ignoreErrorCode": { + "scope": "resource", + "type": "string", + "default": "", + "description": "Used to ignore some warnings or errors. Use semicolons to separate different error codes. For example, 211 means \"unused local variable\", you will see \"unused variable 'xxx' lua-analyzer(211)\" in the problems window. View https://luacheck.readthedocs.io/en/stable/warnings.html for more information." + }, + "lua_analyzer.codeLinting.ignoreGlobal": { + "scope": "resource", + "type": "string", + "default": "UnityEngine;com", + "description": "Used to ignore global variable for luacheck. Use semicolons to separate different variables." + }, + "lua_analyzer.trace.server": { + "scope": "window", + "type": "string", + "enum": [ + "off", + "messages", + "verbose" + ], + "default": "off", + "description": "Traces the communication between VS Code and the language server." + } + } + }, + "snippets": [ + { + "language": "lua", + "path": "./res/snippets/snippets.json" } ], "debuggers": [ { "type": "lua", "label": "LuaPanda", - "program": "./out/debugAdapter.js", + "program": "./out/debug/debugAdapter.js", "runtime": "node", "configurationAttributes": { "launch": { @@ -174,7 +271,6 @@ "initialConfigurations": [ { "type": "lua", - "request": "launch", "name": "LuaPanda", "program": "", "cwd": "${workspaceFolder}", @@ -187,7 +283,6 @@ }, { "type": "lua", - "request": "launch", "name": "LuaPanda-DebugFile", "luaPath": "", "packagePath": [], diff --git a/res/lua/coroutine.lua b/res/lua/coroutine.lua new file mode 100755 index 0000000..a2f4d39 --- /dev/null +++ b/res/lua/coroutine.lua @@ -0,0 +1,49 @@ +------------------------------------------------------------------------ +-- Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------ + +-- Coroutine Manipulation http://www.lua.org/manual/5.3/manual.html#6.2 +-- This library comprises the operations to manipulate coroutines, which come inside the table coroutine. See §2.6 for a general description of coroutines. +coroutine = {} + +-- Creates a new coroutine, with body f. f must be a function. Returns this new coroutine, an object with type "thread". +function coroutine.create(f) end + +-- Returns true when the running coroutine can yield. +-- A running coroutine is yieldable if it is not the main thread and it is not inside a non-yieldable C function. +function coroutine.isyieldable() end + +-- Starts or continues the execution of coroutine co. The first time you resume a coroutine, it starts running its body. The values val1, ... are passed as the arguments to the body function. If the coroutine has yielded, resume restarts it; the values val1, ... are passed as the results from the yield. +-- If the coroutine runs without any errors, resume returns true plus any values passed to yield (when the coroutine yields) or any values returned by the body function (when the coroutine terminates). If there is any error, resume returns false plus the error message. +function coroutine.resume(co, val1, ...) end + +-- Returns the running coroutine plus a boolean, true when the running coroutine is the main one. +function coroutine.running() end + +-- Returns the status of coroutine co, as a string: "running", if the coroutine is running (that is, it called status); "suspended", if the coroutine is suspended in a call to yield, or if it has not started running yet; "normal" if the coroutine is active but not running (that is, it has resumed another coroutine); and "dead" if the coroutine has finished its body function, or if it has stopped with an error. +function coroutine.status(co) end + +-- Creates a new coroutine, with body f. f must be a function. Returns a function that resumes the coroutine each time it is called. Any arguments passed to the function behave as the extra arguments to resume. Returns the same values returned by resume, except the first boolean. In case of error, propagates the error. +function coroutine.wrap(f) end + +-- Suspends the execution of the calling coroutine. Any arguments to yield are passed as extra results to resume. +function coroutine.yield(...) end diff --git a/res/lua/debug.lua b/res/lua/debug.lua new file mode 100755 index 0000000..6d1504d --- /dev/null +++ b/res/lua/debug.lua @@ -0,0 +1,92 @@ +------------------------------------------------------------------------ +-- Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------ + +--- The Debug Library http://www.lua.org/manual/5.3/manual.html#6.10 + +-- This library provides the functionality of the debug interface (§4.9) to Lua programs. You should exert care when using this library. Several of its functions violate basic assumptions about Lua code (e.g., that variables local to a function cannot be accessed from outside; that userdata metatables cannot be changed by Lua code; that Lua programs do not crash) and therefore can compromise otherwise secure code. Moreover, some functions in this library may be slow. +-- All functions in this library are provided inside the debug table. All functions that operate over a thread have an optional first argument which is the thread to operate over. The default is always the current thread. +debug = {} + +-- Enters an interactive mode with the user, running each string that the user enters. Using simple commands and other debug facilities, the user can inspect global and local variables, change their values, evaluate expressions, and so on. A line containing only the word cont finishes this function, so that the caller continues its execution. +-- Note that commands for debug.debug are not lexically nested within any function and so have no direct access to local variables. +function debug.debug() end + +-- Returns the current hook settings of the thread, as three values: the current hook function, the current hook mask, and the current hook count (as set by the debug.sethook function). +function debug.gethook(thread) end + +-- Returns a table with information about a function. You can give the function directly or you can give a number as the value of f, which means the function running at level f of the call stack of the given thread: level 0 is the current function (getinfo itself); level 1 is the function that called getinfo (except for tail calls, which do not count on the stack); and so on. If f is a number larger than the number of active functions, then getinfo returns nil. +-- The returned table can contain all the fields returned by lua_getinfo, with the string what describing which fields to fill in. The default for what is to get all information available, except the table of valid lines. If present, the option 'f' adds a field named func with the function itself. If present, the option 'L' adds a field named activelines with the table of valid lines. +-- For instance, the expression debug.getinfo(1,"n").name returns a name for the current function, if a reasonable name can be found, and the expression debug.getinfo(print) returns a table with all available information about the print function. +function debug.getinfo(thread, f, what) end + +-- This function returns the name and the value of the local variable with index local of the function at level f of the stack. This function accesses not only explicit local variables, but also parameters, temporaries, etc. +-- The first parameter or local variable has index 1, and so on, following the order that they are declared in the code, counting only the variables that are active in the current scope of the function. Negative indices refer to vararg arguments; -1 is the first vararg argument. The function returns nil if there is no variable with the given index, and raises an error when called with a level out of range. (You can call debug.getinfo to check whether the level is valid.) +-- Variable names starting with '(' (open parenthesis) represent variables with no known names (internal variables such as loop control variables, and variables from chunks saved without debug information). +-- The parameter f may also be a function. In that case, getlocal returns only the name of function parameters. +function debug.getlocal(thread, f, var) end + +-- Returns the metatable of the given value or nil if it does not have a metatable. +function debug.getmetatable(value) end + +-- Returns the registry table (see §4.5). +function debug.getregistry() end + +-- This function returns the name and the value of the upvalue with index up of the function f. The function returns nil if there is no upvalue with the given index. +-- Variable names starting with '(' (open parenthesis) represent variables with no known names (variables from chunks saved without debug information). +function debug.getupvalue(f, up) end + +-- Returns the Lua value associated to u. If u is not a full userdata, returns nil. +function debug.getuservalue(u, n) end + +--Sets the given function as a hook. The string mask and the number count describe when the hook will be called. The string mask may have any combination of the following characters, with the given meaning: +-- 'c': the hook is called every time Lua calls a function; +-- 'r': the hook is called every time Lua returns from a function; +-- 'l': the hook is called every time Lua enters a new line of code. +-- Moreover, with a count different from zero, the hook is called also after every count instructions. +-- When called without arguments, debug.sethook turns off the hook. +-- When the hook is called, its first argument is a string describing the event that has triggered its call: "call" (or "tail call"), "return", "line", and "count". For line events, the hook also gets the new line number as its second parameter. Inside a hook, you can call getinfo with level 2 to get more information about the running function (level 0 is the getinfo function, and level 1 is the hook function). +function debug.sethook(thread, hook, mask, count) end + +-- This function assigns the value value to the local variable with index local of the function at level level of the stack. The function returns nil if there is no local variable with the given index, and raises an error when called with a level out of range. (You can call getinfo to check whether the level is valid.) Otherwise, it returns the name of the local variable. +-- See debug.getlocal for more information about variable indices and names. +function debug.setlocal(thread, level, var, value) end + +-- Sets the metatable for the given value to the given table (which can be nil). Returns value. +function debug.setmetatable(value, table) end + +-- This function assigns the value value to the upvalue with index up of the function f. The function returns nil if there is no upvalue with the given index. Otherwise, it returns the name of the upvalue. +function debug.setupvalue(f, up, value) end + +-- Sets the given value as the Lua value associated to the given udata. udata must be a full userdata. +-- Returns udata. +function debug.setuservalue(udata, value, n) end + +-- If message is present but is neither a string nor nil, this function returns message without further processing. Otherwise, it returns a string with a traceback of the call stack. The optional message string is appended at the beginning of the traceback. An optional level number tells at which level to start the traceback (default is 1, the function calling traceback). +function debug.traceback(thread, message, level) end + +-- Returns a unique identifier (as a light userdata) for the upvalue numbered n from the given function. +-- These unique identifiers allow a program to check whether different closures share upvalues. Lua closures that share an upvalue (that is, that access a same external local variable) will return identical ids for those upvalue indices. +function debug.upvalueid(f, n) end + +-- Make the n1-th upvalue of the Lua closure f1 refer to the n2-th upvalue of the Lua closure f2. +function debug.upvaluejoin(f1, n1, f2, n2) end diff --git a/res/lua/global.lua b/res/lua/global.lua new file mode 100755 index 0000000..fbbc3a6 --- /dev/null +++ b/res/lua/global.lua @@ -0,0 +1,123 @@ +------------------------------------------------------------------------ +-- Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------ + +-- Basic Functions http://www.lua.org/manual/5.3/manual.html#6.1 + +-- The basic library provides core functions to Lua. If you do not include this library in your application, you should check carefully whether you need to provide implementations for some of its facilities. +function assert(v, message) end + +-- Calls error if the value of its argument v is false (i.e., nil or false); otherwise, returns all its arguments. In case of error, message is the error object; when absent, it defaults to "assertion failed!" +function collectgarbage(opt, arg) end + +-- Opens the named file and executes its contents as a Lua chunk. When called without arguments, dofile executes the contents of the standard input (stdin). Returns all values returned by the chunk. In case of errors, dofile propagates the error to its caller (that is, dofile does not run in protected mode). +function dofile(filename) end + +-- Terminates the last protected function called and returns message as the error object. Function error never returns. +-- Usually, error adds some information about the error position at the beginning of the message, if the message is a string. The level argument specifies how to get the error position. With level 1 (the default), the error position is where the error function was called. Level 2 points the error to where the function that called error was called; and so on. Passing a level 0 avoids the addition of error position information to the message. +function error(message, level) end + +-- A global variable (not a function) that holds the global environment (see §2.2). Lua itself does not use this variable; changing its value does not affect any environment, nor vice versa. +_G = {} + +-- If object does not have a metatable, returns nil. Otherwise, if the object's metatable has a __metatable field, returns the associated value. Otherwise, returns the metatable of the given object. +function getmetatable(object) end + +--Returns three values (an iterator function, the table t, and 0) so that the construction +-- for i,v in ipairs(t) do body end +-- will iterate over the key–value pairs (1,t[1]), (2,t[2]), ..., up to the first nil value. +function ipairs(t) end + +-- Loads a chunk. +-- If chunk is a string, the chunk is this string. If chunk is a function, load calls it repeatedly to get the chunk pieces. Each call to chunk must return a string that concatenates with previous results. A return of an empty string, nil, or no value signals the end of the chunk. +-- If there are no syntactic errors, returns the compiled chunk as a function; otherwise, returns nil plus the error message. +-- If the resulting function has upvalues, the first upvalue is set to the value of env, if that parameter is given, or to the value of the global environment. Other upvalues are initialized with nil. (When you load a main chunk, the resulting function will always have exactly one upvalue, the _ENV variable (see §2.2). However, when you load a binary chunk created from a function (see string.dump), the resulting function can have an arbitrary number of upvalues.) All upvalues are fresh, that is, they are not shared with any other function. +-- chunkname is used as the name of the chunk for error messages and debug information (see §4.9). When absent, it defaults to chunk, if chunk is a string, or to "=(load)" otherwise. +-- The string mode controls whether the chunk can be text or binary (that is, a precompiled chunk). It may be the string "b" (only binary chunks), "t" (only text chunks), or "bt" (both binary and text). The default is "bt". +-- Lua does not check the consistency of binary chunks. Maliciously crafted binary chunks can crash the interpreter. +function load(chunk, chunkname, mode, env) end + +-- Similar to load, but gets the chunk from file filename or from the standard input, if no file name is given. +function loadfile(filename, mode, env) end + +-- Allows a program to traverse all fields of a table. Its first argument is a table and its second argument is an index in this table. next returns the next index of the table and its associated value. When called with nil as its second argument, next returns an initial index and its associated value. When called with the last index, or with nil in an empty table, next returns nil. If the second argument is absent, then it is interpreted as nil. In particular, you can use next(t) to check whether a table is empty. +-- The order in which the indices are enumerated is not specified, even for numeric indices. (To traverse a table in numerical order, use a numerical for.) +-- The behavior of next is undefined if, during the traversal, you assign any value to a non-existent field in the table. You may however modify existing fields. In particular, you may clear existing fields. +function next(table, index) end + +-- If t has a metamethod __pairs, calls it with t as argument and returns the first three results from the call. +-- Otherwise, returns three values: the next function, the table t, and nil, so that the construction +-- for k,v in pairs(t) do body end +-- will iterate over all key–value pairs of table t. +-- See function next for the caveats of modifying the table during its traversal. +function pairs(t) end + +-- Calls function f with the given arguments in protected mode. This means that any error inside f is not propagated; instead, pcall catches the error and returns a status code. Its first result is the status code (a boolean), which is true if the call succeeds without errors. In such case, pcall also returns all results from the call, after this first result. In case of any error, pcall returns false plus the error message. +function pcall(f, arg1, ...) end + +-- Receives any number of arguments and prints their values to stdout, using the tostring function to convert each argument to a string. print is not intended for formatted output, but only as a quick way to show a value, for instance for debugging. For complete control over the output, use string.format and io.write. +function print(...) end + +-- Checks whether v1 is equal to v2, without invoking the __eq metamethod. Returns a boolean. +function rawequal(v1, v2) end + +-- Gets the real value of table[index], without invoking the __index metamethod. table must be a table; index may be any value. +function rawget(table, index) end + +-- Returns the length of the object v, which must be a table or a string, without invoking the __len metamethod. Returns an integer. +function rawlen(v) end + +-- Sets the real value of table[index] to value, without invoking the __newindex metamethod. table must be a table, index any value different from nil and NaN, and value any Lua value. +-- This function returns table. +function rawset(table, index, value) end + +-- If index is a number, returns all arguments after argument number index; a negative number indexes from the end (-1 is the last argument). Otherwise, index must be the string "#", and select returns the total number of extra arguments it received. +function select(index, ...) end + +-- Sets the metatable for the given table. (To change the metatable of other types from Lua code, you must use the debug library (§6.10).) If metatable is nil, removes the metatable of the given table. If the original metatable has a __metatable field, raises an error. +-- This function returns table. +function setmetatable(table, metatable) end + +-- When called with no base, tonumber tries to convert its argument to a number. If the argument is already a number or a string convertible to a number, then tonumber returns this number; otherwise, it returns nil. +-- The conversion of strings can result in integers or floats, according to the lexical conventions of Lua (see §3.1). (The string may have leading and trailing spaces and a sign.) +-- When called with base, then e must be a string to be interpreted as an integer numeral in that base. The base may be any integer between 2 and 36, inclusive. In bases above 10, the letter 'A' (in either upper or lower case) represents 10, 'B' represents 11, and so forth, with 'Z' representing 35. If the string e is not a valid numeral in the given base, the function returns nil. +function tonumber(e, base) end + +-- Receives a value of any type and converts it to a string in a human-readable format. (For complete control of how numbers are converted, use string.format.) +-- If the metatable of v has a __tostring field, then tostring calls the corresponding value with v as argument, and uses the result of the call as its result. +function tostring(v) end + +-- Returns the type of its only argument, coded as a string. The possible results of this function are "nil" (a string, not the value nil), "number", "string", "boolean", "table", "function", "thread", and "userdata". +function type(v) end + +-- A global variable (not a function) that holds a string containing the running Lua version. The current value of this variable is "Lua 5.3". +_VERSION = "Lua 5.3" + +-- This function is similar to pcall, except that it sets a new message handler msgh. +function xpcall(f, msgh, arg1, ...) end + +-- Loads the given module. The function starts by looking into the package.loaded table to determine whether modname is already loaded. If it is, then require returns the value stored at package.loaded[modname]. Otherwise, it tries to find a loader for the module. +-- To find a loader, require is guided by the package.searchers sequence. By changing this sequence, we can change how require looks for a module. The following explanation is based on the default configuration for package.searchers. +-- First require queries package.preload[modname]. If it has a value, this value (which must be a function) is the loader. Otherwise require searches for a Lua loader using the path stored in package.path. If that also fails, it searches for a C loader using the path stored in package.cpath. If that also fails, it tries an all-in-one loader (see package.searchers). +-- Once a loader is found, require calls the loader with two arguments: modname and an extra value dependent on how it got the loader. (If the loader came from a file, this extra value is the file name.) If the loader returns any non-nil value, require assigns the returned value to package.loaded[modname]. If the loader does not return a non-nil value and has not assigned any value to package.loaded[modname], then require assigns true to this entry. In any case, require returns the final value of package.loaded[modname]. +-- If there is any error loading or running the module, or if it cannot find any loader for the module, then require raises an error. +function require(modname) end \ No newline at end of file diff --git a/res/lua/io.lua b/res/lua/io.lua new file mode 100755 index 0000000..11acd88 --- /dev/null +++ b/res/lua/io.lua @@ -0,0 +1,124 @@ +------------------------------------------------------------------------ +-- Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------ +-- Input and Output Facilities http://www.lua.org/manual/5.3/manual.html#6.8 +-- The I/O library provides two different styles for file manipulation. The first one uses implicit file handles; that is, there are operations to set a default input file and a default output file, and all input/output operations are over these default files. The second style uses explicit file handles. +-- When using implicit file handles, all operations are supplied by table io. When using explicit file handles, the operation io.open returns a file handle and then all operations are supplied as methods of the file handle. +-- The table io also provides three predefined file handles with their usual meanings from C: io.stdin, io.stdout, and io.stderr. The I/O library never closes these files. +-- Unless otherwise stated, all I/O functions return nil on failure (plus an error message as a second result and a system-dependent error code as a third result) and some value different from nil on success. In non-POSIX systems, the computation of the error message and error code in case of errors may be not thread safe, because they rely on the global C variable errno. + +io = {} + +io.stderr = nil + +io.stdin = nil + +io.stdout = nil + +-- Equivalent to file:close(). Without a file, closes the default output file. +function io.close(file) end + +-- Equivalent to io.output():flush(). +function io.flush() end + +-- When called with a file name, it opens the named file (in text mode), and sets its handle as the default input file. When called with a file handle, it simply sets this file handle as the default input file. When called without arguments, it returns the current default input file. +-- In case of errors this function raises the error, instead of returning an error code. +function io.input(file) end + +-- Opens the given file name in read mode and returns an iterator function that works like file:lines(···) over the opened file. When the iterator function detects the end of file, it returns no values (to finish the loop) and automatically closes the file. +-- The call io.lines() (with no file name) is equivalent to io.input():lines("*l"); that is, it iterates over the lines of the default input file. In this case, the iterator does not close the file when the loop ends. +-- In case of errors this function raises the error, instead of returning an error code. +function io.lines(filename, ...) end + +-- This function opens a file, in the mode specified in the string mode. In case of success, it returns a new file handle. +-- The mode string can be any of the following: +-- "r": read mode (the default); +-- "w": write mode; +-- "a": append mode; +-- "r+": update mode, all previous data is preserved; +-- "w+": update mode, all previous data is erased; +-- "a+": append update mode, previous data is preserved, writing is only allowed at the end of file. +-- The mode string can also have a 'b' at the end, which is needed in some systems to open the file in binary mode. +function io.open(filename, mode) return file end + +-- Similar to io.input, but operates over the default output file. +function io.output(file) end + +--This function is system dependent and is not available on all platforms. +-- Starts program prog in a separated process and returns a file handle that you can use to read data from this program (if mode is "r", the default) or to write data to this program (if mode is "w"). +function io.popen(prog, mode) end + +--Equivalent to io.input():read(···). +function io.read(...) end + +-- In case of success, returns a handle for a temporary file. This file is opened in update mode and it is automatically removed when the program ends. +function io.tmpfile() end + +-- Checks whether obj is a valid file handle. Returns the string "file" if obj is an open file handle, "closed file" if obj is a closed file handle, or nil if obj is not a file handle. +function io.type(obj) end + +-- Equivalent to io.output():write(···). +function io.write(...) end + +local file = {} + +-- Closes file. Note that files are automatically closed when their handles are garbage collected, but that takes an unpredictable amount of time to happen. +-- When closing a file handle created with io.popen, file:close returns the same values returned by os.execute. +function file:close() end + +-- Saves any written data to file. +function file:flush() end + +-- Returns an iterator function that, each time it is called, reads the file according to the given formats. When no format is given, uses "l" as a default. As an example, the construction +-- for c in file:lines(1) do body end +-- will iterate over all characters of the file, starting at the current position. Unlike io.lines, this function does not close the file when the loop ends. +-- In case of errors this function raises the error, instead of returning an error code. +function file:lines(...) end + +-- Reads the file file, according to the given formats, which specify what to read. For each format, the function returns a string or a number with the characters read, or nil if it cannot read data with the specified format. (In this latter case, the function does not read subsequent formats.) When called without formats, it uses a default format that reads the next line (see below). +-- The available formats are +-- "n": reads a numeral and returns it as a float or an integer, following the lexical conventions of Lua. (The numeral may have leading spaces and a sign.) This format always reads the longest input sequence that is a valid prefix for a numeral; if that prefix does not form a valid numeral (e.g., an empty string, "0x", or "3.4e-"), it is discarded and the function returns nil. +-- "a": reads the whole file, starting at the current position. On end of file, it returns the empty string. +-- "l": reads the next line skipping the end of line, returning nil on end of file. This is the default format. +-- "L": reads the next line keeping the end-of-line character (if present), returning nil on end of file. +-- number: reads a string with up to this number of bytes, returning nil on end of file. If number is zero, it reads nothing and returns an empty string, or nil on end of file. +-- The formats "l" and "L" should be used only for text files. +function file:read(...) end + +-- Sets and gets the file position, measured from the beginning of the file, to the position given by offset plus a base specified by the string whence, as follows: +-- "set": base is position 0 (beginning of the file); +-- "cur": base is current position; +-- "end": base is end of file; +-- In case of success, seek returns the final file position, measured in bytes from the beginning of the file. If seek fails, it returns nil, plus a string describing the error. +-- The default value for whence is "cur", and for offset is 0. Therefore, the call file:seek() returns the current file position, without changing it; the call file:seek("set") sets the position to the beginning of the file (and returns 0); and the call file:seek("end") sets the position to the end of the file, and returns its size. +function file:seek(whence, offset) end + +-- Sets the buffering mode for an output file. There are three available modes: +-- "no": no buffering; the result of any output operation appears immediately. +-- "full": full buffering; output operation is performed only when the buffer is full or when you explicitly flush the file (see io.flush). +-- "line": line buffering; output is buffered until a newline is output or there is any input from some special files (such as a terminal device). +-- For the last two cases, size specifies the size of the buffer, in bytes. The default is an appropriate size. +function file:setvbuf(mode, size) end + +-- Writes the value of each of its arguments to file. The arguments must be strings or numbers. +-- In case of success, this function returns file. Otherwise it returns nil plus a string describing the error. +function file:write(...) end diff --git a/res/lua/math.lua b/res/lua/math.lua new file mode 100755 index 0000000..11ab9c6 --- /dev/null +++ b/res/lua/math.lua @@ -0,0 +1,109 @@ +------------------------------------------------------------------------ +-- Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------ + +-- Mathematical Functions http://www.lua.org/manual/5.3/manual.html#6.7 +-- This library provides basic mathematical functions. It provides all its functions and constants inside the table math. Functions with the annotation "integer/float" give integer results for integer arguments and float results for float (or mixed) arguments. Rounding functions (math.ceil, math.floor, and math.modf) return an integer when the result fits in the range of an integer, or a float otherwise. +math = {} + +-- The value of π. +math.pi = 3.1415 + +-- An integer with the minimum value for an integer. +math.mininteger = nil + +-- Returns the absolute value of x. (integer/float) +function math.abs(x) return 0 end + +-- Returns the arc cosine of x (in radians). +function math.acos(x) return 0 end + +-- Returns the arc sine of x (in radians). +function math.asin(x) return 0 end + +-- Returns the arc tangent of y/x (in radians), but uses the signs of both arguments to find the quadrant of the result. (It also handles correctly the case of x being zero.) +-- The default value for x is 1, so that the call math.atan(y) returns the arc tangent of y. +function math.atan(y, x) return 0 end + +-- Returns the smallest integral value larger than or equal to x. +function math.ceil(x) return 0 end + +-- Returns the cosine of x (assumed to be in radians). +function math.cos(x) return 0 end + +-- Converts the angle x from radians to degrees. +function math.deg(x) return 0 end + +--- Returns the value e^x (where e is the base of natural logarithms). +function math.exp(x) end + +-- Returns the largest integral value smaller than or equal to x. +function math.floor(x) end + +-- Returns the remainder of the division of x by y that rounds the quotient towards zero. (integer/float) +function math.fmod(x, y) end + +-- The float value HUGE_VAL, a value larger than any other numeric value. +math.huge = nil + +-- Returns the logarithm of x in the given base. The default for base is e (so that the function returns the natural logarithm of x). +function math.log(x, base) end + +-- Returns the argument with the maximum value, according to the Lua operator <. (integer/float) +function math.max(x, ...) end + +-- An integer with the maximum value for an integer. +math.maxinteger = nil + +-- Returns the argument with the minimum value, according to the Lua operator <. (integer/float) +function math.min(x, ...) end + +-- Returns the integral part of x and the fractional part of x. Its second result is always a float. +function math.modf(x) end + +-- Converts the angle x from degrees to radians. +function math.rad(x) end + +-- When called without arguments, returns a pseudo-random float with uniform distribution in the range [0,1). When called with two integers m and n, math.random returns a pseudo-random integer with uniform distribution in the range [m, n]. (The value n-m cannot be negative and must fit in a Lua integer.) The call math.random(n) is equivalent to math.random(1,n). +-- This function is an interface to the underling pseudo-random generator function provided by C. +function math.random(m, n) end + +-- Sets x as the "seed" for the pseudo-random generator: equal seeds produce equal sequences of numbers. +function math.randomseed(x) end + +-- Returns the sine of x (assumed to be in radians). +function math.sin(x) return 0 end + +-- Returns the square root of x. (You can also use the expression x^0.5 to compute this value.) +function math.sqrt(x) return 0 end + +-- Returns the tangent of x (assumed to be in radians). +function math.tan(x) return 0 end + +-- If the value x is convertible to an integer, returns that integer. Otherwise, returns nil. +function math.tointeger(x) end + +-- Returns "integer" if x is an integer, "float" if it is a float, or nil if x is not a number. +function math.type(x) end + +-- Returns a boolean, true if and only if integer m is below integer n when they are compared as unsigned integers. +function math.ult(m, n) end \ No newline at end of file diff --git a/res/lua/os.lua b/res/lua/os.lua new file mode 100755 index 0000000..632f455 --- /dev/null +++ b/res/lua/os.lua @@ -0,0 +1,75 @@ +------------------------------------------------------------------------ +-- Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------ + +-- Operating System Facilities http://www.lua.org/manual/5.3/manual.html#pdf-os.clock +-- This library is implemented through table os. +os = {} + +-- os.clock Returns an approximation of the amount in seconds of CPU time used by the program. +function os.clock() end + +-- os.date Returns a string or a table containing date and time, formatted according to the given string format. +-- If the time argument is present, this is the time to be formatted (see the os.time function for a description of this value). Otherwise, date formats the current time. +-- If format starts with '!', then the date is formatted in Coordinated Universal Time. After this optional character, if format is the string "*t", then date returns a table with the following fields: year, month (1–12), day (1–31), hour (0–23), min (0–59), sec (0–61), wday (weekday, 1–7, Sunday is 1), yday (day of the year, 1–366), and isdst (daylight saving flag, a boolean). This last field may be absent if the information is not available. +-- If format is not "*t", then date returns the date as a string, formatted according to the same rules as the ISO C function strftime. +-- When called without arguments, date returns a reasonable date and time representation that depends on the host system and on the current locale. (More specifically, os.date() is equivalent to os.date("%c").) +-- In non-POSIX systems, this function may be not thread safe because of its reliance on C function gmtime and C function localtime. +function os.date(format, time) end + +-- os.difftime Returns the difference, in seconds, from time t1 to time t2 (where the times are values returned by os.time). In POSIX, Windows, and some other systems, this value is exactly t2-t1. +function os.difftime(t2, t1) end + +-- This function is equivalent to the ISO C function system. It passes command to be executed by an operating system shell. Its first result is true if the command terminated successfully, or nil otherwise. After this first result the function returns a string plus a number, as follows: +-- "exit": the command terminated normally; the following number is the exit status of the command. +-- "signal": the command was terminated by a signal; the following number is the signal that terminated the command. +-- When called without a command, os.execute returns a boolean that is true if a shell is available. +function os.execute(command) end + +-- Calls the ISO C function exit to terminate the host program. If code is true, the returned status is EXIT_SUCCESS; if code is false, the returned status is EXIT_FAILURE; if code is a number, the returned status is this number. The default value for code is true. +-- If the optional second argument close is true, closes the Lua state before exiting. +function os.exit(code, close) end + +-- Returns the value of the process environment variable varname, or nil if the variable is not defined. +function os.getenv(varname) end + +-- Deletes the file (or empty directory, on POSIX systems) with the given name. If this function fails, it returns nil, plus a string describing the error and the error code. Otherwise, it returns true. +function os.remove(filename) end + +-- Renames the file or directory named oldname to newname. If this function fails, it returns nil, plus a string describing the error and the error code. Otherwise, it returns true. +function os.rename(oldname, newname) end + +-- Sets the current locale of the program. locale is a system-dependent string specifying a locale; category is an optional string describing which category to change: "all", "collate", "ctype", "monetary", "numeric", or "time"; the default category is "all". The function returns the name of the new locale, or nil if the request cannot be honored. +-- If locale is the empty string, the current locale is set to an implementation-defined native locale. If locale is the string "C", the current locale is set to the standard C locale. +-- When called with nil as the first argument, this function only returns the name of the current locale for the given category. +-- This function may be not thread safe because of its reliance on C function setlocale. +function os.setlocale(locale, category) end + +-- Returns the current time when called without arguments, or a time representing the local date and time specified by the given table. This table must have fields year, month, and day, and may have fields hour (default is 12), min (default is 0), sec (default is 0), and isdst (default is nil). Other fields are ignored. For a description of these fields, see the os.date function. +-- The values in these fields do not need to be inside their valid ranges. For instance, if sec is -10, it means -10 seconds from the time specified by the other fields; if hour is 1000, it means +1000 hours from the time specified by the other fields. +-- The returned value is a number, whose meaning depends on your system. In POSIX, Windows, and some other systems, this number counts the number of seconds since some given start time (the "epoch"). In other systems, the meaning is not specified, and the number returned by time can be used only as an argument to os.date and os.difftime. +function os.time(table) end + +-- Returns a string with a file name that can be used for a temporary file. The file must be explicitly opened before its use and explicitly removed when no longer needed. +-- In POSIX systems, this function also creates a file with that name, to avoid security risks. (Someone else might create the file with wrong permissions in the time between getting the name and creating the file.) You still have to open the file to use it and to remove it (even if you do not use it). +-- When possible, you may prefer to use io.tmpfile, which automatically removes the file when the program ends. +function os.tmpname() end \ No newline at end of file diff --git a/res/lua/package.lua b/res/lua/package.lua new file mode 100755 index 0000000..b61e8de --- /dev/null +++ b/res/lua/package.lua @@ -0,0 +1,77 @@ +------------------------------------------------------------------------ +-- Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------ + +-- Modules http://www.lua.org/manual/5.3/manual.html#6.3 +-- The package library provides basic facilities for loading modules in Lua. It exports one function directly in the global environment: require. Everything else is exported in a table package. +package = {} + +-- A string describing some compile-time configurations for packages. This string is a sequence of lines: +-- The first line is the directory separator string. Default is '\' for Windows and '/' for all other systems. +-- The second line is the character that separates templates in a path. Default is ';'. +-- The third line is the string that marks the substitution points in a template. Default is '?'. +-- The fourth line is a string that, in a path in Windows, is replaced by the executable's directory. Default is '!'. +-- The fifth line is a mark to ignore all text after it when building the luaopen_ function name. Default is '-'. +package.config = "" + +-- The path used by require to search for a C loader. +-- Lua initializes the C path package.cpath in the same way it initializes the Lua path package.path, using the environment variable LUA_CPATH_5_3, or the environment variable LUA_CPATH, or a default path defined in luaconf.h. +package.cpath = "" + +-- A table used by require to control which modules are already loaded. When you require a module modname and package.loaded[modname] is not false, require simply returns the value stored there. +-- This variable is only a reference to the real table; assignments to this variable do not change the table used by require. +package.loaded = {} + +-- Dynamically links the host program with the C library libname. +-- If funcname is "*", then it only links with the library, making the symbols exported by the library available to other dynamically linked libraries. Otherwise, it looks for a function funcname inside the library and returns this function as a C function. So, funcname must follow the lua_CFunction prototype (see lua_CFunction). +-- This is a low-level function. It completely bypasses the package and module system. Unlike require, it does not perform any path searching and does not automatically adds extensions. libname must be the complete file name of the C library, including if necessary a path and an extension. funcname must be the exact name exported by the C library (which may depend on the C compiler and linker used). +-- This function is not supported by Standard C. As such, it is only available on some platforms (Windows, Linux, Mac OS X, Solaris, BSD, plus other Unix systems that support the dlfcn standard). +function package.loadlib(libname, funcname) end + +-- The path used by require to search for a Lua loader. +-- At start-up, Lua initializes this variable with the value of the environment variable LUA_PATH_5_3 or the environment variable LUA_PATH or with a default path defined in luaconf.h, if those environment variables are not defined. Any ";;" in the value of the environment variable is replaced by the default path. +package.path = "" + +-- A table to store loaders for specific modules (see require). +-- This variable is only a reference to the real table; assignments to this variable do not change the table used by require. +package.preload = {} + +-- A table used by require to control how to load modules. +-- Each entry in this table is a searcher function. When looking for a module, require calls each of these searchers in ascending order, with the module name (the argument given to require) as its sole parameter. The function can return another function (the module loader) plus an extra value that will be passed to that loader, or a string explaining why it did not find that module (or nil if it has nothing to say). +-- Lua initializes this table with four searcher functions. +-- The first searcher simply looks for a loader in the package.preload table. +-- The second searcher looks for a loader as a Lua library, using the path stored at package.path. The search is done as described in function package.searchpath. +-- The third searcher looks for a loader as a C library, using the path given by the variable package.cpath. Again, the search is done as described in function package.searchpath. For instance, if the C path is the string +-- "./?.so;./?.dll;/usr/local/?/init.so" +-- the searcher for module foo will try to open the files ./foo.so, ./foo.dll, and /usr/local/foo/init.so, in that order. Once it finds a C library, this searcher first uses a dynamic link facility to link the application with the library. Then it tries to find a C function inside the library to be used as the loader. The name of this C function is the string "luaopen_" concatenated with a copy of the module name where each dot is replaced by an underscore. Moreover, if the module name has a hyphen, its suffix after (and including) the first hyphen is removed. For instance, if the module name is a.b.c-v2.1, the function name will be luaopen_a_b_c. +-- The fourth searcher tries an all-in-one loader. It searches the C path for a library for the root name of the given module. For instance, when requiring a.b.c, it will search for a C library for a. If found, it looks into it for an open function for the submodule; in our example, that would be luaopen_a_b_c. With this facility, a package can pack several C submodules into one single library, with each submodule keeping its original open function. +-- All searchers except the first one (preload) return as the extra value the file name where the module was found, as returned by package.searchpath. The first searcher returns no extra value. +package.searchers = {} + +-- Searches for the given name in the given path. +-- A path is a string containing a sequence of templates separated by semicolons. For each template, the function replaces each interrogation mark (if any) in the template with a copy of name wherein all occurrences of sep (a dot, by default) were replaced by rep (the system's directory separator, by default), and then tries to open the resulting file name. +-- For instance, if the path is the string +-- "./?.lua;./?.lc;/usr/local/?/init.lua" +-- the search for the name foo.a will try to open the files ./foo/a.lua, ./foo/a.lc, and /usr/local/foo/a/init.lua, in that order. +-- Returns the resulting name of the first file that it can open in read mode (after closing the file), or nil plus an error message if none succeeds. (This error message lists all file names it tried to open.) +function package.searchpath(name, path, sep, rep) end + diff --git a/res/lua/string.lua b/res/lua/string.lua new file mode 100755 index 0000000..e2c9917 --- /dev/null +++ b/res/lua/string.lua @@ -0,0 +1,133 @@ +------------------------------------------------------------------------ +-- Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------ + +-- String Manipulation http://www.lua.org/manual/5.3/manual.html#6.4 +-- This library provides generic functions for string manipulation, such as finding and extracting substrings, and pattern matching. When indexing a string in Lua, the first character is at position 1 (not at 0, as in C). Indices are allowed to be negative and are interpreted as indexing backwards, from the end of the string. Thus, the last character is at position -1, and so on. +-- The string library provides all its functions inside the table string. It also sets a metatable for strings where the __index field points to the string table. Therefore, you can use the string functions in object-oriented style. For instance, string.byte(s,i) can be written as s:byte(i). +-- The string library assumes one-byte character encodings. +string = {} + +-- Returns the internal numeric codes of the characters s[i], s[i+1], ..., s[j]. The default value for i is 1; the default value for j is i. These indices are corrected following the same rules of function string.sub. +-- Numeric codes are not necessarily portable across platforms. +function string.byte(s, i, j) end + +-- Receives zero or more integers. Returns a string with length equal to the number of arguments, in which each character has the internal numeric code equal to its corresponding argument. +-- Numeric codes are not necessarily portable across platforms. +function string.char(...) end + +-- Returns a string containing a binary representation (a binary chunk) of the given function, so that a later load on this string returns a copy of the function (but with new upvalues). If strip is a true value, the binary representation may not include all debug information about the function, to save space. +-- Functions with upvalues have only their number of upvalues saved. When (re)loaded, those upvalues receive fresh instances containing nil. (You can use the debug library to serialize and reload the upvalues of a function in a way adequate to your needs.) +function string.dump(func, strip) end + +-- Looks for the first match of pattern (see §6.4.1) in the string s. If it finds a match, then find returns the indices of s where this occurrence starts and ends; otherwise, it returns nil. A third, optional numeric argument init specifies where to start the search; its default value is 1 and can be negative. A value of true as a fourth, optional argument plain turns off the pattern matching facilities, so the function does a plain "find substring" operation, with no characters in pattern being considered magic. Note that if plain is given, then init must be given as well. +-- If the pattern has captures, then in a successful match the captured values are also returned, after the two indices. +function string.find(s, pattern, init, plain) end + +-- Returns a formatted version of its variable number of arguments following the description given in its first argument (which must be a string). The format string follows the same rules as the ISO C function sprintf. The only differences are that the options/modifiers *, h, L, l, n, and p are not supported and that there is an extra option, q. +-- The q option formats a string between double quotes, using escape sequences when necessary to ensure that it can safely be read back by the Lua interpreter. For instance, the call +-- string.format('%q', 'a string with "quotes" and \n new line') +-- may produce the string: +-- "a string with \"quotes\" and \ +-- new line" +-- Options A, a, E, e, f, G, and g all expect a number as argument. Options c, d, i, o, u, X, and x expect an integer. When Lua is compiled with a C89 compiler, options A and a (hexadecimal floats) do not support any modifier (flags, width, length). +-- Option s expects a string; if its argument is not a string, it is converted to one following the same rules of tostring. If the option has any modifier (flags, width, length), the string argument should not contain embedded zeros. +function string.format(formatstring, ...) end + +-- Returns an iterator function that, each time it is called, returns the next captures from pattern (see §6.4.1) over the string s. If pattern specifies no captures, then the whole match is produced in each call. +-- As an example, the following loop will iterate over all the words from string s, printing one per line: +-- s = "hello world from Lua" +-- for w in string.gmatch(s, "%a+") do +-- print(w) +-- end +-- The next example collects all pairs key=value from the given string into a table: +-- t = {} +-- s = "from=world, to=Lua" +-- for k, v in string.gmatch(s, "(%w+)=(%w+)") do +-- t[k] = v +-- end +-- For this function, a caret '^' at the start of a pattern does not work as an anchor, as this would prevent the iteration. +function string.gmatch(s, pattern) end + +-- Returns a copy of s in which all (or the first n, if given) occurrences of the pattern (see §6.4.1) have been replaced by a replacement string specified by repl, which can be a string, a table, or a function. gsub also returns, as its second value, the total number of matches that occurred. The name gsub comes from Global SUBstitution. +-- If repl is a string, then its value is used for replacement. The character % works as an escape character: any sequence in repl of the form %d, with d between 1 and 9, stands for the value of the d-th captured substring. The sequence %0 stands for the whole match. The sequence %% stands for a single %. +-- If repl is a table, then the table is queried for every match, using the first capture as the key. +-- If repl is a function, then this function is called every time a match occurs, with all captured substrings passed as arguments, in order. +-- In any case, if the pattern specifies no captures, then it behaves as if the whole pattern was inside a capture. +-- If the value returned by the table query or by the function call is a string or a number, then it is used as the replacement string; otherwise, if it is false or nil, then there is no replacement (that is, the original match is kept in the string). +-- Here are some examples: +-- x = string.gsub("hello world", "(%w+)", "%1 %1") +-- --> x="hello hello world world" +-- +-- x = string.gsub("hello world", "%w+", "%0 %0", 1) +-- --> x="hello hello world" +-- +-- x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1") +-- --> x="world hello Lua from" +-- +-- x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv) +-- --> x="home = /home/roberto, user = roberto" +-- +-- x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s) +-- return load(s)() +-- end) +-- --> x="4+5 = 9" +-- +-- local t = {name="lua", version="5.3"} +-- x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t) +-- --> x="lua-5.3.tar.gz" +function string.gsub(s, pattern, repl, n) end + + +-- Receives a string and returns its length. The empty string "" has length 0. Embedded zeros are counted, so "a\000bc\000" has length 5. +function string.len(s) end + +--- Receives a string and returns a copy of this string with all uppercase letters changed to lowercase. All other characters are left unchanged. The definition of what an uppercase letter is depends on the current locale. +function string.lower(s) end + + +-- Looks for the first match of pattern (see §6.4.1) in the string s. If it finds one, then match returns the captures from the pattern; otherwise it returns nil. If pattern specifies no captures, then the whole match is returned. A third, optional numeric argument init specifies where to start the search; its default value is 1 and can be negative. +function string.match(s, pattern, init) end + + +-- Returns a binary string containing the values v1, v2, etc. packed (that is, serialized in binary form) according to the format string fmt (see §6.4.2). +function string.pack(fmt, v1, v2, ...) end + +-- Returns the size of a string resulting from string.pack with the given format. The format string cannot have the variable-length options 's' or 'z' +function string.packsize(fmt) end + +-- Returns a string that is the concatenation of n copies of the string s separated by the string sep. The default value for sep is the empty string (that is, no separator). Returns the empty string if n is not positive. +-- (Note that it is very easy to exhaust the memory of your machine with a single call to this function.) +function string.rep(s, n, sep) end + +-- Returns a string that is the string s reversed. +function string.reverse(s) end + +-- Returns the substring of s that starts at i and continues until j; i and j can be negative. If j is absent, then it is assumed to be equal to -1 (which is the same as the string length). In particular, the call string.sub(s,1,j) returns a prefix of s with length j, and string.sub(s, -i) (for a positive i) returns a suffix of s with length i. +-- If, after the translation of negative indices, i is less than 1, it is corrected to 1. If j is greater than the string length, it is corrected to that length. If, after these corrections, i is greater than j, the function returns the empty string. +function string.sub(s, i, j) end + +-- Returns the values packed in string s (see string.pack) according to the format string fmt (see §6.4.2). An optional pos marks where to start reading in s (default is 1). After the read values, this function also returns the index of the first unread byte in s. +function string.unpack(fmt, s, pos) end + +-- Receives a string and returns a copy of this string with all lowercase letters changed to uppercase. All other characters are left unchanged. The definition of what a lowercase letter is depends on the current locale. +function string.upper(s) end diff --git a/res/lua/table.lua b/res/lua/table.lua new file mode 100755 index 0000000..a0aea76 --- /dev/null +++ b/res/lua/table.lua @@ -0,0 +1,55 @@ +------------------------------------------------------------------------ +-- Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------ + +-- Table Manipulation http://www.lua.org/manual/5.3/manual.html#6.6 +-- This library provides generic functions for table manipulation. It provides all its functions inside the table table. +-- Remember that, whenever an operation needs the length of a table, all caveats about the length operator apply (see §3.4.7). All functions ignore non-numeric keys in the tables given as arguments. +table = {} + +-- Given a list where all elements are strings or numbers, returns the string list[i]..sep..list[i+1] ··· sep..list[j]. The default value for sep is the empty string, the default for i is 1, and the default for j is #list. If i is greater than j, returns the empty string. +function table.concat(list, sep, i, j) end + +-- Inserts element value at position pos in list, shifting up the elements list[pos], list[pos+1], ···, list[#list]. The default value for pos is #list+1, so that a call table.insert(t,x) inserts x at the end of list t. +function table.insert(list, pos, value) end + + +-- Moves elements from table a1 to table a2, performing the equivalent to the following multiple assignment: a2[t],··· = a1[f],···,a1[e]. The default for a2 is a1. The destination range can overlap with the source range. The number of elements to be moved must fit in a Lua integer. +-- Returns the destination table a2. +function table.move(a1, f, e, t, a2) end + +-- Returns a new table with all arguments stored into keys 1, 2, etc. and with a field "n" with the total number of arguments. Note that the resulting table may not be a sequence. +function table.pack(...) end + +-- Removes from list the element at position pos, returning the value of the removed element. When pos is an integer between 1 and #list, it shifts down the elements list[pos+1], list[pos+2], ···, list[#list] and erases element list[#list]; The index pos can also be 0 when #list is 0, or #list + 1; in those cases, the function erases the element list[pos]. +-- The default value for pos is #list, so that a call table.remove(l) removes the last element of list l. +function table.remove(list, pos) end + +-- Sorts list elements in a given order, in-place, from list[1] to list[#list]. If comp is given, then it must be a function that receives two list elements and returns true when the first element must come before the second in the final order (so that, after the sort, i < j implies not comp(list[j],list[i])). If comp is not given, then the standard Lua operator < is used instead. +-- Note that the comp function must define a strict partial order over the elements in the list; that is, it must be asymmetric and transitive. Otherwise, no valid sort may be possible. +-- The sort algorithm is not stable: elements considered equal by the given order may have their relative positions changed by the sort. +function table.sort(list, comp) end + +-- Returns the elements from the given list. This function is equivalent to +-- return list[i], list[i+1], ···, list[j] +-- By default, i is 1 and j is #list. +function table.unpack(list, i, j) end diff --git a/res/lua/utf8.lua b/res/lua/utf8.lua new file mode 100755 index 0000000..d8bbcb4 --- /dev/null +++ b/res/lua/utf8.lua @@ -0,0 +1,49 @@ +------------------------------------------------------------------------ +-- Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------ + +-- UTF-8 Support http://www.lua.org/manual/5.3/manual.html#6.5 +-- This library provides basic support for UTF-8 encoding. It provides all its functions inside the table utf8. This library does not provide any support for Unicode other than the handling of the encoding. Any operation that needs the meaning of a character, such as character classification, is outside its scope. +-- Unless stated otherwise, all functions that expect a byte position as a parameter assume that the given position is either the start of a byte sequence or one plus the length of the subject string. As in the string library, negative indices count from the end of the string. +utf8 = {} + +-- The pattern (a string, not a function) "[\0-\x7F\xC2-\xF4][\x80-\xBF]*" (see §6.4.1), which matches exactly one UTF-8 byte sequence, assuming that the subject is a valid UTF-8 string. +utf8.charpattern = "" + +-- Receives zero or more integers, converts each one to its corresponding UTF-8 byte sequence and returns a string with the concatenation of all these sequences. +function utf8.char(...) end + +-- Returns values so that the construction +-- for p, c in utf8.codes(s) do body end +-- will iterate over all characters in string s, with p being the position (in bytes) and c the code point of each character. It raises an error if it meets any invalid byte sequence. +function utf8.codes(s) end + +-- Returns the codepoints (as integers) from all characters in s that start between byte position i and j (both included). The default for i is 1 and for j is i. It raises an error if it meets any invalid byte sequence. +function utf8.codepoint (s, i, j) end + +-- Returns the number of UTF-8 characters in string s that start between positions i and j (both inclusive). The default for i is 1 and for j is -1. If it finds any invalid byte sequence, returns a false value plus the position of the first invalid byte. +function utf8.len(s, i, j) end + +-- Returns the position (in bytes) where the encoding of the n-th character of s (counting from position i) starts. A negative n gets characters before position i. The default for i is 1 when n is non-negative and #s + 1 otherwise, so that utf8.offset(s, -n) gets the offset of the n-th character from the end of the string. If the specified character is neither in the subject nor right after its end, the function returns nil. +-- As a special case, when n is 0 the function returns the start of the encoding of the character that contains the i-th byte of s. +-- This function assumes that s is a valid UTF-8 string. +function utf8.offset (s, n, i) end diff --git a/res/others/launch.json b/res/others/launch.json new file mode 100644 index 0000000..1320e9e --- /dev/null +++ b/res/others/launch.json @@ -0,0 +1,30 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "lua", + "request": "launch", + "name": "LuaPanda", + "cwd": "${workspaceFolder}", + "luaFileExtension": "lua", + "connectionPort": 8818, + "pathCaseSensitivity": true, + "stopOnEntry": true, + "useCHook": true, + "autoPathMode": false, + "logLevel": 1, + }, + { + "type": "lua", + "request": "launch", + "name": "LuaPanda-DebugFile", + "luaPath": "", + "packagePath": [], + "luaFileExtension": "", + "connectionPort": 8818, + "stopOnEntry": true, + "useCHook": true, + "logLevel": 1 + } + ] +} \ No newline at end of file diff --git a/res/snippets/snippets.json b/res/snippets/snippets.json new file mode 100755 index 0000000..068dfa9 --- /dev/null +++ b/res/snippets/snippets.json @@ -0,0 +1,99 @@ +{ + "local": { + "prefix": "local", + "body": "local ${1:var} = ${0:nil}", + "description": "local variable = ..." + }, + "if": { + "prefix": "if", + "body": "if ${1:condition} then\n\t${0:-- body}\nend", + "description": "if" + }, + "else if": { + "prefix": "else if", + "body": "else if ${1:condition} then\n\t${0:-- body}", + "description": "else if" + }, + "else": { + "prefix": "else", + "body": "else\n\t${0:-- body}", + "description": "else" + }, + "for": { + "prefix": "for", + "body": "for ${1:index} = ${2:1}, ${3:10} do\n\t${0:-- body}\nend", + "description": "for index = 1, n do end" + }, + "fori": { + "prefix": "for index, value in ipairs", + "body": "for ${1:index}, ${2:value} in ipairs(${3:Table}) do\n\t${0:-- body}\nend", + "description": "for index, value in ipairs(table) do end" + }, + "forp": { + "prefix": "for key, value in pairs", + "body": "for ${1:key}, ${2:value} in pairs(${3:Table}) do\n\t${0:-- body}\nend", + "description": "for key, value in pairs(table) do end" + }, + "do": { + "prefix": "do", + "body": "do\n\t${0:-- body}\nend", + "description": "do" + }, + "while": { + "prefix": "while", + "body": "while ${1:condition} do\n\t${0:-- body}\nend", + "description": "while" + }, + "repeat": { + "prefix": "repeat", + "body": "repeat\n\t${0:-- body}\nuntil ${1:condition}", + "description": "repeat" + }, + "local function": { + "prefix": "local function", + "body": "local function ${1:func}(${2:})\n\t${0:-- body}\nend", + "description": "local function" + }, + "function": { + "prefix": "function", + "body": "function ${1:func}(${2:})\n\t${0:-- body}\nend", + "description": "function" + }, + "require": { + "prefix": "require", + "body": "require (\"${1:}\")\n${0:}", + "description": "function" + } , + "true": { + "prefix": "true", + "body": "true" + }, + "false": { + "prefix": "false", + "body": "false" + }, + "nil": { + "prefix": "nil", + "body": "nil" + } , + "and": { + "prefix": "and", + "body": "and" + }, + "or": { + "prefix": "or", + "body": "or" + }, + "not": { + "prefix": "not", + "body": "not" + }, + "end": { + "prefix": "end", + "body": "end" + }, + "then": { + "prefix": "then", + "body": "then" + } +} \ No newline at end of file diff --git a/res/web/settings.html b/res/web/settings.html new file mode 100644 index 0000000..5f4a36f --- /dev/null +++ b/res/web/settings.html @@ -0,0 +1,249 @@ + + + + + + + LuaPanda Setting + + + + +

LuaPanda Settings

+ LuaPanda on github
+

+ +
+ luaFileExtension
+ connectionPort:
+ cwd:
+ + pathCaseSensitivity: +
+ + +

+ + stopOnEntry: +
+ + +

+ + useCHook: +
+ + +

+ + autoPathMode: +
+ + +
+ +
+ +
+ + + + + + + + \ No newline at end of file diff --git a/src/code/server/codeCompleting.ts b/src/code/server/codeCompleting.ts new file mode 100644 index 0000000..3a1726c --- /dev/null +++ b/src/code/server/codeCompleting.ts @@ -0,0 +1,401 @@ +// Tencent is pleased to support the open source community by making LuaPanda available. +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +// https://opensource.org/licenses/BSD-3-Clause +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +import { CodeEditor } from './codeEditor'; +import * as Tools from "./codeTools"; +import { + CompletionItem, + CompletionItemKind, + InsertTextFormat, + Position +} from 'vscode-languageserver'; +// import { Logger } from './codeLogManager'; +import { CodeSymbol } from "./codeSymbol"; +import { CodeDefinition } from './codeDefinition'; +import { TypeInfer } from './typeInfer'; + +export class CodeCompleting { + private static maxSearchLen = 100; //类型搜索时处理的最大数量 + private static replaceDic; //记录用作替换的searchName ,保证搜索的tag最后能转回用户输入 + private static alreadychkSymbol; //记录搜索过的关键字,防止循环搜索 + + private static fmtParamToSnippet(paramArray: string[]): string { + let snippet = '(' + paramArray.map((param, i) => `\${${i + 1}:${param}}`).join(', ') + ')'; + return snippet; + } + + private static getDocCommentInsertText(functionName: string, paramArray: string[]): string { + let docCommentSnippet = " " + functionName + " ${1:Description of the function}"; + + let maxParamLength = 0; + paramArray.forEach((param) => { + maxParamLength = Math.max(maxParamLength, param.length); + }); + + let i = 2; + paramArray.forEach((param) => { + param += Tools.getNSpace(maxParamLength - param.length); + docCommentSnippet += `\n-- @param ${param} \${${i++}:Describe the parameter}`; + }); + + return docCommentSnippet; + } + + private static getDocCommentCompletingItem(uri: string, line: number): CompletionItem { + let functionInfo = CodeDefinition.getFunctionInfoByLine(uri, line); + if (functionInfo.functionName == "") { + return null; + } + + let completeItem = { + label: functionInfo.functionName + " doc comment", + kind: CompletionItemKind.Snippet, + insertText: this.getDocCommentInsertText(functionInfo.functionName, functionInfo.functionParam), + detail: "Write some document comments for the function.", + insertTextFormat: InsertTextFormat.Snippet + }; + return completeItem; + } + + //把字符串按. 或者 : 分割成数组。若不含: . 则数组中只有一个元素 + private static splitStringwithTrigger(str){ + let userInputTxt_DotToBlank = str.replace(/[\.:]/g, ' '); + let userInputArr = userInputTxt_DotToBlank.split(' '); + return userInputArr; + } + + // 根据tag类型修改查找值 + private static searchTag( addElement, prefix, completingArray, uri) { + // 防止循环搜索 + if(this.alreadychkSymbol[addElement.searchName]){ + return; + } + this.alreadychkSymbol[addElement.searchName] = true; + + //若 retSymb[idx] 有tag + let searchName = addElement.searchName ; + if(addElement.tagReason == Tools.TagReason.UserTag || addElement.tagReason == Tools.TagReason.Equal){ + // 用户标记 / 等号标记 + searchName = addElement.tagType; + this.realSearchTag(addElement, prefix, completingArray, uri, searchName) + } + + if(addElement.tagReason == Tools.TagReason.MetaTable){ + //元表标记 + searchName = addElement.tagType + ".__index"; + this.realSearchTag(addElement, prefix, completingArray, uri, searchName); + } + + // 符号 = 文件返回值 + if(addElement.requireFile && addElement.requireFile.length > 0){ + let uri = Tools.transFileNameToUri(addElement.requireFile); + let retTag = CodeSymbol.getCertainDocReturnValue(uri);//类似于使用@type得到的类型 + if(retTag && retTag.length > 0){ + searchName = retTag; + } + this.realSearchTag(addElement, prefix, completingArray, uri, searchName); + } + + //函数返回值 + if(addElement.funcRets){ + searchName = addElement.funcRets.name; + this.realSearchTag(addElement, prefix, completingArray, uri, searchName, true); + } + } + + // 真正做tag查找的位置 + private static realSearchTag(addElement, prefix, completingArray, uri, searchName, isAllowNoPrefixEQ?) { + let finalInsertText; + //如果有tagtype, 再去符号表中查找tagtype + let tagSearchRetSymb; + if( addElement.requireFile ){ + //含有引用 tag,只搜索引用文件的符号 + let uri = Tools.transFileNameToUri( addElement.requireFile ); + tagSearchRetSymb = CodeSymbol.searchSymbolinDoc(uri, searchName, Tools.SearchMode.FirstLetterContinuousMatching); + }else if(addElement.funcRets){ + //含有func 返回,搜索对应函数 + let funcSearchRet = CodeSymbol.searchAllSymbolinRequireTreeforCompleting( uri , searchName, Tools.SearchMode.ExactlyEqual); + let retName = '' + for (let index = 0; index < funcSearchRet.length; index++) { + const element = funcSearchRet[index]; + if( element['chunk'] && element['chunk']['returnSymbol']){ + retName = element['chunk']['returnSymbol']; + break; + } + } + + tagSearchRetSymb = CodeSymbol.searchSymbolinDoc(uri, retName, Tools.SearchMode.FirstLetterContinuousMatching); + if(tagSearchRetSymb && tagSearchRetSymb.length > 0){ + searchName = retName; + } + + }else{ + tagSearchRetSymb = CodeSymbol.searchGlobalInRequireTree(searchName, uri, Tools.SearchMode.FirstLetterContinuousMatching ); + } + if( !tagSearchRetSymb || tagSearchRetSymb.length < 1 ){ + //当直接替换tag查不到的时候,用一次类型推导 + tagSearchRetSymb = TypeInfer.processCompleting(searchName, uri); + if(tagSearchRetSymb && tagSearchRetSymb.length > 0){ + //记录做了哪些替换,以便补回来 + this.replaceDic[tagSearchRetSymb[0].searchName] = addElement.searchName; + searchName = tagSearchRetSymb[0].searchName; + //再做一次搜索 + tagSearchRetSymb = CodeSymbol.searchGlobalInRequireTree(tagSearchRetSymb[0].searchName , uri, Tools.SearchMode.FirstLetterContinuousMatching ); + }else{ + // tag 符号没有查到,类型推导也没有找到。 + return; + } + } + + let srarchLen = tagSearchRetSymb.length; + if(tagSearchRetSymb.length > this.maxSearchLen){ + srarchLen = this.maxSearchLen; + } + + //遍历tag的搜索结果。这里的结果通过FirstLetterContinuousMatching搜索出来的。 + //这里要做的工作就是。替换tag,替换用户prefix, 删除searchprefab + for (let j = 0; j < srarchLen; j++) { + //替换tag + const element = tagSearchRetSymb[j]; + let SCHName = element.searchName; + + if(searchName != addElement.searchName){ + this.replaceDic[searchName] = addElement.searchName; + } + let ecee = addElement.searchName + while(this.replaceDic[ecee]){ + if(this.replaceDic[ecee] == ecee) break; + ecee = this.replaceDic[ecee]; + } + SCHName = SCHName.replace(searchName, ecee); + //替换用户prefix + let reg = new RegExp( /[\.:]/, 'g') + let prefix_dot = prefix.replace( reg , '[\.:]' ); + let prefix_dot_list = prefix_dot.split('[\.:]'); + prefix_dot_list.pop(); + prefix_dot_list.push(''); + prefix_dot = prefix_dot_list.join('[\.:]'); + // 如果搜索到的匹配项无法覆盖用户输入,去除 + let matRes = SCHName.match(RegExp( prefix_dot, 'i')); + if(matRes){ + finalInsertText = SCHName.replace(RegExp( prefix_dot, 'i'), ''); + }else{ + // 未能匹配到用户输入. 性能消耗大,暂时去掉 + + //此时不代表有错误,比如函数的返回值一类 + this.searchTag(element, prefix, completingArray, uri) + + if(isAllowNoPrefixEQ){ + finalInsertText = SCHName; + }else{ + continue; + } + } + + let reasionString; + if(addElement.tagReason == Tools.TagReason.UserTag){ + reasionString = "---@type " + addElement.searchName + " = " + searchName; + } + if(addElement.tagReason == Tools.TagReason.MetaTable){ + reasionString = "setmetatable(" + addElement.searchName + " , " + searchName + ")"; + } + + let completeKind : CompletionItemKind + + let InsText = finalInsertText; + switch(element.kind){ + case 12: + completeKind = CompletionItemKind.Function; + InsText = finalInsertText + this.fmtParamToSnippet(element.funcParamArray); + reasionString = element.name; + break; + default: + completeKind = CompletionItemKind.Text; + } + + let completeItem = { + label: finalInsertText, + kind: completeKind, + insertText: InsText, + detail : reasionString, // 这里写明是元表还是标记 + insertTextFormat: InsertTextFormat.Snippet + } + if(completeItem.label == undefined){ + completeItem.label = "error undefined!"; + }else{ + completingArray.push(completeItem); + } + } + } + + // 获取补全提示数组 + public static getCompletingArray(uri : string, pos: Position): CompletionItem[]{ + let completingArray = new Array(); + let luaText = CodeEditor.getCode(uri); + // 取出用户输入的字符串 + let prefix = Tools.getTextByPosition(luaText , pos); + // 文档注释 + if (prefix == "---") { + if (Tools.isNextLineHasFunction(luaText, pos) == false) { + return completingArray; + } + completingArray.push(this.getDocCommentCompletingItem(uri, pos.line + 1)); + return completingArray; + } + + //prefix是用户输入的信息。searchPrefix替换用户的输入,用于FirstLetterContinuousMatching搜索 + // 比如 local ff = aa, 用户输入ff.的时候,直接查是查不到的 + // + let searchPrefix = prefix; + //判断用户输入是否含有分隔符 + let userInputArr = this.splitStringwithTrigger(prefix); + let tagResSplitByBlank; + //有分隔符时 + if (userInputArr && userInputArr.length > 1){ + //因为tag是精确搜索,所以要把最后一项未写完的部分去掉。比如 aa.bb.c(未写完) => aa.bb + userInputArr.pop(); + //进行tag搜索 + let offlastprefix = userInputArr.join('.'); + let tagResArr =TypeInfer.processCompleting(offlastprefix ,uri); + + //搜到了tag + if( tagResArr && tagResArr.length > 0 ){ + tagResSplitByBlank = tagResArr[0].searchName.replace(/[\.:]/g, ' ').split(' '); //把. 和 :转为空格 + let L1 = userInputArr.length -1 ; //用户输入 + let L2 = tagResSplitByBlank.length - 1; //tag搜索 + while(L1 >=0 && L2>=0){ + if(userInputArr[L1] == tagResSplitByBlank[L2]){ + L1 --; + L2 --; + userInputArr.pop(); + tagResSplitByBlank.pop(); + }else{ + break; + } + } + + //替换掉后面用于FirstLetterContinuousMatching搜索的值。因为 + // aa = {bb = { cc = {dd = 9}}} + // local ffffff = aa + // ffffff.bb.cc 会搜出来 aa.bb + searchPrefix = tagResArr[0].searchName; + } + } + + //无分隔符 + //在符号中搜索prefix开头的符号,组成提示内容。 + let retSymb = CodeSymbol.searchAllSymbolinRequireTreeforCompleting(uri, searchPrefix, Tools.SearchMode.FirstLetterContinuousMatching); + if(!retSymb) return; + let srarchLen = retSymb.length; + + for(let idx = 0 ; idx < srarchLen; idx ++){ + if( !retSymb[idx] ) continue; //有错误 + let finalInsertText; //最终的提示字符串 + if(retSymb[idx].searchName != searchPrefix ){ + //用户输入信息 < 当前搜索到的Symbol,把当前符号也加入补全列表 + finalInsertText = retSymb[idx].searchName; + } + //搜索结果10以内才使用 类型推导,否则会卡顿 + if( srarchLen < this.maxSearchLen && (retSymb[idx].tagType || retSymb[idx].requireFile || retSymb[idx].funcRets) ){ + //如果当前搜索结果有tag,搜索一次tag + this.alreadychkSymbol = new Object(); + this.replaceDic = new Object(); + this.searchTag(retSymb[idx], prefix, completingArray, uri) + }else{ + // retSymb[idx] 当前项目没有tag。 + // 判断用户输入的前缀有没有. 如果没有不需要做[前缀替换] 和 [tag替换] + if(prefix.match(/[\.:]/)){ + try{ + //tag 替换 + let beReplaceStr = retSymb[idx].searchName; + let beReplStr = tagResSplitByBlank.join('.'); + let replStr = userInputArr.join('.'); + beReplaceStr = beReplaceStr.replace(beReplStr, replStr); + //前缀替换 + let reg = new RegExp( /[\.:]/, 'g') + let prefix_dot = prefix.replace( reg , '[\.:]' ); + let prefix_dot_list = prefix_dot.split('[\.:]'); + prefix_dot_list.pop(); //把最后一位去掉 + prefix_dot_list.push(''); + prefix_dot = prefix_dot_list.join('[\.:]'); + // 用户已输入的前缀剔除 + let matRes = beReplaceStr.match(RegExp( prefix_dot, 'i')); + if(matRes){ + finalInsertText = beReplaceStr.replace(RegExp( prefix_dot, 'i'), ''); + }else{ + continue; + } + }catch{ + finalInsertText = retSymb[idx].originalName; + } + }else{ + //没有"." 不需要做[用户输入前缀替换]。使用搜索出来的searchName作为最终的结果 + finalInsertText = retSymb[idx].searchName; + } + } + + let completeKind : CompletionItemKind + let labelTxt = finalInsertText; + switch(retSymb[idx].kind){ + case 12: + completeKind = CompletionItemKind.Function; + finalInsertText = finalInsertText + this.fmtParamToSnippet(retSymb[idx].funcParamArray); + break; + default: + completeKind = CompletionItemKind.Text; + } + + let completeItem = { + label: labelTxt, + kind: completeKind, + insertText: finalInsertText, + detail : retSymb[idx].name, + insertTextFormat: InsertTextFormat.Snippet + } + if(completeItem.label == undefined){ + completeItem.label = "error undefined!"; + }else{ + completingArray.push(completeItem); + } + } + + // 符号去重 + let retCompleteItem = this.completeItemDuplicateRemoval(completingArray); + return retCompleteItem; + } + + + //消除重复的符号 + private static completeItemDuplicateRemoval(completingArray){ + let retCompItemList = new Array(); + for (let index = 0; index < completingArray.length; index++) { + let DuplicateFlag = false; + const completeItem = completingArray[index]; + for (let retIdx = 0, len = retCompItemList.length; retIdx < len; retIdx++) { + if( this.ItemIsEq( completeItem, retCompItemList[retIdx] ) ){ + DuplicateFlag = true; + break; + } + } + if(! DuplicateFlag ){ + retCompItemList.push(completeItem); + } + } + return retCompItemList; + } + + //判断CompleteItem是否相等 + private static ItemIsEq(item1, item2):boolean{ + if(item1.label === item2.label && + item1.kind === item2.kind && + item1.insertText === item2.insertText && + item1.insertTextFormat === item2.insertTextFormat ){ + return true; + } + return false; + } + +} diff --git a/src/code/server/codeDefinition.ts b/src/code/server/codeDefinition.ts new file mode 100644 index 0000000..8f650c2 --- /dev/null +++ b/src/code/server/codeDefinition.ts @@ -0,0 +1,182 @@ +// Tencent is pleased to support the open source community by making LuaPanda available. +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +// https://opensource.org/licenses/BSD-3-Clause +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +import { + Location, + TextDocumentPositionParams, + SymbolKind +} from 'vscode-languageserver'; +import { Logger } from './codeLogManager'; +import { CodeSymbol } from "./codeSymbol"; +import { TypeInfer } from "./typeInfer" +import * as Tools from "./codeTools"; + +//查找定义的主函数 +export class CodeDefinition { + public static getSymbalDefine(info: TextDocumentPositionParams, isRetSymbol?) { + isRetSymbol = isRetSymbol || false; + Tools.transPosStartLineTo1(info.position); + //获取指定文件的doc信息容器 + let uri = info.textDocument.uri; + let astContainer = CodeSymbol.docSymbolMap.get(uri); + if(!astContainer){ + Logger.InfoLog("[Error] getSymbalDefine can’t find AST"); + return null; + } + // 根据VSCode提供的符号位置查询查号名 + let symbRet = astContainer.searchDocSymbolfromPosition(info.position); + //全局查找定义 + if (symbRet != undefined && symbRet['sybinfo'] != undefined) { + let symbolInfo = symbRet['sybinfo']; + let containerList = symbRet['container']; + let symbInstance = TypeInfer.processDefineSymbolTag(symbolInfo, uri); // 查找定义 + if(!symbInstance || symbInstance.length == 0) return; // 未能查到定义 + Tools.transPosStartLineTo0(info.position); + if(symbolInfo.isLocal){ + // 同级优先,上方最近 + symbInstance = this.judgeLocalDefinition(symbInstance, containerList, info); + }else{ + // 最远原则 + symbInstance = symbInstance[symbInstance.length - 1]; + } + + // 此处应该保证 symbInstance是一个实例(不是数组) + if( !symbInstance ) return; //没找到,或过滤后没有适合的符号 + if(isRetSymbol) return symbInstance; //回传符号,而不是位置信息 + let retLoc = Location.create(symbInstance.containerURI, symbInstance.location.range); + return retLoc; + } else { + //没找到符号,判断require文件的情况 + let reqFileName = astContainer.searchDocRequireFileNameFromPosition(info.position); + let uri = Tools.transFileNameToUri(reqFileName); + if(uri.length > 0){ + return Tools.createEmptyLocation(uri); + } + return; + } + } + + +//----------------------------------------------------------------------------- +//-- 局部变量的处理 +//----------------------------------------------------------------------------- + // 得到了多个 symbInstance,要判断那个是目标。 这个函数只处理局部变量,全局变量按照引用树只搜索出一个结果,无需判断 + // @symbArray match的symb数组 + // @findoutSymbols 找到的定义信息 + // @containerList 被查找信息的深度 + // @docPosition vscode获取的位置 + //函数要求,可能传入1到多个符号,返回最符合的1个符号. 先比较container , 查出所有本层/上层定义,之后找同层最近的,没有则向上 + private static judgeLocalDefinition(findoutSymbols, containerList, docPosition) { + // let userClickLine = docPosition.position.line; + if( !findoutSymbols || findoutSymbols.length <= 0 || !docPosition || !containerList || containerList.length <= 0) return; + + + if(findoutSymbols.length == 1) return findoutSymbols[0]; + //查出所有findoutSymbols的共同深度,数字越大共同深度越多,不在一个chunk中是-1 + let commonDepth = this.findCommonDepth(containerList, findoutSymbols); + //找出共同深度最大值 + let maxComDep = 0; //最大相同深度 + for (let index = 0; index < commonDepth.length; index++) { + if (maxComDep < commonDepth[index]){ + maxComDep = commonDepth[index]; + } + } + + let maxArray = new Array(); + for (let index = 0; index < commonDepth.length; index++) { + if (maxComDep == commonDepth[index]){ + maxArray.push(findoutSymbols[index]); + } + } + //此时maxArray中记录了共同深度最大的符号 + if(maxArray.length == 1){ + return maxArray[0]; + } + //findUpNearestSymbol 的作用是寻找line在上方并最近的符号 + return this.findUpNearestSymbol(docPosition.position, maxArray); + } + + //查找上方最近的符号 + public static findUpNearestSymbol(docPosition, maxArray){ + let distanceLineNumber = new Array(); + let standardLine = docPosition.line; + // 使用standardLine - upLine得到符号差值,这个值如果为负,忽略。 + // 差值越小离得越近 + for (const key in maxArray) { + const element = maxArray[key]; + let upLine = element.location.range.start.line; + distanceLineNumber[key] = standardLine - upLine; //数值越小越好 + } + + //寻找最小差值 + let minComDep = 99999; + for (let index = 0; index < distanceLineNumber.length; index++) { + if (distanceLineNumber[index] < minComDep && distanceLineNumber[index] >= 0){ + minComDep = distanceLineNumber[index]; + } + } + + let minSymbolIdx; + for (let index = 0; index < distanceLineNumber.length; index++) { + if (minComDep == distanceLineNumber[index]){ + minSymbolIdx = index; + break; + } + } + + return maxArray[minSymbolIdx]; + } + + //查找符号的共同深度 , 当不在同一个chunk时返回-1 , 数字表示相同的chunk数 + //standradDepth被查找的符号深度 + //beFindSymbolList找到的定义深度 + public static findCommonDepth( standradDepth , beFindSymbolList){ + let retArray = new Array(); + + //评估各个符号和标准深度的相同深度 + for (const key in beFindSymbolList) { + const element = beFindSymbolList[key]; + + //定义深度 > 被查找元素深度 + if (standradDepth.length < element.containerList.length) { + retArray[key] = -1; + continue; + } + //遍历一个具体的待查找深度 + for (let index = 0; index < standradDepth.length; index++) { + let standardChunk = standradDepth[index]; + let beAnalyzeDepth = element.containerList[index]; + if (standardChunk && beAnalyzeDepth &&standardChunk.chunkName == beAnalyzeDepth.chunkName && standardChunk.loc.start.line == beAnalyzeDepth.loc.start.line && standardChunk.loc.end.line == beAnalyzeDepth.loc.end.line){ + retArray[key] = index + 1; + }else{ + if(standardChunk && !beAnalyzeDepth){ + + }else{ + retArray[key] = -1; + } + } + } + } + //如果有多个最大值,对比 + return retArray; + } + + + // 按行号查询function + public static getFunctionInfoByLine(uri: string, line: number): { functionName: string, functionParam: string[] } { + let displaySymbolArray = CodeSymbol.getCertainDocSymbolsReturnArray(uri, null, Tools.SearchRange.AllSymbols); + let result = { functionName: "", functionParam: [] }; + for (const key in displaySymbolArray) { + const docDisplaySymbol = displaySymbolArray[key]; + if (docDisplaySymbol.kind == SymbolKind.Function && docDisplaySymbol.location.range.start.line == line) { + result.functionName = docDisplaySymbol.searchName; + result.functionParam = docDisplaySymbol.funcParamArray; + return result; + } + } + return result; + } +} \ No newline at end of file diff --git a/src/code/server/codeEditor.ts b/src/code/server/codeEditor.ts new file mode 100644 index 0000000..e16473b --- /dev/null +++ b/src/code/server/codeEditor.ts @@ -0,0 +1,30 @@ +// Tencent is pleased to support the open source community by making LuaPanda available. +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +// https://opensource.org/licenses/BSD-3-Clause +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +import * as Tools from './codeTools'; +import { Logger } from './codeLogManager'; + +// 保存Editor中的代码 +export class CodeEditor { + public static codeInEditor = new Map(); + + public static saveCode( uri : string , text : string) { + this.codeInEditor[uri] = text; + } + + public static getCode( uri : string ): string { + if(this.codeInEditor[uri]){ + return this.codeInEditor[uri]; + }else{ + let luatxt = Tools.getFileContent(Tools.uriToPath(uri)); + if(!luatxt){ + Logger.InfoLog("[Error] getCode can’t get file content. uri:" + uri); + return; + } + return luatxt; + } + } +} \ No newline at end of file diff --git a/src/code/server/codeHighlight.ts b/src/code/server/codeHighlight.ts new file mode 100644 index 0000000..77d07bd --- /dev/null +++ b/src/code/server/codeHighlight.ts @@ -0,0 +1 @@ +//代码高亮 \ No newline at end of file diff --git a/src/code/server/codeLinting.ts b/src/code/server/codeLinting.ts new file mode 100644 index 0000000..11aa6bc --- /dev/null +++ b/src/code/server/codeLinting.ts @@ -0,0 +1,137 @@ +// Tencent is pleased to support the open source community by making LuaPanda available. +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +// https://opensource.org/licenses/BSD-3-Clause +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +// 语法检查 +import { + TextDocument, + // Connection, + DiagnosticSeverity, + Diagnostic, + Range +} from 'vscode-languageserver'; +import * as Tools from "./codeTools"; +import { LuaAnalyzerSettings } from "./server"; +import { spawnSync } from 'child_process'; + +let os = require('os'); + +export class CodeLinting { + static luacheckResultRegExp = /^(.+):(\d+):(\d+)-(\d+): \(([EW])(\d+)\) (.+)$/; + public static processLinting(textDocument: TextDocument, settings: LuaAnalyzerSettings, globalVariables: string[]): Promise<{}> { + let fileName = Tools.uriToPath(Tools.urlDecode(textDocument.uri)); + let luacheck: string = this.getLuacheck(settings); + let luacheckArgs: string[] = this.getLuacheckArgs(settings, fileName, globalVariables); + let fileContent = textDocument.getText(); + let luacheckProcess = new Promise((resolve, reject) => { + let checkResult = spawnSync(luacheck, luacheckArgs, {input: fileContent}); + // luacheck 错误码1或2表示检查到error或warning + if (checkResult.status == 1 || checkResult.status == 2) { + reject(checkResult.output.join('\n')); + } + else if (checkResult.status == 0) { + resolve(); + } + else { + // error log + resolve(); + } + }); + return luacheckProcess; + } + + private static getLuacheck(settings: LuaAnalyzerSettings): string { + let luacheck: string = settings.codeLinting.luacheckPath; + if ( luacheck != "") { + return luacheck; + } + + // 如果用户未配置则使用默认配置 + if (os.type() == "Windows_NT") { + luacheck = __dirname + "/../thirdparty/luacheck.exe"; + } + else { + luacheck = '/usr/local/bin/luacheck'; + } + return luacheck; + } + + private static getLuacheckArgs(settings: LuaAnalyzerSettings, fileName: string, globalVariables: string[]): string[] { + let luacheckArgs: string[] = []; + + let luaVersion = settings.codeLinting.luaVersion; + switch (luaVersion) { + case "5.1": + luacheckArgs.push("--std", "lua51"); + break; + case "5.3": + luacheckArgs.push("--std", "lua53"); + break; + case "5.1+5.3": + luacheckArgs.push("--std", "lua51+lua53"); + break; + default: + } + let userIgnoreGlobals: string[] = settings.codeLinting.ignoreGlobal.split(";"); + let ignoreGlobals: string[] = userIgnoreGlobals.concat(globalVariables); + if (ignoreGlobals.length > 0) { + luacheckArgs.push("--globals", ...ignoreGlobals); + } + let maxLineLength = settings.codeLinting.maxLineLength; + luacheckArgs.push("--max-line-length", maxLineLength.toString()); + luacheckArgs.push("--allow-defined"); + luacheckArgs.push("--ranges"); + luacheckArgs.push("--codes"); + luacheckArgs.push("--formatter", "plain"); + luacheckArgs.push("--filename", fileName); + luacheckArgs.push("-"); + return luacheckArgs; + } + + public static parseLuacheckResult(luaErrorOrWarning, settings: LuaAnalyzerSettings) { + let diagnosticArray: Diagnostic[] = []; + + // if (luaErrorOrWarning.stdout === undefined) { + // return diagnosticArray; + // } + + let maxNumberOfProblems = settings.codeLinting.maxNumberOfProblems; + let ignoreErrorCode: string[] = settings.codeLinting.ignoreErrorCode.split(";"); + const luaErrorOrWarningArray: string[] = luaErrorOrWarning.split(/\r\n|\r|\n/); + for (let i = 0, problems = 0; i < luaErrorOrWarningArray.length && problems < maxNumberOfProblems; i++) { + let regResult = this.luacheckResultRegExp.exec(luaErrorOrWarningArray[i]); + if (!regResult) { + continue; + } + + let line = parseInt(regResult[2]); + let startCharacter = parseInt(regResult[3]); + let endCharacter = parseInt(regResult[4]); + let errorType = regResult[5]; + let severity = errorType == "E"? DiagnosticSeverity.Error : DiagnosticSeverity.Warning; + let errorCode = parseInt(regResult[6]); + let message = regResult[7]; + let range = Range.create(line - 1, startCharacter - 1, line - 1, endCharacter); + + // 根据错误码忽略错误提示。luacheck ignore参数不能忽略error + if (ignoreErrorCode.includes(errorCode.toString())) { + continue; + } + + let diagnosic: Diagnostic = { + range : range, + severity: severity, + code : errorCode, + message : message, + source : "lua-analyzer" + }; + + problems++; + diagnosticArray.push(diagnosic); + } + + return diagnosticArray; + } +} diff --git a/src/code/server/codeLogManager.ts b/src/code/server/codeLogManager.ts new file mode 100644 index 0000000..790048e --- /dev/null +++ b/src/code/server/codeLogManager.ts @@ -0,0 +1,49 @@ +// Tencent is pleased to support the open source community by making LuaPanda available. +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +// https://opensource.org/licenses/BSD-3-Clause +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +export enum LogLevel{ + DEBUG = 0, + INFO = 1 , + ERROR = 2, + RELEASE = 3 +} +export class Logger { + public static currentLevel = LogLevel.DEBUG; + public static connection; + public static init() { + } + + public static log(str: string, level?) { + if(! level){ + level = LogLevel.DEBUG; + } + + if (str != "" && str != null) { + if(level == LogLevel.ERROR) this.ErrorLog(str); + if(level == LogLevel.INFO) this.InfoLog(str); + if(level == LogLevel.DEBUG) this.DebugLog(str); + } + } + + public static DebugLog(str: string){ + if( this.currentLevel <= LogLevel.DEBUG){ + this.connection.console.log(str); + } + } + + public static InfoLog(str: string){ + if( this.currentLevel <= LogLevel.INFO){ + this.connection.console.log(str); + } + } + + public static ErrorLog(str: string){ + if( this.currentLevel <= LogLevel.ERROR){ + this.connection.console.log(str); + } + } + +} diff --git a/src/code/server/codeReference.ts b/src/code/server/codeReference.ts new file mode 100644 index 0000000..5a5430b --- /dev/null +++ b/src/code/server/codeReference.ts @@ -0,0 +1,27 @@ +//查找引用 +// import * as Tools from "./codeTools"; +import { CodeSymbol } from "./codeSymbol"; +// import { Logger } from './codeLogManager'; +import { CodeDefinition } from './codeDefinition'; +// import { +// Location +// } from 'vscode-languageserver-protocol'; + +export class CodeReference { + public static getSymbalReferences(info){ + let refRet = new Array() + // 此处getDefine应该直接搜索 + let def = CodeDefinition.getSymbalDefine(info, true); + + let findDocRes = CodeSymbol.searchSymbolReferenceinDoc(def); + refRet.concat(findDocRes); + //形式转换 + for (let index = 0; index < findDocRes.length; index++) { + findDocRes[index].range.start.line = findDocRes[index].range.start.line -1; + findDocRes[index].range.start.character = findDocRes[index].range.start.column; + findDocRes[index].range.end.line = findDocRes[index].range.end.line -1; + findDocRes[index].range.end.character = findDocRes[index].range.end.column; + } + return findDocRes; + } +} \ No newline at end of file diff --git a/src/code/server/codeSymbol.ts b/src/code/server/codeSymbol.ts new file mode 100644 index 0000000..9c786e9 --- /dev/null +++ b/src/code/server/codeSymbol.ts @@ -0,0 +1,479 @@ +// Tencent is pleased to support the open source community by making LuaPanda available. +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +// https://opensource.org/licenses/BSD-3-Clause +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +//创建并管理文件中的符号 +import * as Tools from './codeTools'; +import { CodeEditor } from './codeEditor'; +import { DocSymbolProcesser } from './docSymbolProcesser'; +import { Logger } from './codeLogManager'; + +export class CodeSymbol { + // 用 kv 结构保存所有用户文件以及对应符号结构(包含定义符号和AST,以及方法) + public static docSymbolMap = new Map(); + // 用 kv 结构保存所有预置文件以及对应符号结构(包含定义符号和AST,以及方法) + public static preLoadSymbolMap = new Map(); + // 已处理文件列表,这里是防止循环引用 + private static alreadyProcessFile; + +//----------------------------------------------------------------------------- +//-- 创建单文件、工作区、预加载区、特定文件符号 +//----------------------------------------------------------------------------- + // 单文件内符号处理 + // 指定文件的符号 [单文件创建] | 无返回 . 如文档的符号已建立则直接返回 + public static createCertainDocSymbols(uri: string, luaText?: string) { + if ( ! this.docSymbolMap.has(uri)) { + this.refreshCertainDocSymbols(uri, luaText); + } + } + + // 指定文件的符号 [单文件刷新] | 无返回, 强制刷新 + public static refreshCertainDocSymbols(uri: string, luaText?: string) { + if(luaText == undefined){ + luaText = CodeEditor.getCode(uri); + } + this.createDocSymbals(uri, luaText); + } + + // 获取指定文件的所有符号 , 并返回Array形式 + public static getCertainDocSymbolsReturnArray(uri: string, luaText?: string, range?:Tools.SearchRange): Tools.SymbolInformation[] { + let docSymbals: Tools.SymbolInformation[] = []; + this.createCertainDocSymbols(uri, luaText); + switch(range){ + case Tools.SearchRange.GlobalSymbols: + docSymbals = this.docSymbolMap.get(uri).getGlobalSymbolsArray(); break; + case Tools.SearchRange.LocalSymbols: + docSymbals = this.docSymbolMap.get(uri).getLocalSymbolsArray(); break; + case Tools.SearchRange.AllSymbols: + docSymbals = this.docSymbolMap.get(uri).getAllSymbolsArray(); break; + } + return docSymbals; + } + + // 获取指定文件的所有符号 , 并返回Dictionary形式 + public static getCertainDocSymbolsReturnDic(uri: string, luaText?: string, range?:Tools.SearchRange): Tools.SymbolInformation[] { + let docSymbals: Tools.SymbolInformation[] = []; + this.createCertainDocSymbols(uri, luaText); + switch(range){ + case Tools.SearchRange.GlobalSymbols: + docSymbals = this.docSymbolMap.get(uri).getGlobalSymbolsDic(); break; + case Tools.SearchRange.LocalSymbols: + docSymbals = this.docSymbolMap.get(uri).getLocalSymbolsDic(); break; + case Tools.SearchRange.AllSymbols: + docSymbals = this.docSymbolMap.get(uri).getAllSymbolsDic(); break; + } + return docSymbals; + } + + // 获取指定文件的返回值,如无返回null + public static getCertainDocReturnValue(uri):string{ + let docSymbals = this.docSymbolMap.get(uri); + if(docSymbals) + return docSymbals.getFileReturnArray(); + else + return null; + } + + // 指定文件夹中的符号处理 + // 创建指定文件夹中所有文件的符号 [批量创建] + public static createFolderDocSymbols(path: string){ + if(path === undefined || path === ''){ + return; + } + let filesArray = Tools.getDirFiles( path ); + filesArray.forEach(pathArray => { + let uri = Tools.pathToUri(pathArray); + if(!this.docSymbolMap.has(uri)){ + this.createDocSymbals( uri , pathArray ); + } + }); + } + + // 刷新指定文件夹中所有文件的符号 [批量刷新] + public static refreshFolderDocSymbols(path: string){ + if(path === undefined || path === ''){ + return; + } + let filesArray = Tools.getDirFiles( path ); + filesArray.forEach(element => { + this.createDocSymbals( element ); + }); + } + + // 刷新 PreLoad 所有文件的符号 [PreLoad批量刷新] + public static refreshPreLoadSymbals(path: string){ + if(path === undefined || path === ''){ + return; + } + let filesArray = Tools.getDirFiles( path ); + filesArray.forEach(pathElement => { + this.createPreLoadSymbals( Tools.pathToUri(pathElement), pathElement ); + }); + } + + // 获取 workspace 中的全局符号, 以dictionary的形式返回 + public static getWorkspaceSymbols(range? : Tools.SearchRange){ + range = range || Tools.SearchRange.AllSymbols; + let filesMap = Tools.get_FileName_Uri_Cache(); + let g_symb = {}; + + for (const fileUri in filesMap) { + let g_s = this.getCertainDocSymbolsReturnDic( filesMap[fileUri], null, range); + for (const key in g_s) { + const element = g_s[key]; + g_symb[key] = element; + } + } + + return g_symb; + } + + // 获取Require文件中的全局符号(本文件引用的其他文件), 以dictionary的形式返回 + public static getRequireTreeGlobalSymbols(uri: string){ + if(uri === undefined || uri === ''){ + return; + } + + let fileList = this.getRequireTreeList(uri); + let g_symb = {}; + for (let index = 0; index < fileList.length; index++) { + let g_s = this.getCertainDocSymbolsReturnDic( fileList[index], null, Tools.SearchRange.GlobalSymbols); + for (const key in g_s) { + const element = g_s[key]; + g_symb[key] = element; + } + } + return g_symb; + } + + //reference处理 + public static searchSymbolReferenceinDoc(searchSymbol) { + let uri = searchSymbol.containerURI; + let docSymbals = this.docSymbolMap.get(uri); + return docSymbals.searchDocSymbolReference(searchSymbol); + } + + +//----------------------------------------------------------------------------- +//-- 搜索符号 +//----------------------------------------------------------------------------- + // 在[工作空间]查找符号(模糊匹配,用作搜索符号) + public static searchSymbolinWorkSpace(symbolStr: string, searchMethod: Tools.SearchMode, searchRange?: Tools.SearchRange): Tools.SymbolInformation[] { + if (symbolStr === '') { + return null; + } else { + let retSymbols: Tools.SymbolInformation[] = []; + for (let [ , value] of this.docSymbolMap) { + let docSymbals = value.searchMatchSymbal(symbolStr, searchMethod, searchRange); + let preS = this.searchPreLoadSymbols(symbolStr, searchMethod); + retSymbols = retSymbols.concat(docSymbals); + retSymbols = retSymbols.concat(preS); + } + return retSymbols; + } + } + + //在[指定文件]查找符号(模糊匹配,用作搜索符号) + // @return 返回值得到的排序: + // 如果是Equal搜索,从dic中检索,按照AST深度遍历顺序返回 + public static searchSymbolinDoc(uri:string, symbolStr: string, searchMethod: Tools.SearchMode, range?:Tools.SearchRange): Tools.SymbolInformation[] { + if (symbolStr === '' || uri === '' ) { + return null; + } + let docSymbals = this.docSymbolMap.get(uri); + let retSymbols = docSymbals.searchMatchSymbal(symbolStr, searchMethod, range); + return retSymbols; + } + + // 在[本文件引用的其他文件]上搜索所有符合的符号,用于 [代码提示 auto completion] + public static searchAllSymbolinRequireTreeforCompleting (uri:string, symbolStr: string, searchMethod: Tools.SearchMode): Tools.SymbolInformation[] { + if (symbolStr === '' || uri === '' ) { + return null; + } + //用户 > 系统 + CodeSymbol.alreadyProcessFile = new Object(); + let retS = this.recursiveSearchRequireTree(uri, symbolStr, searchMethod); + let preS = this.searchPreLoadSymbols(symbolStr, searchMethod); + if(retS){ + retS = retS.concat(preS); + }else{ + retS = preS; + } + Logger.log("ret len = "+ retS.length); + return retS; + } + + /** + * 向上遍历引用树,搜索全局变量定义(引用本文件的文件) | 这个方法主要适用于在引用树上查找全局变量 + * 搜索的原则为在引用树上优先搜索最近的定义,即先搜本文件,然后逆序搜索require的文件,再逆序搜索reference + * @param symbolInfo 要搜索的符号名 + * @param uri 查找的文件 + * @param searchedFiles 标记已经搜索过的文件,上层调用该方法时可以不传 + * @return 搜索结果,SymbolInformation数组 + */ + public static searchGlobalInRequireTree(symbolName: string, uri: string , searchMethod: Tools.SearchMode , searchedFiles?: Map): Tools.SymbolInformation[] { + if (searchedFiles == undefined) { + searchedFiles = new Map(); + } + let result: Tools.SymbolInformation[] = new Array(); + + // uri为空直接返回 + if (uri == "") { + return result; + } + + // 判断文件是否已搜索过 + if (searchedFiles.get(uri) == true) { + return result; + } + // 在单个文件中搜索全局变量 + let docSymbol = this.docSymbolMap.get(uri); + let searchResult = docSymbol.searchMatchSymbal(symbolName, searchMethod, Tools.SearchRange.GlobalSymbols); + result = result.concat(searchResult); + searchedFiles.set(uri, true); + + let requireFiles = this.docSymbolMap.get(uri).getRequiresArray(); + let references = this.docSymbolMap.get(uri).getReferencesArray(); + + // 搜索的原则为在引用树上优先搜索最近的定义,即先搜本文件,然后逆序搜索require的文件,再逆序搜索reference + // 搜索require的文件 + for (let i = requireFiles.length - 1; i >= 0; i--) { + let searchResult = this.searchGlobalInRequireTree(symbolName, Tools.transFileNameToUri(requireFiles[i].reqName), searchMethod, searchedFiles); + result = result.concat(searchResult); + } + // 搜索require本文件的文件(references) + for (let i = references.length - 1; i >= 0; i--) { + let searchResult = this.searchGlobalInRequireTree(symbolName, references[i], searchMethod, searchedFiles); + result = result.concat(searchResult); + } + + return result; + } + + //在预制文档中搜索 + public static searchPreLoadSymbols(symbolStr, searchMethod){ + let retSymbols = new Array(); + this.preLoadSymbolMap.forEach(element => { + let res = element.searchMatchSymbal(symbolStr, searchMethod, Tools.SearchRange.AllSymbols); + retSymbols = retSymbols.concat(res); + }); + return retSymbols; + } + + //查找符合某一深度的符号 + public static selectSymbolinCertainContainer(symbolList, containerList){ + if(!symbolList) return; + let retSymoblList = new Array(); + for (let index = 0; index < symbolList.length; index++) { + const symbol = symbolList[index]; + if(symbol.containerList.length == containerList.length){ + for (let containerIdx = 0; containerIdx < containerList.length; containerIdx++) { + if(containerList[containerIdx] != symbol.containerList[containerIdx]){ + //出现层级不相等 + break; + } + if(containerIdx == containerList.length - 1){ + //深度相等 + retSymoblList.push(symbol); + } + } + } + } + return retSymoblList; + } +//----------------------------------------------------------------------------- +//-- 私有方法 +//----------------------------------------------------------------------------- + + /** + * 重新分析文件后,根据require的文件的变动,更新本文件require的文件的reference,保留本文件的reference + * @param oldDocSymbol 上一次的docSymbol + * @param newDocSymbol 本次更新之后的docSymbol + */ + private static updateReference(oldDocSymbol: DocSymbolProcesser, newDocSymbol: DocSymbolProcesser) { + if (!oldDocSymbol) { + // 初次处理无需更新 + return; + } + // 保留本文件的reference(create的时候会被清空) + newDocSymbol.setReferences(oldDocSymbol.getReferencesArray()); + + let lastRequireFileArray = oldDocSymbol.getRequiresArray(); + let currentRequireFiles = newDocSymbol.getRequiresArray(); + + // 以下requireFile的含义均为本文件require的其他文件 + lastRequireFileArray.forEach((lastRequireFile) => { + // 本次代码改动删除之前的require语句,需要删除对应的reference关系 + let needDeleteReference = true; + currentRequireFiles.forEach((currentRequireFile) => { + if (currentRequireFile.reqName == lastRequireFile.reqName) { + needDeleteReference = false; + return; + } + }); + if (needDeleteReference) { + let lastRequireFileUri = Tools.transFileNameToUri(lastRequireFile.reqName); + let lastRequireFileDocSymbol = this.docSymbolMap.get(lastRequireFileUri); + let lastRequireFileReference = lastRequireFileDocSymbol.getReferencesArray(); + let index = lastRequireFileReference.indexOf(newDocSymbol.getUri()); + // 删除本文件require的文件对本文件的reference + lastRequireFileReference.splice(index, 1); + } + }); + } + // 创建某个lua文件的符号 + // @uri 文件uri + // @text 文件内容 + private static createDocSymbals(uri: string, luaText?: string): Tools.SymbolInformation[] { + if(uri == null) return null; + if (luaText == undefined) { + luaText = Tools.getFileContent(Tools.uriToPath(uri)); + } + let oldDocSymbol = this.docSymbolMap.get(uri); + let docSymbol: DocSymbolProcesser = DocSymbolProcesser.create(luaText, uri); + if(docSymbol){ + if( !docSymbol.parseError){ + //解析无误 + this.docSymbolMap.set(uri, docSymbol); + this.updateReference(oldDocSymbol, docSymbol); + }else{ + //解析过程有误 + if ( !this.docSymbolMap.get(uri) ){ + //map中还未解析过这个table + this.docSymbolMap.set(uri, docSymbol); + }else{ + //map中已有 + let oldLen = this.docSymbolMap.get(uri).getAllSymbolsArray().length; + let newLen = docSymbol.getAllSymbolsArray().length; + if (newLen > oldLen){ + this.docSymbolMap.set(uri, docSymbol); + this.updateReference(oldDocSymbol, docSymbol); + } + } + } + }else{ + return null; + } + } + + // 创建前置搜索文件的所有符号 + // @uri 文件uri + // @text 文件内容 + private static createPreLoadSymbals(uri: string, path?:string){ + if(!path){ + path = Tools.uriToPath(uri); + } + let luaText = Tools.getFileContent(path); + let docSymbol: DocSymbolProcesser = DocSymbolProcesser.create(luaText, uri, path); + this.preLoadSymbolMap.set(uri, docSymbol); + } + + // 获取某个文件的引用树列表 + private static getRequireTreeList(uri: string){ + if(uri === undefined || uri === ''){ + return; + } + + function recursiveGetRequireTreeList(uri: string, fileList: string[]){ + if(uri === undefined || uri === ''){ + return; + } + // 如果 uri 的符号列表不存在,创建 + if (!CodeSymbol.docSymbolMap.has(uri)) { + Logger.log("createDocSymbals : "+ uri); + let luaText = CodeEditor.getCode(uri); + CodeSymbol.createDocSymbals(uri, luaText); + } + + //如果uri所在文件存在错误,则无法创建成功。这里docProcesser == null + let docProcesser = CodeSymbol.docSymbolMap.get(uri); + if(docProcesser == null || docProcesser.getRequiresArray == null){ + Logger.log("get docProcesser or getRequireFiles error!"); + return; + } + + //当前文件已经在递归处理过了 + if(alreadyProcessFile[uri] == 1){ + return; + }else{ + alreadyProcessFile[uri] = 1; + } + + let reqFiles = docProcesser.getRequiresArray(); + for(let idx = 0, len = reqFiles.length ; idx < len ; idx++ ){ + let newuri = Tools.transFileNameToUri(reqFiles[idx]['reqName']) + recursiveGetRequireTreeList(newuri, fileList); + } + fileList.push(uri); + return fileList; + } + + let fileList = new Array(); + let alreadyProcessFile = new Object(); //防止循环引用 + recursiveGetRequireTreeList(uri, fileList); + return fileList; + } + + // 递归搜索 引用树,查找符号 + // @fileName 文件名 + // @symbolStr 符号名 + // @uri + private static recursiveSearchRequireTree(uri: string, symbolStr, searchMethod :Tools.SearchMode){ + if(uri === undefined || uri === ''){ + return; + } + + let retSymbArray = new Array(); + //如果 uri 的符号列表不存在,创建 + if (!this.docSymbolMap.has(uri)) { + Logger.log("createDocSymbals : "+ uri); + let luaText = CodeEditor.getCode(uri); + this.createDocSymbals(uri, luaText); + } + //开始递归 + //如果uri所在文件存在错误,则无法创建成功。这里docProcesser == null + let docProcesser = this.docSymbolMap.get(uri); + if(docProcesser == null || docProcesser.getRequiresArray == null){ + Logger.log("get docProcesser or getRequireFiles error!"); + return; + } + + //当前文件已经在递归处理中了 + if(this.alreadyProcessFile[uri] == 1){ + return; + }else{ + this.alreadyProcessFile[uri] = 1; + } + + Logger.log("recursiveSearchRequireTree process :" + uri); + // 在引用树上搜索符号,搜索的原则为优先搜索最近的定义,即先搜本文件,然后逆序搜索require的文件,再逆序搜索reference + // 分析自身文件的符号. 本文件,要查找所有符号,引用文件,仅查找global符号。这里要求符号分析分清楚局部和全局符号 + let docS = this.docSymbolMap.get(uri); + let retSymbols = docS.searchMatchSymbal(symbolStr, searchMethod, Tools.SearchRange.AllSymbols); + if(retSymbols.length > 0){ + //找到了,查找全部符号,压入数组 + retSymbArray = retSymbArray.concat(retSymbols); + } + // 逆序搜索require + let reqFiles = docProcesser.getRequiresArray(); + for(let idx = reqFiles.length -1; idx >= 0; idx--){ + let newuri = Tools.transFileNameToUri(reqFiles[idx]['reqName']); + let retSymbols = this.recursiveSearchRequireTree(newuri, symbolStr, searchMethod); + if(retSymbols != null && retSymbols.length > 0){ + retSymbArray = retSymbArray.concat(retSymbols); + } + } + // 逆序搜索reference + let refFiles = docProcesser.getReferencesArray(); + for(let idx = refFiles.length -1; idx >= 0; idx--){ + let newuri = refFiles[idx]; + let retSymbols = this.recursiveSearchRequireTree(newuri, symbolStr, searchMethod); + if (retSymbols != null && retSymbols.length > 0) { + retSymbArray = retSymbArray.concat(retSymbols); + } + } + return retSymbArray; + } +} diff --git a/src/code/server/codeTools.ts b/src/code/server/codeTools.ts new file mode 100644 index 0000000..0b25767 --- /dev/null +++ b/src/code/server/codeTools.ts @@ -0,0 +1,524 @@ +// Tencent is pleased to support the open source community by making LuaPanda available. +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +// https://opensource.org/licenses/BSD-3-Clause +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +import { Logger } from './codeLogManager'; +import URI from 'vscode-uri'; +let path = require('path'); +let dir = require('path-reader'); +let os = require('os'); +let urlencode = require('urlencode'); + +import { + Location, + Position, + SymbolKind, + Range, + Connection, + DocumentSymbol +} from 'vscode-languageserver'; +import * as fs from "fs"; +// import { isArray } from 'util'; +//----------------------------------------------------------------------------- +//-- 暂存的数据 +//----------------------------------------------------------------------------- + +let initParameter; //初始化参数 +export function getInitPara(){ + return initParameter; +} +export function setInitPara(para){ + initParameter = para; +} + +let loadedExt; // 已经过处理的文件后缀 +export function initLoadedExt(){ + loadedExt = new Object(); +} + +export function getLoadedExt(){ + return loadedExt; +} + +export function setLoadedExt(key){ + loadedExt[key] = true; +} + +let connection: Connection; //保存一份connection +export function setToolsConnection(conn: Connection) { + connection = conn; +} + +let rootFiles; +let fileName_Uri_Cache; + +//----------------------------------------------------------------------------- +//-- 枚举 +//----------------------------------------------------------------------------- +//搜索类型 +export enum SearchMode{ + ContinuousMatching, + ExactlyEqual, //精确查找 + FuzzyMatching, //模糊查找 + FirstLetterContinuousMatching, //前序匹配查找 +} + +//搜索范围 +export enum SearchRange{ + AllSymbols, //全体符号 + GlobalSymbols, + LocalSymbols +} + +// 记录tag的原因 +export enum TagReason{ + UserTag, + Equal, + MetaTable +} + +//----------------------------------------------------------------------------- +//-- 常用结构体 +//----------------------------------------------------------------------------- + +// 生成的符号信息 +export interface SymbolInformation { + name: string; //展示名 local a.b.c | function mt:fcun(para1) + searchName: string; //搜索名 a.b.c | mt:func (searchName在保存的时候,:全都用 . ) + originalName: string //符号原本名 c | func + kind: SymbolKind; //类型 + location: Location; //位置 + isLocal: boolean; // local / global + containerURI: string; // 所属的URI (file://) + containerPath: string; // 所属的文件路径 + containerName?: string; // 所属的函数名(展示用) + containerList?: Array; // 容器列表array + funcParamArray?: Array; // 函数参数数组,生成注释用 + tagType?: string; // 用户标记此符号的类型,用于处理 local a = require("xxx") 等接收返回值的形式 + requireFile?:string; // 符号是require文件的返回 + funcRets?; // 如果此符号是function的返回值,记录对应的function . 值是{ name; local }结构 + tagReason?: TagReason; // 标记原因,有标记必须写原因 + chunk?:chunkClass; // 如果此符号是一个function, 对应的chunk结构 +} + +// 搜索符号返回结构 +// 这个结构类似一个联合体,其中可能有搜索到的符号retSymbol, 也可以记录baseinfo信息。使用isFindout来指示是否搜索到符号 +export class searchRet { + isFindout: boolean; //是否找到 + container?: string[]; //深度层级列表 + retSymbol?: searchSymbolRet; //符号自身的信息 + baseinfo?: baseInfo; //基础层级的信息 + constructor(){ + this.isFindout = false; + } +} + +// 搜索结果(searchRet的子结构) +export interface searchSymbolRet { + name: string; //展示名 + isLocal: boolean; //是否local符号. 下面三个属性是找到才需要的 + location?: Location; + containerURI: string | null; //所属的文件名 +} + +// base 基类(table)信息 (searchRet的子结构) +export interface baseInfo { + name: string; //展示名 + isLocal: boolean; //是否local符号. 下面三个属性是找到才需要的 + identiferStr?:string; +} + +// 注释的类型信息 +export interface commentTypeInfo { + reason: TagReason; //注释的原因 + newType: string; //新类型 + oldType?: string; //旧类型 setmetatable(旧,新) + location?: Location; + name?:string; //被注释的变量名 +} + +// 注释的类型信息 +export interface functionRetInfo { + functionName:string; // 如果是函数返回信息,要填充这个参数 + loc: Location; +} + +// 引用文件的信息, require保存文件名是为了实现点击文件名跳转 +export interface requireFileInfo{ + reqName:string; + loc:Location; +} + +//chunks 结构体 +export class chunkClass { + chunkName:string; + loc:Location; + returnSymbol; //返回的变量值 + constructor(name, loc){ + this.chunkName = name; + this.loc = loc; + } +} + +// 一个lua文件中包含的所有信息 +export class docInformation { + // lua文本基础内容 + docAST; //文本解析出的AST树 + docUri:string; //文件URL + docPath :string; //文件路径 + // 符号表 + defineSymbols; //定义符号表 + // 文件的引用和被引用情况 + requires:requireFileInfo[]; //本文件引用的文件列表(require 是有序的,类型是array) + references: string[]; // require本文件的其他文件的uri(array) + + constructor(docAST , docUri , docPath){ + this.docAST = docAST; + this.docUri = docUri; + this.docPath = docPath; + this.defineSymbols = new Object(); + this.defineSymbols["allSymbols"] = new Array(); + this.defineSymbols["allSymbolsArray"] = new Array(); + this.defineSymbols["globalSymbols"] = new Array(); + this.defineSymbols["globalSymbolsArray"] = new Array(); + this.defineSymbols["localSymbols"] = new Array(); + this.defineSymbols["localSymbolsArray"] = new Array(); + this.defineSymbols["chunks"] = new Array(); //记录每个chunk中的名字,位置,global/local,(文件/函数)返回信息 + this.defineSymbols["chunksArray"] = new Array(); //记录每个chunk中的名字,位置,global/local,返回信息 + this.requires = new Array(); + this.references = new Array(); + } +} + +//----------------------------------------------------------------------------- +//-- 工具方法 +//----------------------------------------------------------------------------- + +// uri 中html编码转换为原字符 +export function urlDecode(url):string{ + return urlencode.decode(url); +} + +// 从URI分析出文件名和后缀 +export function getPathNameAndExt(UriOrPath): Object{ + let name_and_ext = path.basename(UriOrPath).split('.'); + let name = name_and_ext[0]; //文件名 + let ext = name_and_ext[1]; //文件后缀 + for (let index = 2; index < name_and_ext.length; index++) { + ext = ext + '.' + name_and_ext[index]; + } + return { name, ext }; +} + +export function get_FileName_Uri_Cache(){ + return fileName_Uri_Cache; +} + +// 向cache中添加内容 +export function AddTo_FileName_Uri_Cache(name , uri){ + fileName_Uri_Cache[name] = urlDecode(uri); +} + +// 刷新Cache +export function refresh_FileName_Uri_Cache(){ + //Cache 中没有找到,遍历RootPath + // Logger.InfoLog("start refresh_FileName_Uri_Cache: "); + rootFiles = new Array(); + fileName_Uri_Cache = new Array(); + let processFilNum = 0; + let LuaPandaPath = ''; + if(initParameter && initParameter.rootPath){ + //rootFiles为空,构建rootFilesMap,这个步骤应该放在init时,或者打开首个文件时 + //构建操作,只执行一次 + if(rootFiles.length < 1){ + rootFiles = dir.files(initParameter.rootPath, {sync:true}); + let totalFileNum = rootFiles.length; + for(let idx = 0, len = rootFiles.length; idx < len ; idx++){ + let currentFileIdx = idx + 1; + let name_and_ext = getPathNameAndExt(rootFiles[idx]); + let trname = name_and_ext['name']; + let ext = name_and_ext['ext']; + let validExt = getLoadedExt(); //可用的文件后缀 + if(validExt[ext]){ + let trUri = pathToUri(rootFiles[idx]); //uri + fileName_Uri_Cache[trname] = urlDecode(trUri); + // 文件信息 + Logger.DebugLog(trUri); + processFilNum = processFilNum + 1; + // 显示进度 + let rate = Math.floor(currentFileIdx / totalFileNum * 100); + showProgressMessage(rate, trUri); + if(trname === "LuaPanda"){ + LuaPandaPath = rootFiles[idx]; + } + } + } + } + } + Logger.InfoLog("文件Cache刷新完毕,共计"+ rootFiles.length +"个文件, 其中" + processFilNum + "个lua类型文件"); + if(LuaPandaPath){ + connection.sendNotification("setLuaPandaPath", LuaPandaPath); + } + showProgressMessage(100, "done!"); +} + +// 把文件名转换为 uri +// @fileName 文件名 +// @return uri string +export function transFileNameToUri(requireName : string): string{ + //从fileMap中查找文件全路径 + // Logger.InfoLog("transFileNameToUri find--" + requireName); + let cacheUri = fileName_Uri_Cache[requireName]; + if(cacheUri){ + return cacheUri; + } + return ''; +} + +//把win下盘符转换成大写 +export function transWinDiskToUpper(uri: string):string{ + if (os.type() == "Windows_NT") { + let reg = /^file:\/\/\/(\w)/; + uri = uri.replace(reg,function(m){ + let diskSymbol = m.charAt(8); + diskSymbol = 'file:///' + diskSymbol.toUpperCase() + return diskSymbol}); + return uri; + } +} + +// path -> uri string +export function pathToUri(path : string): string{ + return URI.file(path).toString(); +} + +// uri string -> path +export function uriToPath(uri: string): string { + return URI.parse(uri).fsPath; +} + +// 返回整个目录下的文件列表 +// @path 文件夹路径 +// @return string[] | 返回的文件列表 +export function getDirFiles(path : string){ + if(path){ + return dir.files(path, {sync:true}); + } +} + +// 读文本文件内容 +// @path 文件路径 +// @return 文件内容 +export function getFileContent(path: string): string { + if(path == '' || path == undefined){ + return ''; + } + let data = fs.readFileSync(path); + let dataStr = data.toString(); + return dataStr; +} + +// 把position中起始行号转换为1 (用户选择- > vacode) +export function transPosStartLineTo1(position){ + position.line = position.line + 1; +} + +export function transPosStartLineTo0(position){ + position.line = position.line - 1; +} + + +// 从给定文本中,读出pos位置处的信息 +// @luaText 文本 +// @pos 位置信息 +// @return 指定位置的lua字符串 +export function getTextByPosition(luaText : string, pos : Position): string{ + if(luaText == null){ + return ''; + } + // 拆分luaText + let stringArr = luaText.split(/\r\n|\r|\n/); + let startStr = stringArr[pos.line].substring(0, pos.character); + //使用正则搜索最后一个出现的 符号或者空格 TODO 待完善 + // let reg= /[~!#%&\*\(\)\|,<>\?"';\+\-\=\[\]\{\}]/g; + let reg= /[~!#%&\*\(\)\|,<>\?"';\+\=\[\]\{\}]/g; // 保留"-",用于触发文档注释 + let blankStr = startStr.replace(reg, ' '); + let finalArr = blankStr.split(' '); + let retStr = finalArr.pop(); + return retStr; +} + +/** + * isNextLineHasFunction 使用正则判断下一行是否有function关键字,如果有返回true + * @param luaText 文件内容 + * @param position 位置 + */ +export function isNextLineHasFunction(luaText: string, position: Position): boolean { + let luaTextArray = luaText.split(/\r\n|\r|\n/); + + // 溢出 + if (luaTextArray.length <= position.line + 1) { + return false; + } + + let nextLineText = luaTextArray[position.line + 1]; + let regExp = /\bfunction\b/; + if (regExp.exec(nextLineText)) { + return true; + } + return false; +} + +export function createEmptyLocation(uri) { + let pos = Position.create(0,0); + let rg = Range.create(pos, pos) + let retLoc = Location.create(uri, rg); + return retLoc; +} + +// 根据uri判断文件是否在预设的忽略列表里 +// @param ignoreRegExp 要忽略的文件夹的正则表达式数组 +export function isMatchedIgnoreRegExp(uri: string, ignoreRegExp: string[]): boolean { + for (let i = 0; i < ignoreRegExp.length; i++) { + if (ignoreRegExp[i] === "") { + continue; + } + let regExp = new RegExp(ignoreRegExp[i]); + if (regExp.exec(uri)) { + return true; + } + } + return false; + +} + +export function getNSpace(n: number) { + let str = ""; + for (let i = 0; i < n; i++) { + str += " "; + } + return str; +} + +export function showProgressMessage(progress: number, message: string) { + connection.sendNotification("showProgress", progress + "% " + message); + if (progress == 100) { + connection.sendNotification("showProgress", "LuaPanda 👍"); + } +} + +// 新加入的方法,把dic转换为array +export function changeDicSymboltoArray(dic){ + let array = new Array(); + for (const key in dic) { + const element = dic[key]; + if(Array.isArray(element)){ + for (const k in element) { + const ele = element[k]; + array.push(ele); + } + }else{ + array.push(element); + } + } + return array; +} + +// 将原有的containerList和searchName用点和冒号切割,拼成新的containerList,用来处理层级 +function getVerboseSymbolContainer(verboseSymbolInfo: SymbolInformation): chunkClass[] { + let searchName = verboseSymbolInfo.searchName; + let searchNameArray = Array(); + if (searchName != "...") { + searchName = searchName.replace(/\[/g, '.'); + searchName = searchName.replace(/]/g, ''); + searchNameArray = splitToArrayByDot(searchName); + } + let searchNameContainer: chunkClass[] = Array(); + for (let i = 0; i < searchNameArray.length - 1; i++) { + searchNameContainer.push(new chunkClass(searchNameArray[i], undefined)); + } + + let containerList: chunkClass[] = Array(); + containerList.push(verboseSymbolInfo.containerList[0]); + for (let i = 1; i < verboseSymbolInfo.containerList.length; i++) { + let chunkNameArray = splitToArrayByDot(verboseSymbolInfo.containerList[i].chunkName); + if (chunkNameArray.length > 1) { + for (let j = 0; j < chunkNameArray.length; j++) { + containerList.push(new chunkClass(chunkNameArray[j], undefined)); + } + } else { + containerList.push(verboseSymbolInfo.containerList[i]); + } + } + + let verboseSymbolContainer = containerList.concat(searchNameContainer); + return verboseSymbolContainer; +} + +function handleDocumentSymbolChildren(symbolContainer: chunkClass[], documentSymbol: DocumentSymbol, outlineSymbolArray: DocumentSymbol[], chunkMap: Map) { + let index = chunkMap.get(symbolContainer[1].chunkName); + let parent: DocumentSymbol = outlineSymbolArray[index]; + for (let i = 2; i < symbolContainer.length; i++) { + for (let j = 0; j < parent.children.length; j++) { + if (symbolContainer[i].chunkName == parent.children[j]["originalName"]) { + parent = parent.children[j]; + break; + } + } + } + if(!parent.children){ + parent.children = new Array(); + } + + parent.children.push(documentSymbol); +} + +/** + * 列出本文件中的符号,用于在outline窗口中分层显示符号列表 + * @param symbolInfoArray CodeSymbol.getCertainDocSymbolsArray返回的符号信息数组 + * @return 本文件所有符号列表,DocumentSymbol数组,带有层次结构 + */ +export function getOutlineSymbol(symbolInfoArray: SymbolInformation[]): DocumentSymbol[] { + let outlineSymbolArray = Array(); + + // 存储最外层SymbolInformation.name - outlineSymbolArray索引 的map + let chunkMap = new Map(); + + for (let i = 0; i < symbolInfoArray.length; i++) { + let symbolInfo: SymbolInformation = symbolInfoArray[i]; + let documentSymbol: DocumentSymbol = { + name: symbolInfo.originalName, + kind: symbolInfo.kind, + range: symbolInfo.location.range, + selectionRange: symbolInfo.location.range, + children: Array() + }; + documentSymbol["originalName"] = symbolInfo.originalName; + // 变量展示originalName,函数展示name + if (symbolInfo.kind == SymbolKind.Function) { + documentSymbol.name = symbolInfo.name; + } + + let verboseSymbolContainer = getVerboseSymbolContainer(symbolInfoArray[i]); + + if (verboseSymbolContainer.length > 1) { + handleDocumentSymbolChildren(verboseSymbolContainer, documentSymbol, outlineSymbolArray, chunkMap); + continue; + } + + outlineSymbolArray.push(documentSymbol); + + chunkMap.set(symbolInfo.searchName, outlineSymbolArray.length - 1); + } + + return outlineSymbolArray; +} + +// 使用: . 分割符号,并返回数组 +export function splitToArrayByDot(input) { + let userInputTxt_DotToBlank = input.replace(/[\.:]/g, ' '); //把.和:转为空格 + let L = userInputTxt_DotToBlank.split(' '); + return L; +} diff --git a/src/code/server/docSymbolProcesser.ts b/src/code/server/docSymbolProcesser.ts new file mode 100644 index 0000000..a7fd252 --- /dev/null +++ b/src/code/server/docSymbolProcesser.ts @@ -0,0 +1,1833 @@ +// Tencent is pleased to support the open source community by making LuaPanda available. +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +// https://opensource.org/licenses/BSD-3-Clause +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +/* 本文件的作用是遍历一个文件url对应的AST树,并在遍历过程中记录一些信息 + 通常在三种情况下会遍历AST。 + 1 由AST构建定义符号表 + 2 已经有一个符号位置,由AST中查找其对应的符号 + 3 给定一个符号信息,由这个信息查询所有引用这个符号的位置 + + 本文件还提供在构建的定义表只能中搜索符号的能力searchMatchSymbal,支持各种搜索方式 + + 本文件的公有方法分为几部分: + + 静态创建方法 + + 获取本url及对应AST信息 + + 功能实现接口 + + 符号查找(多种方式) + + 私有方法 + + 工具方法 + + AST分析后的尾处理 + + 遍历AST + + 时序处理:分析不完整的AST +*/ + +import * as luaparse from 'luaparse'; +import * as Tools from './codeTools'; +import { Logger } from './codeLogManager'; +import { CodeSymbol } from './codeSymbol'; +import { Location, Range, Position, SymbolKind } from 'vscode-languageserver'; +// import { isArray } from 'util'; + +// 遍历AST模式 +enum travelMode { + BUILD = 0, //构建定义符号 + GET_DEFINE = 1, //查找定义符号 + FIND_REFS = 2 //查找引用符号 +} + +export class DocSymbolProcesser { + private docInfo: Tools.docInformation; // 记录.lua文本中的所有信息 + // 下面是临时记录信息的变量 + // refs 引用相关 + private searchInfo; //记录被查找的符号信息 + private refsLink; //引用符号队列 + // 按位置查找符号 + private searchPosition: Position; // 记录搜索符号所在的Position + private posSearchRet: Tools.searchRet; // 记录按配置查找的结果 + //解析相关 + public parseError = false; // 记录解析失败 + public static tempSaveInstance; // 临时记录实例 + //build 相关 + private docCommentType; //注释(等号)类型表 | 符号标记类型 记录标记的类型信息。标记来源于 1.用户注释 2.元表 3. 等号 + private funcReturnRecoder; // 用来记录每个函数符号的返回值,并放入符号列表的 chunk 结构中 + private callFunctionRecoder; //用来记录函数调用 + + // 静态创建方法,创建文件的 定义符号列表(定义符号tools.docInformation 数组) + public static create(luaText: string, uri: string, path?: string) { + let instance: DocSymbolProcesser = new DocSymbolProcesser(); + if(!path){ + path = Tools.uriToPath(uri); + } + try { + let AST = luaparse.parse(luaText, { locations: true, scope: true, comments: true}); + instance.docInfo = new Tools.docInformation(AST, uri, path); + instance.buildDocDefineSymbols(); + instance.parseError = false; + return instance; + } catch (error) { + Logger.ErrorLog("[Error] 解析文件 " + uri + " AST的过程中出错:"); + Logger.ErrorLog("[error stack]:" + error.stack ); + + //建立空文件(没有AST) + instance.docInfo = new Tools.docInformation(new Object, uri, path); + DocSymbolProcesser.tempSaveInstance = instance; + //解析 + try { + luaparse.parse(luaText, { locations: true, scope: true, onCreateNode: instance.onCreateNode}); + }catch{} + instance.parseError = true; + return instance; + } + } + +//----------------------------------------------------------------------------- +//-- get/set 获取本文件的基础信息 +//----------------------------------------------------------------------------- + + // 获取本文件uri + public getUri() { + return this.docInfo.docUri; + } + + // 获取本文件 [所有符号列表] (kv) + public getAllSymbolsDic() { + return this.docInfo.defineSymbols.allSymbols; + } + + // 获取本文件 [全局符号列表] (kv) + public getGlobalSymbolsDic() { + return this.docInfo.defineSymbols.globalSymbols; + } + + // 获取本文件 [局部符号列表] (kv) + public getLocalSymbolsDic() { + return this.docInfo.defineSymbols.localSymbols; + } + + // 获取本文件 [chunk信息列表] (kv) + public getChunksDic(){ + return this.docInfo.defineSymbols.chunks; + } + + // 因为符号kv dic中存在冲突,所以新增了返回array接口 + public getAllSymbolsArray() { + return this.docInfo.defineSymbols.allSymbolsArray; + } + + // 获取本文件 [全局符号列表] (array) + public getGlobalSymbolsArray() { + return this.docInfo.defineSymbols.globalSymbolsArray; + } + + // 获取本文件 [局部符号列表] (array) + public getLocalSymbolsArray() { + return this.docInfo.defineSymbols.localSymbolsArray; + } + + // 获取本文件 [chunk信息列表] (array) + public getChunksArray(){ + return this.docInfo.defineSymbols.chunksArray; + } + + // 获取本文件 [返回值列表] (array) + public getFileReturnArray(){ + let chunks = this.docInfo.defineSymbols.chunks; + return chunks[this.docInfo.docPath].returnSymbol; + } + + // 获取本文件 [require列表] (array) + public getRequiresArray(){ + return this.docInfo.requires; + } + + // 获取本文件的[被引用信息] (array) + public getReferencesArray() { + return this.docInfo.references; + } + // 设置本文件的被引用信息 + public setReferences(references: string[]) { + return this.docInfo.references = references; + } + +//----------------------------------------------------------------------------- +//-- 主要对外接口 +//----------------------------------------------------------------------------- + // 构建文件的 [定义符号表] + public buildDocDefineSymbols() { + let deepLayer: Array = new Array(); + this.docCommentType = new Array(); + this.callFunctionRecoder = new Array(); + // 由AST建立符号表 + this.traversalAST(this.docInfo["docAST"], travelMode.BUILD, deepLayer); + // 符号表后处理,记录comment和文件/函数返回值 + this.buildSymbolTag(); + this.buildSymbolReturns(); // 构建 B = require("A") , 记录B的类型 + // Debug info 查看序列化的AST + // let tempStr = JSON.stringify(this.docInfo["docAST"]); + // DebugInfo + // console.log(tempStr) + } + + // 根据 VSCode 传来的 Position 信息从文件 AST 中查找对应符号 + // 这里可以考虑从AST中或者从luaText中查找。使用AST的优点是可以查询到更多的信息,包括isLocal,container。使用 text查找比较快,但只有文本信息。 + // 使用luaText查找的好处是可以搜索未完成的代码 + // 目前 定义查找使用 AST, 代码补全使用 luaText + public searchDocSymbolfromPosition(pos) { + this.searchPosition = pos; + let container = new Array(); + this.posSearchRet = new Tools.searchRet(); + this.traversalAST(this.docInfo["docAST"], travelMode.GET_DEFINE, container); + return { sybinfo: this.posSearchRet.retSymbol, container: container }; + } + + // 查找一个符号的引用 + public searchDocSymbolReference(info) { + //先清空数组 + this.searchInfo = info; + this.refsLink = new Array(); // 引用符号队列 + this.traversalAST(this.docInfo["docAST"], travelMode.FIND_REFS, new Array()); + return this.refsLink; + } + + // 按 position 搜索符号是否是文件名(用于点击require文件名跳转) + public searchDocRequireFileNameFromPosition(pos):string { + let reqFiles = this.getRequiresArray(); + for (let index = 0; index < reqFiles.length; index++) { + const element = reqFiles[index]; + let res = this.isInASTLoc(element.loc, pos); + if(res){ + return element.reqName; + } + } + } + + // 在当前 文件的定义符号表中查找符号(提供多种查找方式,查找范围) + // @symbalName 符号名 + // @matchMode 搜索方式 + // @searchRange 0:all 1 global 2 display + public searchMatchSymbal(symbalName: string, matchMode: Tools.SearchMode, searchRange?: Tools.SearchRange ): Tools.SymbolInformation[] { + searchRange = searchRange || Tools.SearchRange.AllSymbols ; + let retSymbols = []; + let SymbolArrayForSearch; + if( searchRange == Tools.SearchRange.AllSymbols ){ + SymbolArrayForSearch = this.getAllSymbolsDic(); + }else if( searchRange == Tools.SearchRange.GlobalSymbols){ + SymbolArrayForSearch = this.getGlobalSymbolsDic() ; + }else if( searchRange == Tools.SearchRange.LocalSymbols){ + SymbolArrayForSearch = this.getLocalSymbolsDic(); + } + var reg = /[A-Z]/; + //精确查找。直接使用字典匹配 + if (matchMode === Tools.SearchMode.ExactlyEqual) { + //精确匹配 searchName + let tgtSymbol = SymbolArrayForSearch[symbalName]; + if(tgtSymbol){ + if(Array.isArray(tgtSymbol)){ + retSymbols = tgtSymbol; + }else{ + retSymbols.push(tgtSymbol); + } + }else{ + //把: 替换成.尝试再次匹配 + symbalName = symbalName.replace(/:/g,"."); + let tgtSymbol = SymbolArrayForSearch[symbalName]; + if(!tgtSymbol){ + symbalName = symbalName.replace(/\./g,":"); + tgtSymbol = SymbolArrayForSearch[symbalName]; + } + + if(tgtSymbol){ + if(Array.isArray(tgtSymbol)){ + retSymbols = tgtSymbol; + }else{ + retSymbols.push(tgtSymbol); + } + } + } + } + + // let hasUpper = symbalName.match(reg); + for (let idx in SymbolArrayForSearch){ + let sym = SymbolArrayForSearch[idx]; + if (matchMode === Tools.SearchMode.ContinuousMatching) { + //连续查找 name + let res = sym.name.match(symbalName); + if (res != null) { + retSymbols.push(sym); + } + } else if (matchMode === Tools.SearchMode.FuzzyMatching) { + //模糊查找 当前只用于 @ # 的符号查找,所以搜索 name + var inputArray = symbalName.split(''); + var pattStr = inputArray.join('.*?'); + var pattRegExp = new RegExp(pattStr, "i"); + let res = sym.name.match(pattRegExp); + if (res != null) { + retSymbols.push(sym); + } + }else if (matchMode === Tools.SearchMode.FirstLetterContinuousMatching) { + //在这种模式中,如果用户输入的字符串中有大写字母,则大小写敏感。否则大小写不敏感 + let searchName = sym.searchName; + if(searchName){ + let reg1 = new RegExp( /[\.:]/, 'g') + let symbalName_dot = symbalName.replace( reg1 , '.' ); + var reg = new RegExp( '^' + symbalName_dot ,'i'); + + let hit = searchName.match(reg); + if(hit){ + retSymbols.push(sym); + } + //首字母起始连续查找 searchName + // searchName = searchName.replace(/:/g,"."); + // symbalName = symbalName.replace(/:/g,"."); + }else{ + } + + } + } + return retSymbols; + } + +//----------------------------------------------------------------------------- +//-- 以下是遍历AST的私有方法 +//-- 工具方法 +//----------------------------------------------------------------------------- + + // loc2是否在loc1之中 + private isInLocation(loc1, loc2: Position): boolean { + if (loc1.range.start.line <= loc2.line && loc1.range.end.line >= loc2.line) { + if (loc1.range.start.line === loc2.line) { + let character = loc1.range.start.character || loc1.range.start.column; + //start > pos + if (character > loc2.character) return false; + } + + if (loc1.range.end.line === loc2.line) { + let character = loc1.range.end.character || loc1.range.end.column; + if (character < loc2.character) return false; + } + return true; + } + return false; + } + + //list2是否是list1的子集 + // private listContainer(list1, list2): boolean { + // if(list2.length > list1.length) return false; + // for(let idx = 0, len = list2.length ; idx < len; idx++){ + // if(list1[idx] != list2[idx]){ + // return false; + // } + // } + // return true; + // } + + // 判断 loc2 是否被包含在 loc1 之中 + private isInASTLoc(loc1, loc2: Position): boolean { + if (loc1["start"].line <= loc2.line && loc1["end"].line >= loc2.line) { + if (loc1.start.line === loc2.line) { + let character = loc1.start.character || loc1.start.column; + //start > pos + if (character > loc2.character) return false; + } + + if (loc1.end.line === loc2.line) { + let character = loc1.end.character || loc1.end.column; + if (character < loc2.character) return false; + } + return true; + } + return false; + } + + // 创建一个符号的信息 + private createSymbolInfo(name: string, searchName:string, originalName:string, + kind:SymbolKind, location:Location, isLocal:boolean, + containerName?:string, containerList?:Array, funcParamArray?:Array, tagType? :string, reason?: Tools.TagReason): Tools.SymbolInformation{ + let showName = name; + if(isLocal){ + showName = "local " + showName; + } + return{ + name: showName, + searchName: searchName, + originalName: originalName, + kind: kind, + location: location, + isLocal: isLocal, + containerURI: this.docInfo["docUri"], + containerPath: this.docInfo["docPath"], + containerName: containerName, + containerList: containerList, + funcParamArray:funcParamArray, + // alreadyAddDisplay: false, + tagType:tagType, + tagReason:reason + }; + } + + // 检查符号是否已经在符号表中存在 + // @name 符号名 + private checkIsSymbolExist(name) { + if (this.getAllSymbolsDic()[name] != undefined){ + return true; + } + return false; + } + + //-------查到符号后的填充 + private pushToAllList(symbol:Tools.SymbolInformation){ + if(this.docInfo.defineSymbols.allSymbols[symbol.searchName]){ + let travlSymbol = this.docInfo.defineSymbols.allSymbols[symbol.searchName]; + //判断是否数组 + if ( Array.isArray(travlSymbol) ){ + travlSymbol.push(symbol); + }else{ + //只有一个元素,还不是数组 + let newArray = new Array(); + newArray.push(travlSymbol); + newArray.push(symbol); + this.docInfo.defineSymbols.allSymbols[symbol.searchName] = newArray; + } + }else{ + this.docInfo.defineSymbols.allSymbols[symbol.searchName] = symbol; + } + //放入array队列 + this.docInfo.defineSymbols.allSymbolsArray.push(symbol); + } + + private pushToLocalList(symbol:Tools.SymbolInformation){ + if(this.docInfo.defineSymbols.localSymbols[symbol.searchName]){ + let travlSymbol = this.docInfo.defineSymbols.localSymbols[symbol.searchName]; + if ( Array.isArray(travlSymbol) ){ + travlSymbol.push(symbol); + }else{ + let newArray = new Array(); + newArray.push(travlSymbol); + newArray.push(symbol); + this.docInfo.defineSymbols.localSymbols[symbol.searchName] = newArray; + } + }else{ + this.docInfo.defineSymbols.localSymbols[symbol.searchName] = symbol; + } + //放入array队列 + this.docInfo.defineSymbols.localSymbolsArray.push(symbol); + } + + // 把symbol信息放入 docGlobalSymbols | 注意这里是 kv 形式 + private pushToGlobalList(symbol:Tools.SymbolInformation){ + if(this.docInfo.defineSymbols.globalSymbols[symbol.searchName]){ + let travlSymbol = this.docInfo.defineSymbols.globalSymbols[symbol.searchName]; + if ( Array.isArray(travlSymbol) ){ + travlSymbol.push(symbol); + }else{ + let newArray = new Array(); + newArray.push(travlSymbol); + newArray.push(symbol); + this.docInfo.defineSymbols.globalSymbols[symbol.searchName] = newArray; + } + }else{ + this.docInfo.defineSymbols.globalSymbols[symbol.searchName] = symbol; + } + //放入array队列 + this.docInfo.defineSymbols.globalSymbolsArray.push(symbol); + } + + // 根据符号自动识别应该放入哪个列表 + private pushToAutoList(symbol:Tools.SymbolInformation){ + if(symbol.isLocal){ + this.pushToLocalList(symbol); + }else{ + this.pushToGlobalList(symbol); + } + this.pushToAllList(symbol); + } + + private pushToChunkList(name, chunk){ + if(this.docInfo.defineSymbols["chunks"][name]){ + let travlSymbol = this.docInfo.defineSymbols["chunks"][name]; + if ( Array.isArray(travlSymbol) ){ + travlSymbol.push(chunk); + }else{ + let newArray = new Array(); + newArray.push(travlSymbol); + newArray.push(chunk); + this.docInfo.defineSymbols["chunks"][name] = newArray; + } + }else{ + this.docInfo.defineSymbols["chunks"][name] = chunk; + } + //放入array队列 + this.docInfo.defineSymbols.chunksArray.push(chunk); + } + + private pushToCommentList(cmt:Tools.commentTypeInfo){ + this.docCommentType.push(cmt); + } + + // 记录函数调用 + private recordFuncCall(cmt:Tools.functionRetInfo){ + this.callFunctionRecoder.push(cmt); + } + //------------ + +//----------------------------------------------------------------------------- +//-- 遍历AST +//----------------------------------------------------------------------------- + // 遍历AST + // @node AST 当前节点 + // @type : travelMode.BUILD / travelMode.FIND_DEFINE / travel.FIND_REFS + // @deepLayer 深度队列。用来指示当前symbol所在的chunk + // @prefix 前缀。用来指示当前symbol所在chunk (此信息直接展示给用户) + // @isBody ? + private traversalAST(node, type : travelMode, deepLayer: Array , prefix?: string, isBody?:boolean) { + //传入的node是一个数组的时候,traversalAST递归其中每一个元素 + if (Array.isArray(node) === true) { + let ASTArray = Array.prototype.slice.call(node); + for (let idx = 0, len = ASTArray.length; idx < len; idx++) { + this.traversalAST(ASTArray[idx], type, deepLayer, prefix, isBody); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + } else { + let nodeType = node["type"]; + switch (nodeType) { + //container + case 'Chunk': this.processChunk(node, type, deepLayer, prefix); break; + case 'LocalStatement': this.LocalStatement(node, type, deepLayer, prefix); break; + case 'FunctionDeclaration': this.processFunction(node, type, deepLayer, prefix); break; + case 'AssignmentStatement': this.processAssignment(node, type, deepLayer, prefix); break; + case 'CallExpression': this.processCallExpression(node, type, deepLayer, prefix); break; + case 'StringCallExpression': this.processStringCallExpression(node, type, deepLayer, prefix); break; + case 'CallStatement': this.processCallStatement(node, type, deepLayer, prefix); break; + //循环结构,其中可能有定义,也可能有查找的符号 + case 'WhileStatement': this.processWhileStatement(node, type, deepLayer, prefix); break; + case 'RepeatStatement': this.processRepeatStatement(node, type, deepLayer, prefix); break; + case 'IfStatement': this.processIfStatement(node, type, deepLayer, prefix); break; + case 'ReturnStatement': this.processReturnStatement(node, type, deepLayer, prefix, isBody); break; + case 'ForNumericStatement': this.processForNumericStatement(node, type, deepLayer, prefix); break; + case 'ForGenericStatement': this.processForGenericStatement(node, type, deepLayer, prefix); break; + //二进制表达式 a == b + case 'BinaryExpression': this.processBinaryExpression(node, type, deepLayer, prefix); break; + case 'UnaryExpression': this.processUnaryExpression(node, type, deepLayer, prefix); break; + // case 'TableConstructorExpression': retsyb = this.processTableConstructorExpression(ASTNode, type, deepLayer, prefix); break; + case 'MemberExpression': this.processMemberExpression(node, type, deepLayer, prefix); break; + // Terminal + case 'Identifier': this.processIdentifier(node, type, deepLayer, prefix); break; + } + } + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + // ------异常处理 + //分析不完全AST时的回调,这里只处理有限的情况 + // 把symbol信息放入docSymbols + // luaparse.parse 方法创建AST Node时的回调。这里只处理有限的接口 + private onCreateNode(node){ + //require + let deepLayer: Array = new Array(); + if(node['type'] == 'CallExpression' || node['type'] == 'StringCallExpression'){ + DocSymbolProcesser.tempSaveInstance.traversalAST(node, travelMode.BUILD, deepLayer); + } + //定义 | 可以处理,但是失去了深度信息 + if(node['type'] == "LocalStatement"){ + DocSymbolProcesser.tempSaveInstance.traversalAST(node, travelMode.BUILD, deepLayer); + } + //function 定义 + if(node['type'] == "FunctionDeclaration"){ + DocSymbolProcesser.tempSaveInstance.traversalAST(node, travelMode.BUILD, deepLayer); + } + } + + //---------前处理和后处理 + // 处理注释. 基本思路是在注释中查询 -@type + // 用一个结构体记录位置和类型,并放入CommentList中 + private processComments(commentArray){ + for (let idx = 0, len = commentArray.length; idx < len; idx++) { + let comValue = commentArray[idx].value; + let strArr = comValue.split(' ') + for (let j = 0; j < strArr.length; j++) { + const element = strArr[j]; + if(element.match('-@type')){ + let info = { + reason: Tools.TagReason.UserTag, + newType: strArr[j + 1], + location : commentArray[idx].loc + } + this.pushToCommentList(info); + } + } + } + } + + /** + * 记录反向引用关系 + * @param requireName require语句中的文件名 + * @param fileUri 调用require语句的文件的uri + */ + private recordReference(fileUri: string, requireName: string) { + let requireFileUri = Tools.transFileNameToUri(requireName); + if (requireFileUri == "") { + // 未找到require的文件 + return; + } + + // 被require的文件还没有处理,先创建符号 + if (CodeSymbol.docSymbolMap.has(requireFileUri) == false) { + CodeSymbol.createCertainDocSymbols(requireFileUri); + } + let references = CodeSymbol.docSymbolMap.get(requireFileUri).getReferencesArray(); + if (references.includes(fileUri)) { + return; + } + references.push(fileUri); + } + + + private createRetBase(baseName, baseLocal, identifer?): Tools.searchRet { + let retBase: Tools.baseInfo = { + name: baseName, + isLocal: baseLocal, + identiferStr:identifer + }; + let ret: Tools.searchRet = { isFindout: false, baseinfo: retBase }; + return ret; + } + + private createRetSymbol(sybName, sybisLocal, sybLocation?, sybPath?){ + sybPath = sybPath || this.docInfo["docPath"]; + let retSymbol: Tools.searchSymbolRet = { + name: sybName, + isLocal: sybisLocal, + location: sybLocation, + containerURI: sybPath + }; + let ret: Tools.searchRet = { isFindout: true, retSymbol: retSymbol }; + return ret; + } + + // 记录一个符号的标记和标记原因(准备删除) + private setTagTypeToSymbolInfo(symbol: Tools.SymbolInformation, tagType, tagReason){ + symbol.tagType = tagType; + symbol.tagReason = tagReason; + } + + //---文件尾处理(生成符号表后,对一些有注释类型的符号,进行添加tag信息) + // 根据docCommentType记录的信息,在符号中标记tag + private buildSymbolTag(){ + let tagArray = this.docCommentType; + for(var key in tagArray) { + let tagInfo = tagArray[key]; + let loc = tagInfo.location; + let reason = tagInfo.reason; + //从allSymbols中遍历location和tag相符合的符号 + for (let index = 0; index < this.getAllSymbolsArray().length; index++) { + const elm = this.getAllSymbolsArray()[index]; + //用户标记 + if(reason == Tools.TagReason.UserTag && elm.location.range.start.line + 1 === loc['end'].line) + { + this.setTagTypeToSymbolInfo(elm, tagInfo.newType, tagInfo.reason); + break; + } + //相等符号 + if(reason == Tools.TagReason.Equal && elm.location.range.start.line + 1 === loc['end'].line) + { + // name : 被赋值符号名 + if(tagInfo.name && tagInfo.name == elm.searchName){ + this.setTagTypeToSymbolInfo(elm, tagInfo.newType, tagInfo.reason); + break; + } + } + + //元表标记 + if(reason == Tools.TagReason.MetaTable && elm.searchName == tagInfo.oldType){ + this.setTagTypeToSymbolInfo(elm, tagInfo.newType, tagInfo.reason); + break; + } + } + } + } + + // 构建文件返回和函数返回 + private buildSymbolReturns(){ + //设置符号的 requireFile + let reqArray = this.getRequiresArray(); + reqArray.forEach(element => { + let loc = element.loc; + let reqName = element.reqName; + for (let index = 0; index < this.getAllSymbolsArray().length; index++) { + const elm = this.getAllSymbolsArray()[index]; + let aling = elm.location.range.start.line + 1; + let bling = loc['start'].line; + if(aling == bling ) + { + elm.requireFile = reqName; + } + } + }); + + //设置符号的 function Return + // let retArray = this.callFunctionRecoder; + for (const key in this.callFunctionRecoder ) { + const element = this.callFunctionRecoder[key]; + let loc = element.loc; + let funcName = element.functionName; + for (let index = 0; index < this.getAllSymbolsArray().length; index++) { + const elm = this.getAllSymbolsArray()[index]; + //用户标记 + let aling = elm.location.range.start.line + 1; + let bling = loc['start'].line; + if(aling == bling ) + { + elm.funcRets = funcName; + } + } + } + } + //-------尾处理 + +//----------------------------------------------------------------------------- +//-- 遍历AST主方法 +//----------------------------------------------------------------------------- + //base处理,主要工作是拼接变量名 a.b.c.d,并返回base的isLocal (子元素的isLocal跟随base) + private baseProcess(baseNode) { + if (baseNode['type'] == 'MemberExpression') { + let ret = this.baseProcess(baseNode['base']); + if(!ret){ + // console.log("ssdsd"); + // let ret = this.baseProcess(baseNode['base']); + return; + } + let str = ret.name; + let isLocal = ret.isLocal; + let retStr = str + baseNode['indexer'] + baseNode['identifier']['name']; + let retObj = { name: retStr, isLocal: isLocal, origion: baseNode['identifier']['name'] }; + return retObj; + } + else if (baseNode['type'] == 'Identifier') { + return { name: baseNode['name'], isLocal: baseNode['isLocal'] }; + } + else if (baseNode['type'] == 'IndexExpression') { + let ret = this.baseProcess(baseNode['base']); + let str = ret.name; + let isLocal = ret.isLocal; + let retObj; + if(baseNode['index']['type'] == "NumericLiteral"){ + let retStr = str + '[' + baseNode['index']['raw'] + ']'; + retObj = { name: retStr, isLocal: isLocal, origion: baseNode['index']['raw'] }; + } + + if(baseNode['index']['type'] == "Identifier"){ + let retStr = str + '[' + baseNode['index']['name'] + ']'; + retObj = { name: retStr, isLocal: isLocal, origion: baseNode['index']['name'] }; + } + + if(baseNode['index']['type'] == "MemberExpression"){ + let ret = this.baseProcess(baseNode['index']); + let retStr = str + '[' + ret.name + ']'; + retObj = { name: retStr, isLocal: isLocal, origion: ret.name }; + } + + if(baseNode['index']['type'] == "IndexExpression"){ + let ret = this.baseProcess(baseNode['index']); + let retStr = str + '[' + ret.name + ']'; + retObj = { name: retStr, isLocal: isLocal, origion: ret.name }; + } + + return retObj; + } + return { name: '', isLocal: false }; + } + + //base处理,function a.b.c.d. 当用户点击b的时候返回a.b + private MemberExpressionFind(baseNode) { + if(baseNode == null){ + Logger.log("baseNode == null"); + } + + if (baseNode['type'] == 'MemberExpression') { + //递归向内部取base + let ret = this.MemberExpressionFind(baseNode['base']); + // if(ret && ret.isFindout){ + // return ret; + // } + + if(ret == null || ret.isInStat == undefined){ + ret.isInStat = 0; + } + //判断identifier是否符合?一旦符合,后面的基层及全部加上 + let nodeLoc = Location.create(this.docInfo["docUri"], baseNode['identifier']['loc']); + let isIn = this.isInLocation(nodeLoc, this.searchPosition); + + if (isIn === true && ret.isInStat === 0) { + ret.isInStat = 1; + } + if (isIn === false && ret.isInStat === 1) { + //stop + return ret; + } + + let str = ret.name; + let isLocal = ret.isLocal; + let retStr = str + baseNode['indexer'] + baseNode['identifier']['name']; + return { name: retStr, isLocal: isLocal, isInStat: ret.isInStat }; + } + else if (baseNode['type'] == 'IndexExpression') { + //getindex + let ret = this.MemberExpressionFind(baseNode['base']); + // if(ret && ret.isFindout){ + // return ret; + // } + + if(ret == null || ret.isInStat == undefined){ + ret.isInStat = 0; + } + //判断identifier是否符合?一旦符合,后面的基层及全部加上 + let nodeLoc = Location.create(this.docInfo["docUri"], baseNode['index']['loc']); + let isIn = this.isInLocation(nodeLoc, this.searchPosition); + + if (isIn === true && ret.isInStat === 0) { + ret.isInStat = 1; + } + if (isIn === false && ret.isInStat === 1) { + //stop + return ret; + } + + let str = ret.name; + let isLocal = ret.isLocal; + let retStr; + if(baseNode['index']['value']){ + retStr = str + '.' + baseNode['index']['value']; + } + return { name: retStr, isLocal: isLocal, isInStat: ret.isInStat }; + + } + else if (baseNode['type'] == 'CallExpression') { + this.processCallExpression(baseNode, travelMode.GET_DEFINE , null, "call EXp"); + if (this.posSearchRet && this.posSearchRet.isFindout) { + // return retSymbol; + return {name: this.posSearchRet.retSymbol.name, isLocal:this.posSearchRet.retSymbol.isLocal, isInStat:1} + } + else{ + return { name: '', isLocal: true, isInStat: 0 }; + } + } + else if (baseNode['type'] == 'Identifier') { + //base的基层级 + let nodeLoc = Location.create(this.docInfo["docUri"], baseNode['loc']); + + let isIn = this.isInLocation(nodeLoc, this.searchPosition); + if (isIn === true) { + return { name: baseNode['name'], isLocal: baseNode['isLocal'], isInStat: 1 }; + } + else { + return { name: baseNode['name'], isLocal: baseNode['isLocal'], isInStat: 0 }; + } + } + } + + //处理chunk, 通常是遍历AST的第一步 + private processChunk(node, type, deepLayer, prefix){ + if (type === travelMode.BUILD) { + this.processComments(node['comments']); //整理记录comment(---@type) + // 把当前文件压入chunk + let newChunk = new Tools.chunkClass(this.docInfo["docPath"] , this.docInfo.docAST.loc); + this.pushToChunkList(this.docInfo["docPath"], newChunk); + // 压入deep layer + deepLayer.push( newChunk ); //记录chunk名(文件名和起始结束行) + this.traversalAST(node["body"], type, deepLayer, prefix, true); // 遍历body + } + + if (type === travelMode.GET_DEFINE){ + let newChunk = new Tools.chunkClass(this.docInfo["docPath"] , this.docInfo.docAST.loc); + deepLayer.push( newChunk ); //记录chunk名(文件名和起始结束行) + this.traversalAST(node["body"], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + if (type === travelMode.FIND_REFS){ + this.traversalAST(node["body"], type, deepLayer, prefix); + } + } + + // 处理function + private processFunction(node, type, deepLayer: Array, prefix?: string) { + let searchRes = false; //整体检查位置是否在 function 中 + let paraRecoder = new Array(); + // GET_DEFINE 先判断搜索位置是否在 函数location中 + if (type === travelMode.GET_DEFINE) { + let nodeLoc = Location.create(this.docInfo["docUri"], node["loc"]); + searchRes = this.isInLocation(nodeLoc, this.searchPosition); + // 用户点搜索的位置不在本function范围内, 清空数据,返回 + if(searchRes == false) { + this.posSearchRet = new Tools.searchRet(); + } + } + + // 1. 记录函数参数 + let searchHitPara = false; + let searchHitParaIdx = 0; + let paramArray = new Array(); + for (let idx = 0; idx < node["parameters"].length; idx++) { + let paraNode = node["parameters"][idx]; + if(paraNode.type == 'VarargLiteral'){ + //可变参数 + paramArray.push(paraNode['value']); + }else{ + paramArray.push(paraNode['name']); + } + + //搜索模式,且之前未命中 + if (type === travelMode.GET_DEFINE && searchRes === true && searchHitPara === false) { + let nodeLoc1 = Location.create(this.docInfo["docUri"], node["parameters"][idx]["loc"]); + searchHitPara = this.isInLocation(nodeLoc1, this.searchPosition); + if(searchHitPara === true){ + searchHitParaIdx = idx; + continue; + } + } + + if (type === travelMode.BUILD) { + let loc = paraNode["loc"]; + let name; + if(paraNode.type == 'VarargLiteral'){ + name = paraNode.value; + }else{ + name = paraNode["name"]; + } + let isLocal = true; //参数全部是local + let loct = Location.create(this.docInfo["docUri"], Range.create(Position.create(loc["start"]["line"] - 1, loc["start"]["column"]), Position.create(loc["end"]["line"] - 1, loc["end"]["column"]))); + let smbInfo = this.createSymbolInfo(name, name, name, SymbolKind.Variable, loct, isLocal, prefix, deepLayer.concat()); + paraRecoder.push(smbInfo); + } + } + let paramString = "(" + paramArray.join(", ") + ")"; + + // 2. 处理函数名,BUILD时记录 chunk 。 并把信息压入 deepLayer + let newChunk; // 临时记录保存在数据结构中的chunk + let functionName; //函数名(name) + let functionSearchName = "NONAME"; //函数searchName + // 有名函数 普通函数的情况 function a() + if (node["identifier"] && node["identifier"]['type'] == 'Identifier') { + let loc = node["identifier"]["loc"]; + functionSearchName = node["identifier"]["name"]; + functionName = "function " + functionSearchName + paramString; + if (type === travelMode.GET_DEFINE && searchRes === true) { + let nodeLoc1 = Location.create(this.docInfo["docUri"], loc); + let res1 = this.isInLocation(nodeLoc1, this.searchPosition); + if (res1 === true){ + this.posSearchRet = this.createRetSymbol(node["identifier"].name, node["identifier"].isLocal); + return; + } + } + if (type === travelMode.FIND_REFS) { + if (functionSearchName == this.searchInfo.originalName){ + let loc = node["identifier"]["loc"]; + let nodeLoc1 = Location.create(this.docInfo["docUri"], loc); + this.refsLink.push(nodeLoc1); + } + } + if (type === travelMode.BUILD) { + let loct = Location.create(this.docInfo["docUri"], Range.create(Position.create(loc["start"]["line"] - 1, loc["start"]["column"]), Position.create(loc["end"]["line"] - 1, loc["end"]["column"]))); + let pushObj = this.createSymbolInfo(functionSearchName, functionSearchName, functionSearchName, SymbolKind.Function, loct, node["identifier"]["isLocal"], prefix, deepLayer.concat(), paramArray); + newChunk = new Tools.chunkClass(functionSearchName, node.loc); + this.pushToChunkList(newChunk.chunkName, newChunk); + pushObj.chunk = newChunk; + this.pushToAutoList(pushObj); + + } + //有名函数 成员函数的情况 function a.b() + } else if (node["identifier"] && node["identifier"]['type'] == 'MemberExpression') { + let baseInfo = this.baseProcess(node["identifier"]); + functionSearchName = baseInfo.name; + functionName = 'function ' + functionSearchName + paramString; + if (type === travelMode.GET_DEFINE && searchRes === true) { + let bname = this.MemberExpressionFind(node["identifier"]); + if (bname.isInStat && bname.isInStat > 0) { + this.posSearchRet = this.createRetSymbol(bname.name, bname.isLocal); + return; + } + } + + if (type === travelMode.FIND_REFS) { + if (functionSearchName == this.searchInfo.originalName){ + let loc = node["identifier"]["loc"]; + let nodeLoc1 = Location.create(this.docInfo["docUri"], loc); + this.refsLink.push(nodeLoc1); + } + } + + if (type === travelMode.BUILD) { + let bname = this.baseProcess(node["identifier"]); + let originalName = bname.origion; + let loc = node['identifier']['loc']; + let rg = Location.create(this.docInfo["docUri"], Range.create(Position.create(loc["start"]["line"] - 1, loc["start"]["column"]), Position.create(loc["end"]["line"] - 1, loc["end"]["column"]))); + let symbInfo = this.createSymbolInfo(functionName, functionSearchName, originalName, SymbolKind.Function, rg , bname.isLocal, prefix, deepLayer.concat(), paramArray); + newChunk = new Tools.chunkClass(functionSearchName, node.loc); + this.pushToChunkList(newChunk.chunkName, newChunk); + symbInfo.chunk = newChunk; + this.pushToAutoList(symbInfo); + + //a:b , 隐式的self + let sepArr = bname.name.split(':'); + if(sepArr.length > 1){ + let tagname = sepArr[0]; + let funcself = "self"; + let isLocal = true; //参数全部是local + // let rg = Location.create(this.docInfo["docUri"], Range.create(Position.create(-1, -1), Position.create(-1, -1))); + let posChunk = new Tools.chunkClass(functionSearchName, node.loc); + deepLayer.push(posChunk); + let selfInfo = this.createSymbolInfo(funcself, funcself, funcself, SymbolKind.Variable, rg, isLocal, prefix, deepLayer.concat(), null, tagname, Tools.TagReason.Equal); + this.pushToAutoList(selfInfo); + deepLayer.pop(); + + } + } + } + + // 生成chunk信息放入layer + let posChunk = new Tools.chunkClass(functionSearchName, node.loc); + deepLayer.push(posChunk); + + if (type === travelMode.BUILD ){ + //BUILD 向符号列表中写入para信息 + for(let idx = 0 , len = paraRecoder.length;idx < len ; idx++ ){ + let parainfo = paraRecoder.pop(); + parainfo.containerName = functionSearchName; + parainfo.containerList = deepLayer.concat(); + this.pushToAllList(parainfo); + } + } + + // 3. 搜索命中para, 拼完路径后返回 + if (type === travelMode.GET_DEFINE ){ + if (searchHitPara === true) { + this.posSearchRet = this.createRetSymbol(node["parameters"][searchHitParaIdx].name, node["parameters"][searchHitParaIdx].isLocal); + return; + } + } + + //TODO: 暂不支持函数嵌套声明, 可以改为array保存返回值 + this.funcReturnRecoder = null; //准备记录函数返回 + //匿名函数不再加入符号,仅分析内部成员 + this.traversalAST(node["body"], type, deepLayer, functionName); + + // 4. 搜索命中para, 拼完路径后返回 + if (type === travelMode.GET_DEFINE ){ + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + + if (type === travelMode.BUILD ){ + //把返回值放入function chunk + if(this.funcReturnRecoder){ + if(newChunk){ + newChunk.returnSymbol = this.funcReturnRecoder; + }else{ + // 无名函数,不会创建newChunk,则不记录返回值 + } + } + } + deepLayer.pop(); + } + + //处理局部变量 + private LocalStatement(node, type, deepLayer, prefix?: string) { + let searchRes = false; + let baseInfo: Tools.baseInfo; + if (type === travelMode.GET_DEFINE) { + //检查变量是否在loc中 + searchRes = this.isInLocation(Location.create(this.docInfo["docUri"], node["loc"]), this.searchPosition); + } + + for (let idx = 0, len = node["variables"].length; idx < len; idx++) { + if (type === travelMode.BUILD) { + baseInfo = this.buildLvalueSymbals(node["variables"][idx], type, deepLayer, prefix); + } + + if (type === travelMode.GET_DEFINE) { + this.searchLvalueSymbals(node["variables"][idx], type, deepLayer, prefix, searchRes); + if (this.posSearchRet && this.posSearchRet.isFindout) return ; + baseInfo = this.posSearchRet.baseinfo; + } + + if (type === travelMode.FIND_REFS) { + this.searchLvalueSymbals(node["variables"][idx], type, deepLayer, prefix, searchRes); + } + } + + //右值 + for (let idx = 0, len = node['init'].length; idx < len; idx++) { + if (type === travelMode.BUILD) { + this.buildRvalueSymbals(node['init'][idx], type, deepLayer, prefix, baseInfo); + } + + if (type === travelMode.GET_DEFINE) { + this.searchRvalueSymbals(node['init'][idx], type, deepLayer, prefix, baseInfo, searchRes); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + if (type === travelMode.FIND_REFS) { + this.searchRvalueSymbals(node['init'][idx], type, deepLayer, prefix, baseInfo, searchRes); + } + } + } + + //检查是否metatable,如果是,记录tag & reason + private processCallExpisSetMetatable(node, type, arg){ + if(type == travelMode.BUILD){ + let len = arg.length; + if(node["base"].type == 'Identifier' && node["base"].name == 'setmetatable' && node["base"].isLocal === false && len == 2) { + //base + let oldName = this.baseProcess(arg[0]); + let newName = this.baseProcess(arg[1]); + + let info = { + reason: Tools.TagReason.MetaTable, + newType: newName.name, + oldType: oldName.name, + location : null + } + this.pushToCommentList(info); + } + } + } + + //检查是否是function call,如果是,记录 tag & reason + private processCallExpisFunctionCall(node, type, arg){ + if(type == travelMode.BUILD){ + // let len = arg.length; + //functionName + let functionName = this.baseProcess(node['base']); + let info = { + functionName: functionName, + loc : node['loc'] + } + this.recordFuncCall(info); + } + } + + //检查是否require,如果是,记录require的文件名 + private processCallExpisRequire(node, type, arg){ + if(type == travelMode.BUILD){ + let len = arg.length; + if(node["base"].type == 'Identifier' && node["base"].name == 'require' && node["base"].isLocal === false && len == 1) { + //读取arg[0] + if(arg[0].type == 'StringLiteral' && arg[0].value){ + //记录 arg[0].value + let info: Tools.requireFileInfo = { reqName: arg[0].value, loc: arg[0].loc }; + // this.docInfo["requireFile"].push(info); + this.docInfo.requires.push(info) + // 记录引用关系 + this.recordReference(this.docInfo["docUri"], arg[0].value); + } + } + } + } + + // + private processStringCallExpisRequire(node, type, arg){ + if(type == travelMode.BUILD){ + if(arg.type == 'StringLiteral' && arg.value){ + let info: Tools.requireFileInfo = { reqName: arg.value, loc: arg.loc }; + this.docInfo["requires"].push(info); + // 记录引用关系 + this.recordReference(this.docInfo["docUri"], arg.value); + } + } + } + + //调用表达式 + private processStringCallExpression(node, type, deepLayer, prefix?: string) { + this.processStringCallExpisRequire(node, type, node['argument']); + //base + // if (type === travelMode.FIND_DEFINE) { + // let bname = this.MemberExpressionFind(node["base"]); + // if (bname.isInStat > 0) { + // // let retSearch : Tools.searchSymbolRet = { + // // name: bname.name, + // // containerURI: this.docInfo["docUri"], + // // isLocal:bname.isLocal + // // } + // this.posSearchRet = this.createRetSymbol(bname.name, bname.isLocal); + // } + // } + + } + + //调用表达式 + private processCallExpression(node, type, deepLayer, prefix?: string) { + let varArray = Array.prototype.slice.call(node['arguments']); + let len = varArray.length; + this.processCallExpisRequire(node, type, varArray); + this.processCallExpisSetMetatable(node, type, varArray); + this.processCallExpisFunctionCall(node, type, varArray); + //argument + for (let idx = 0; idx < len; idx++) { + this.traversalAST(node['arguments'][idx], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + //base + if (type === travelMode.GET_DEFINE) { + let bname = this.MemberExpressionFind(node["base"]); + if (bname.isInStat && bname.isInStat > 0) { + this.posSearchRet = this.createRetSymbol(bname.name, bname.isLocal); + } + } + + //base + if (type === travelMode.FIND_REFS) { + let bname = this.MemberExpressionFind(node["base"]); + if (bname == this.searchInfo.name){ + let loc = node["identifier"]["loc"]; + let nodeLoc1 = Location.create(this.docInfo["docUri"], loc); + this.refsLink.push(nodeLoc1); + } + } + } + + //调用语句 + private processCallStatement(node, type, deepLayer, prefix?: string) { + this.traversalAST(node['expression'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + //saved[value] 可以用作定义, 也可以读取值 + private processIndexExpression(node, type, deepLayer, prefix?: string){ + //search + if (type === travelMode.GET_DEFINE) { + let loc = node['index']['loc']; + //search 不仅要search当前元素,还要单独search base. 另外搜多当前元素要把base带上 + let nodeLoc1 = Location.create(this.docInfo["docUri"], loc); + let retBool = this.isInLocation(nodeLoc1, this.searchPosition); + if (retBool === true) { + //取得base + if(node['base'].type == 'MemberExpression'){ + this.posSearchRet = this.processMemberExpression(node['base'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + + }else if(node['base'].type == 'Identifier'){ + this.processIdentifier(node['base'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + this.processIdentifier(node['index'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout == true) return; + } + } + //递归search base index 不需要递归 + let bname = this.MemberExpressionFind(node['base']); + if (bname.isInStat && bname.isInStat > 0) { + this.posSearchRet = this.createRetSymbol(bname.name, bname.isLocal); + } + //没找到 + return this.createRetBase(bname.name, bname.isLocal, node['index']['value']); + } + } + + //变量赋值, 这里要区分全局变量的赋值和定义 + private processAssignment(node, type, deepLayer, prefix?: string) { + let searchRes = false; + let baseInfo: Tools.baseInfo; + + if (type === travelMode.GET_DEFINE) { + //检查变量是否在loc中 + let nodeLoc = Location.create(this.docInfo["docUri"], node["loc"]); + searchRes = this.isInLocation(nodeLoc, this.searchPosition); + } + + //遍历variables + if (Array.isArray(node['variables']) === true) { + let varArray = Array.prototype.slice.call(node['variables']); + let len = varArray.length; + for (let idx = 0; idx < len; idx++) { + if (type === travelMode.BUILD) { + baseInfo = this.buildLvalueSymbals(node["variables"][idx], type, deepLayer, prefix, null, 1); + } + + if (type === travelMode.GET_DEFINE) { + this.searchLvalueSymbals(node["variables"][idx], type, deepLayer, prefix, searchRes); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + if(this.posSearchRet.baseinfo) baseInfo = this.posSearchRet.baseinfo; + } + + if (type === travelMode.FIND_REFS) { + this.searchLvalueSymbals(node["variables"][idx], type, deepLayer, prefix, searchRes); + } + } + } + + //遍历init (右值) + if (Array.isArray(node['init']) === true) { + let varArray = Array.prototype.slice.call(node['init']); + let len = varArray.length; + for (let idx = 0; idx < len; idx++) { + if (type === travelMode.BUILD) { + //a.b.c = {x = 9} base是 a.b.c + this.buildRvalueSymbals(node['init'][idx], type, deepLayer, prefix, baseInfo); + } + + if (type === travelMode.GET_DEFINE) { + this.searchRvalueSymbals(node['init'][idx], type, deepLayer, prefix, baseInfo, searchRes); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + if (type === travelMode.FIND_REFS) { + this.searchRvalueSymbals(node['init'][idx], type, deepLayer, prefix, baseInfo, searchRes); + } + } + } + } + + //遇到table构建表达式 + private processTableConstructorExpression(node: Object, type, deepLayer: Array, prefix?: string, baseInfo?) { + //遍历fields + for (let idx = 0, len = node['fields'].length; idx < len; idx++) { + let idxNode = node['fields'][idx]; + if (type === travelMode.BUILD) { + if (idxNode['type'] === 'TableKeyString') { + //L + let retInfo = this.buildLvalueSymbals(idxNode['key'], type, deepLayer, prefix, baseInfo); + //R + this.buildRvalueSymbals(idxNode["value"], type, deepLayer, prefix, retInfo); + } + if (idxNode['type'] === 'TableKey') { + if(idxNode['key']['type'] === "StringLiteral"){ + // L + let orgname = idxNode['key']['value']; + let displayName = baseInfo.name + '.' + orgname; + let rg = Location.create(this.docInfo["docUri"], Range.create(Position.create(idxNode['loc']["start"]["line"] - 1, idxNode['loc']["start"]["column"]), Position.create(idxNode['loc']["end"]["line"] - 1, idxNode['loc']["end"]["column"]))); + let symb = this.createSymbolInfo( displayName, displayName, orgname, SymbolKind.Variable, rg, baseInfo.isLocal, prefix, deepLayer.concat()); + this.pushToAutoList(symb); + let retInfo = {name: displayName, isLocal: baseInfo.isLocal}; + // R + this.buildRvalueSymbals(idxNode["value"], type, deepLayer, prefix, retInfo); + } + + if(idxNode['key']['type'] === "NumericLiteral"){ + // L + let orgname = idxNode['key']['raw']; //TODO 【orgname】 + let displayName = baseInfo.name + '[' + orgname + ']'; + let rg = Location.create(this.docInfo["docUri"], Range.create(Position.create(idxNode['loc']["start"]["line"] - 1, idxNode['loc']["start"]["column"]), Position.create(idxNode['loc']["end"]["line"] - 1, idxNode['loc']["end"]["column"]))); + let symb = this.createSymbolInfo( displayName, displayName, orgname, SymbolKind.Variable, rg, baseInfo.isLocal, prefix, deepLayer.concat()); + this.pushToAutoList(symb); + let retInfo = {name: displayName, isLocal: baseInfo.isLocal}; + // R + this.buildRvalueSymbals(idxNode["value"], type, deepLayer, prefix, retInfo); + } + } + } + if (type === travelMode.GET_DEFINE) { + if (idxNode['type'] === 'TableKeyString') { + // string key 的table构造式 + let recBaseName = baseInfo.name; + //L + this.searchLvalueSymbals(idxNode['key'], type, deepLayer, prefix, true, baseInfo); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + //R + this.searchRvalueSymbals(idxNode["value"], type, deepLayer, prefix, this.posSearchRet.baseinfo, true); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + // 记录Base并还原,避免反复处理对Base造成干扰 + //用例 RadioErrorCode ={ Success = 0, NotEnoughScore = 1000} + baseInfo.name = recBaseName; + } + + if (idxNode['type'] === 'TableKey') { + // [] 形式key的table构造式 + if(idxNode['key']['type'] === "NumericLiteral"){ + let recBaseName = baseInfo.name; + baseInfo.name = baseInfo.name + '[' + idxNode['key']['value'] + ']'; + this.searchRvalueSymbals(idxNode["value"], type, deepLayer, prefix, baseInfo, true); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + + baseInfo.name = recBaseName; + } + if(idxNode['key']['type'] === "StringLiteral"){ + let recBaseName = baseInfo.name; + baseInfo.name = baseInfo.name + '.' + idxNode['key']['value']; + this.searchRvalueSymbals(idxNode["value"], type, deepLayer, prefix, baseInfo, true); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + baseInfo.name = recBaseName; + } + } + + } + + if (type === travelMode.FIND_REFS) { + if (idxNode['type'] === 'TableKeyString') { + //L + this.searchLvalueSymbals(idxNode['key'], type, deepLayer, prefix, true, baseInfo); + //R + this.searchRvalueSymbals(idxNode["value"], type, deepLayer, prefix, this.posSearchRet.baseinfo, true); + } + } + } + } + + //while + private processWhileStatement(node: Object, type, deepLayer: Array, prefix?: string) { + this.traversalAST(node['body'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + private processRepeatStatement(node: Object, type, deepLayer: Array, prefix?: string) { + this.traversalAST(node['body'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + private processMemberExpression(node, type, deepLayer, prefix: string, baseInfo?, searchRes?) { + if (type === travelMode.GET_DEFINE) { + if (node['type'] === 'MemberExpression') { + let loc = node['identifier']['loc']; + //search 不仅要search当前元素,还要单独search base. 另外搜多当前元素要把base带上 + let nodeLoc1 = Location.create(this.docInfo["docUri"], loc); + let retBool = this.isInLocation(nodeLoc1, this.searchPosition); + if (retBool === true) { + //findout + let bname = this.baseProcess(node); + this.posSearchRet = this.createRetSymbol(bname.name, bname.isLocal); + } + //递归search base + let bname = this.MemberExpressionFind(node['base']); + if (bname.isInStat && bname.isInStat > 0) { + this.posSearchRet = this.createRetSymbol(bname.name, bname.isLocal); + } + //没找到 + return this.createRetBase(bname.name, bname.isLocal, node['identifier']['name']); + } + } + } + // + private processIdentifier(node, type, deepLayer, prefix: string, baseInfo?, searchRes?) { + if (type === travelMode.GET_DEFINE) { + if (node['type'] === 'Identifier') { + if (baseInfo == undefined || baseInfo.name == undefined || baseInfo.name === '') { + baseInfo = { name: node["name"], isLocal: node['isLocal'] }; + } else { + if(baseInfo.identiferStr){ + baseInfo.name = baseInfo.name + '.' + baseInfo.identiferStr + '.' + node["name"]; + }else{ + baseInfo.name = baseInfo.name + '.' + node["name"]; + } + } + //搜索 + let nodeLoc1 = Location.create(this.docInfo["docUri"], node["loc"]); + if ( this.isInLocation(nodeLoc1, this.searchPosition) ) { + this.posSearchRet = this.createRetSymbol(baseInfo.name, baseInfo.isLocal); + }else{ + this.posSearchRet = this.createRetBase(baseInfo.name, baseInfo.isLocal); + } + } + } + + if (type === travelMode.FIND_REFS) { + if (node['type'] === 'Identifier') { + if (baseInfo == undefined || baseInfo.name == undefined || baseInfo.name === '') { + baseInfo = { name: node["name"], isLocal: node['isLocal'] }; + } else { + if(baseInfo.identiferStr){ + baseInfo.name = baseInfo.name + '.' + baseInfo.identiferStr + '.' + node["name"]; + }else{ + baseInfo.name = baseInfo.name + '.' + node["name"]; + } + } + + if(baseInfo.name == this.searchInfo.searchName){ + let nodeLoc1 = Location.create(this.docInfo["docUri"], node["loc"]); + this.refsLink.push(nodeLoc1); + } + } + } + } + + //二进制表达式,比如 i == 10000 + private processBinaryExpression(node: Object, type, deepLayer: Array, prefix?: string) { + //search + if (type === travelMode.GET_DEFINE) { + this.traversalAST(node['left'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + + this.traversalAST(node['right'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + //search + if (type === travelMode.FIND_REFS) { + this.traversalAST(node['left'], type, deepLayer, prefix); + this.traversalAST(node['right'], type, deepLayer, prefix); + } + } + + private processUnaryExpression(node: Object, type, deepLayer: Array, prefix?: string) { + if (type === travelMode.GET_DEFINE) { + let argumentType = node['argument']['type']; + switch (argumentType) { + case 'Identifier': + this.processIdentifier(node['argument'], type, deepLayer, prefix); + break; + case 'LogicalExpression': + this.searchRvalueSymbals(node['argument']['left'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) break; + this.searchRvalueSymbals(node['argument']['right'], type, deepLayer, prefix); + break; + case 'IndexExpression': + this.processIndexExpression(node['argument'], type, deepLayer, prefix); + break; + case 'BinaryExpression': + this.processBinaryExpression(node['argument'], type, deepLayer, prefix); + break; + case 'CallExpression': + this.processCallExpression(node['argument'], type, deepLayer, prefix); + break; + case 'MemberExpression': + this.processMemberExpression(node['argument'], type, deepLayer, prefix); + break; + case 'UnaryExpression': + this.processUnaryExpression(node['argument'], type, deepLayer, prefix); + break; + } + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + } + + // if中应该不会存在定义(除了body) + private processIfStatement(ASTNode: Object, type, deepLayer: Array, prefix?: string) { + let node = ASTNode['clauses']; + if (Array.isArray(node) === true) { + let ASTArray = Array.prototype.slice.call(node); + for (let idx = 0, len = ASTArray.length; idx < len; idx++) { + if (ASTArray[idx].type == 'IfClause' || ASTArray[idx].type == 'ElseifClause') { + //if ty1 then + if(ASTArray[idx]['condition']['type'] === 'Identifier'){ + this.processIdentifier(ASTArray[idx]['condition'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + + if(ASTArray[idx]['condition']['type'] === 'LogicalExpression'){ + let node = ASTArray[idx]['condition']; + this.searchRvalueSymbals(node['left'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return ; + this.searchRvalueSymbals(node['right'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + if(ASTArray[idx]['condition']['type'] === 'IndexExpression'){ + this.processIndexExpression(ASTArray[idx]['condition'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + //判断二进制表达式有没有符号 + if (ASTArray[idx]['condition']['type'] === 'BinaryExpression') { + this.processBinaryExpression(ASTArray[idx]['condition'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + + if(ASTArray[idx]['condition']['type'] === 'CallExpression'){ + this.processCallExpression(ASTArray[idx]['condition'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + + if(ASTArray[idx]['condition']['type'] === 'MemberExpression'){ + this.processMemberExpression(ASTArray[idx]['condition'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + + if(ASTArray[idx]['condition']['type'] === 'UnaryExpression'){ + this.processUnaryExpression(ASTArray[idx]['condition'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + + //if body + this.traversalAST(ASTArray[idx].body, type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + + if (ASTArray[idx].type == 'ElseClause') { + //if body + this.traversalAST(ASTArray[idx].body, type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + } + } + } + + // 处理return结构 + private processReturnStatement(ASTNode: Object, type, deepLayer: Array, prefix?: string, isBody?:boolean) { + if (type === travelMode.GET_DEFINE) { + let node = ASTNode; + let varArray = Array.prototype.slice.call(node['arguments']); + for (let idx = 0; idx < varArray.length; idx++) { + this.traversalAST(varArray[idx], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + } + + if(type === travelMode.BUILD){ + if(isBody == true){ + //file retSymbol + if(ASTNode['arguments'].length == 1){ + if(ASTNode['arguments'][0]['type'] === 'Identifier' ){ + let name = ASTNode['arguments'][0]['name']; + //记录文件的返回值,因为文件路径不可能重名,直接查找并放置 + this.docInfo.defineSymbols.chunks[this.docInfo.docPath].returnSymbol = name; + } + } + }else{ + //function retSymbol + if(ASTNode['arguments'].length == 1){ + if(ASTNode['arguments'][0]['type'] === 'Identifier' ){ + let name = ASTNode['arguments'][0]['name']; + this.funcReturnRecoder = name; + } + } + } + } + } + + //for k, v in pairs / ipairs + private processForGenericStatement(node: Object, type, deepLayer: Array, prefix?: string) { + // Logger.log('processForGenericStatement'); + //body + this.traversalAST(node['body'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + // for i = 9 ; i + + + private processForNumericStatement(node: Object, type, deepLayer: Array, prefix?: string) { + // Logger.log('processForNumericStatement'); + //body + this.traversalAST(node['body'], type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + //构建左值. 主要是定义. 返回值是base信息 + //source 来源,填写1是来自于assign + private buildLvalueSymbals(node: Object, type, deepLayer: Array, prefix?: string, baseInfo?, isAssign? : number) { + let baseName = ''; + let baseLocal = true; + let displayName = ''; + let searchName = ''; + if (node['type'] === 'Identifier') { + if (baseInfo == undefined) { + baseName = node["name"]; + baseLocal = node["isLocal"]; + displayName = node["name"]; + } else { + baseLocal = baseInfo.isLocal; //设置花括号内的成员函数global / local 随base + baseName = baseInfo.name + '.' + node["name"]; + displayName = baseName; + } + + //区分 a = 9 情况下到底是赋值还是定义 + searchName = baseName; + let isPush = true; //判断是否压入符号列表,因为全局变量赋值也是定义,所以要在这里做一下判断 + if(isAssign == 1){ + //如果来源于赋值操作,而且baseLocal == true , 那么一定是赋值 (local 的assign一定是赋值) + if( baseLocal ){ + isPush = false; + }else{ + // 全局表中是否存在 + if(this.getGlobalSymbolsDic()[searchName] != undefined){ + isPush = false; + } + } + } + + if(isPush === true){ + let loct = Location.create(this.docInfo["docUri"], Range.create(Position.create(node['loc']["start"]["line"] - 1, node['loc']["start"]["column"]), Position.create(node['loc']["end"]["line"] - 1, node['loc']["end"]["column"]))); + let symb = this.createSymbolInfo(displayName, baseName, node["name"], SymbolKind.Variable, loct, baseLocal, prefix, deepLayer.concat()); + this.pushToAutoList(symb); + } + return { name: baseName, isLocal: baseLocal }; + } + + if ('MemberExpression' === node['type']) { + let bname = this.baseProcess(node); + let rg = Location.create(this.docInfo["docUri"], Range.create(Position.create(node['loc']["start"]["line"] - 1, node['loc']["start"]["column"]), Position.create(node['loc']["end"]["line"] - 1, node['loc']["end"]["column"]))); + baseName = bname.name; + baseLocal = bname.isLocal; + //检查符号是否已经存在,如果已存在就不是定义 + if (this.checkIsSymbolExist(bname.name) === false) { + let symb = this.createSymbolInfo( bname.name, bname.name, node['identifier']['name'], SymbolKind.Variable, rg, bname.isLocal, prefix, deepLayer.concat()); + this.pushToAutoList(symb); + + } + return { name: baseName, isLocal: baseLocal }; + } + else if('IndexExpression' === node['type']) { + // saved[valu] = 9; ==> saved.valu + //valu是一个变量,目前并不知道其值,所以无法做build操作,只能查找。 + let baseInfo = this.baseProcess( node['base'] ); + if( node['index'].type == 'StringLiteral' ){ + let rg = Location.create(this.docInfo["docUri"], Range.create(Position.create(node['loc']["start"]["line"] - 1, node['loc']["start"]["column"]), Position.create(node['loc']["end"]["line"] - 1, node['loc']["end"]["column"]))); + let displayName = baseInfo.name + '.' + node['index'].value ; + if (this.checkIsSymbolExist(displayName) === false) { + let symb = this.createSymbolInfo( displayName, displayName, node['index'].value, SymbolKind.Variable, rg, baseInfo.isLocal, prefix, deepLayer.concat()); + this.pushToAutoList(symb); + } + } + return { name: baseInfo.name, isLocal: baseInfo.isLocal }; + } + } + + // 构建右值 | 处理 变量定义,赋值. + // local a = function() end + // a = { b = "c" } + private buildRvalueSymbals(node: Object, type: number, deepLayer: Array, prefix?: string, baseInfo?) { + if (node == undefined) return; + //构造table a = { b = "c" } + if (node['type'] === 'TableConstructorExpression') { + this.processTableConstructorExpression(node, type, deepLayer, prefix, baseInfo); + } + + // 在处理右值的时候,如果是Identifier或者MemberExpression. 标记tag + if(node['type'] === 'Identifier'){ + let info = { + reason: Tools.TagReason.Equal, + newType: node['name'], + location : node['loc'], + name : baseInfo.name + } + this.pushToCommentList(info); + } + + if(node['type'] === 'MemberExpression'){ + let bname = this.baseProcess(node); + let info = { + reason: Tools.TagReason.Equal, + newType: bname.name, + location : node['loc'], + name:baseInfo.name + } + this.pushToCommentList(info); + } + + this.traversalAST(node, type, deepLayer, prefix); + // if (this.posSearchRet && this.posSearchRet.isFindout) { + // return; + // } + } + + //搜索左值 + private searchLvalueSymbals(node: Object, type, deepLayer: Array, prefix?: string, searchRes?, baseInfo?) { + let localBaseInfo = baseInfo; + if (node['type'] === 'Identifier') { + this.processIdentifier(node, type, deepLayer, prefix, localBaseInfo, searchRes); + //找到,返回 + if (this.posSearchRet && this.posSearchRet.isFindout) return; + //未找到,继承baseInfo + if (this.posSearchRet && this.posSearchRet.isFindout === false) localBaseInfo = this.posSearchRet.baseinfo; + } + + if (node['type'] === 'MemberExpression') { + this.processMemberExpression(node, type, deepLayer, prefix, localBaseInfo, searchRes); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + //未找到,继承baseInfo + if (this.posSearchRet && this.posSearchRet.isFindout === false) localBaseInfo = this.posSearchRet.baseinfo; + } + + if(node['type'] === 'CallExpression'){ + this.processCallExpression(node, type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + //未找到,继承baseInfo + if (this.posSearchRet && this.posSearchRet.isFindout === false) localBaseInfo = this.posSearchRet.baseinfo; + + } + if(node['type'] === 'BinaryExpression'){ + this.processBinaryExpression(node, type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + if (this.posSearchRet && this.posSearchRet.isFindout === false) localBaseInfo = this.posSearchRet.baseinfo; + } + + if(node['type'] === 'IndexExpression'){ + this.processIndexExpression(node, type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + if (this.posSearchRet && this.posSearchRet.isFindout === false) localBaseInfo = this.posSearchRet.baseinfo; + } + + } + + //搜索右值 + private searchRvalueSymbals(node, type, deepLayer: Array, prefix?: string, baseInfo?, searchRes?) { + //右侧如果是Identifier, 不需要base + if (node['type'] === 'Identifier') { + this.processIdentifier(node, type, deepLayer, prefix, null, searchRes); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + if(node['type'] === 'MemberExpression'){ + this.processMemberExpression(node, type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + + //右侧如果是{ } , 构造table ,需要base + if (node['type'] === 'TableConstructorExpression') { + this.processTableConstructorExpression(node, type, deepLayer, prefix, baseInfo); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + if (node.type === 'CallExpression') { + this.traversalAST(node, type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + //traversalAST + if (node.type === 'FunctionDeclaration') { + this.traversalAST(node, type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + // indent = indent or "" + if(node.type === 'LogicalExpression'){ + this.searchRvalueSymbals(node['left'], type, deepLayer, prefix, baseInfo, searchRes); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + this.searchRvalueSymbals(node['right'], type, deepLayer, prefix, baseInfo, searchRes); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + // cart = cart .. indent .. field + if(node.type === 'BinaryExpression'){ + this.searchRvalueSymbals(node['left'], type, deepLayer, prefix, baseInfo, searchRes); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + this.searchRvalueSymbals(node['right'], type, deepLayer, prefix, baseInfo, searchRes); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + //a = b['index'] + if(node['type'] === 'IndexExpression'){ + this.processIndexExpression(node, type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) return; + } + + // a = not b + if(node['type'] === 'UnaryExpression'){ + this.processUnaryExpression(node, type, deepLayer, prefix); + if (this.posSearchRet && this.posSearchRet.isFindout) { + return; + } + } + } + +} + + diff --git a/src/code/server/server.ts b/src/code/server/server.ts new file mode 100755 index 0000000..5cca424 --- /dev/null +++ b/src/code/server/server.ts @@ -0,0 +1,411 @@ +// Tencent is pleased to support the open source community by making LuaPanda available. +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +// https://opensource.org/licenses/BSD-3-Clause +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +//第三方npm引用 +import { + createConnection, + TextDocuments, + TextDocument, + // Diagnostic, + // DiagnosticSeverity, + ProposedFeatures, + InitializeParams, + DidChangeConfigurationNotification, + CompletionItem, + SymbolInformation, + TextDocumentPositionParams, + DocumentSymbolParams, + Definition, //定义跳转 + WorkspaceSymbolParams,//folder 符号 + DocumentHighlight, + ColorInformation, + DocumentColorParams, + ColorPresentationParams, + ColorPresentation, + // SignatureHelp, + ReferenceParams, + DocumentSymbol +} from 'vscode-languageserver'; +let dir = require('path-reader'); +let path = require('path'); /*nodejs自带的模块*/ +import * as Tools from "./codeTools"; +import { Logger } from './codeLogManager'; +import { CodeSymbol } from './codeSymbol'; +import { CodeDefinition } from './codeDefinition'; +import { CodeCompleting } from './codeCompleting'; +import { CodeEditor } from './codeEditor'; +import { CodeLinting } from './codeLinting'; +import { CodeReference } from './codeReference'; + + +// Create a connection for the server. The connection uses Node's IPC as a transport. +// Also include all preview / proposed LSP features. +let connection = createConnection(ProposedFeatures.all); +let documents: TextDocuments = new TextDocuments(); +let hasConfigurationCapability: boolean = false; +let hasWorkspaceFolderCapability: boolean = false; +// let hasDiagnosticRelatedInformationCapability: boolean = false; + +// The settings +export interface LuaAnalyzerSettings { + codeLinting: { + enable : boolean; + luacheckPath : string; + luaVersion : string; + checkWhileTyping : boolean; + checkAfterSave : boolean, + maxNumberOfProblems : number; + maxLineLength : number; + ignoreFolderRegularExpression: string, + ignoreErrorCode : string, + ignoreGlobal : string; + }; +} + +// The global settings, used when the `workspace/configuration` request is not supported by the client. +// Please note that this is not the case when using this server with the client provided in this example +// but could happen with other clients. +const defaultSettings: LuaAnalyzerSettings = { + codeLinting: { + enable : true, + luacheckPath : "", + luaVersion : "5.1", + checkWhileTyping : true, + checkAfterSave : true, + maxNumberOfProblems : 100, + maxLineLength : 120, + ignoreFolderRegularExpression: ".*/res/lua/\w+\.lua;", + ignoreErrorCode : "", + ignoreGlobal : "", + } +}; +let globalSettings: LuaAnalyzerSettings = defaultSettings; +// Cache the settings of all open documents +let documentSettings: Map> = new Map(); + +//----------------------------------------------------------------------------- +//-- connection 时序 +//----------------------------------------------------------------------------- +// 建立连接,初始化数据和设置能力项 +connection.onInitialize((initPara: InitializeParams) => { + let capabilities = initPara.capabilities; + Tools.setInitPara(initPara); + Tools.setToolsConnection(connection); + Logger.connection = connection; + + Logger.DebugLog(Tools.getInitPara().rootPath); + + // Does the client support the `workspace/configuration` request? + // If not, we will fall back using global settings + hasConfigurationCapability = !!(capabilities.workspace && !!capabilities.workspace.configuration); + hasWorkspaceFolderCapability = !!(capabilities.workspace && !!capabilities.workspace.workspaceFolders); + // hasDiagnosticRelatedInformationCapability = + // !!(capabilities.textDocument && + // capabilities.textDocument.publishDiagnostics && + // capabilities.textDocument.publishDiagnostics.relatedInformation); + + // 清空loadedExt, 初始化 name - uri 对应 cache + Tools.initLoadedExt(); + createSybwithExt('lua', Tools.getInitPara().rootPath); + createSybwithExt('lua.bytes', Tools.getInitPara().rootPath); + // 异步执行,建立uri -> 完整路径对应表 + setTimeout(Tools.refresh_FileName_Uri_Cache, 0); + // 分析默认位置(扩展中)的lua文件 + let resLuaPath = path.dirname(__dirname) + '/../../res/lua'; //安装插件后地址 + CodeSymbol.refreshPreLoadSymbals(resLuaPath); + + Logger.DebugLog("init success"); + return { + capabilities: { + //符号分析 + documentSymbolProvider: true, + workspaceSymbolProvider: true, + //定义分析 + definitionProvider: true, + //引用分析 + referencesProvider: false, + //代码格式化 + documentFormattingProvider: true, + documentRangeFormattingProvider: false, + //代码选中高亮 + documentHighlightProvider: false, + //文档同步 + textDocumentSync: documents.syncKind, + //自动补全 + completionProvider: { + triggerCharacters:['.', '-', ':'], + resolveProvider: false + }, + //重命名 + renameProvider : false, + //函数签名提示 + // signatureHelpProvider:{ + // triggerCharacters: [ '(' ], + // }, + //代码上色 + colorProvider : false, + } + }; +}); + +connection.onInitialized(() => { + if (hasConfigurationCapability) { + connection.client.register( + DidChangeConfigurationNotification.type, + undefined + ); + } + if (hasWorkspaceFolderCapability) { + connection.workspace.onDidChangeWorkspaceFolders(_event => { + Logger.DebugLog('Workspace folder change event received.'); + }); + } + connection.sendNotification("setRootFolder", Tools.getInitPara().rootPath); + +}); + +//这是个干嘛的? +connection.onDidChangeConfiguration(change => { + if (hasConfigurationCapability) { + // Reset all cached document settings + documentSettings.clear(); + } else { + globalSettings = ( + (change.settings.lua_analyzer || defaultSettings) + ); + } + // Revalidate all open text documents + documents.all().forEach(validateTextDocument); +}); + +// Only keep settings for open documents +documents.onDidClose(e => { + documentSettings.delete(e.document.uri); +}); + +// 代码自动补全 +connection.onCompletion( + (_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => { + let uri = Tools.urlDecode(_textDocumentPosition.textDocument.uri); + let pos = _textDocumentPosition.position; + // try{ + return CodeCompleting.getCompletingArray(uri, pos); + // } catch (error) { + // Logger.InfoLog(error.stack); + // } + } +); + +// 查找符号引用 +connection.onReferences( + (handler : ReferenceParams): any =>{ + return CodeReference.getSymbalReferences(handler); + } +); + +// 查找符号定义 +connection.onDefinition( + (handler: TextDocumentPositionParams): Definition => { + handler.textDocument.uri = Tools.urlDecode(handler.textDocument.uri); + // try{ + return CodeDefinition.getSymbalDefine(handler); + // } catch (error) { + // Logger.InfoLog(error.stack); + // } + } +); + +//获取单文件内的符号 +connection.onDocumentSymbol( + (handler: DocumentSymbolParams): DocumentSymbol[] => { + let uri = handler.textDocument.uri; + let decUri = Tools.urlDecode(uri); + let retSyms = CodeSymbol.getCertainDocSymbolsReturnArray(decUri, null, Tools.SearchRange.AllSymbols); + let retSymsArr: any[]; + try { + retSymsArr = Tools.getOutlineSymbol(retSyms); + } + catch(error) { + // 处理层级关系出现错误时退化为原有的不分层显示 + Logger.DebugLog("error detected while processing outline symbols, error: " + error + "\nstack:\n" + error.stack); + retSymsArr = Tools.changeDicSymboltoArray(retSyms); + } + return retSymsArr; + } +); + +//获取整个工程文件夹的符号 +connection.onWorkspaceSymbol( + (handler: WorkspaceSymbolParams): SymbolInformation[] => { + // try{ + return CodeSymbol.searchSymbolinWorkSpace(handler.query, Tools.SearchMode.FuzzyMatching, Tools.SearchRange.LocalSymbols); + // } catch (error) { + // Logger.InfoLog(error.stack); + // } + } +); + +// 打开单文件 +documents.onDidOpen(file => { + // 异步分析工程中同后缀文件 + if (file.document.languageId == "lua") { //本文件是lua形式 + let uri = Tools.urlDecode(file.document.uri); + let luaExtname = Tools.getPathNameAndExt(uri); + let ext = luaExtname['ext']; + let loadedExt = Tools.getLoadedExt(); + if (loadedExt && loadedExt[ext] === true) { + //把文件名和路径放入cache + // Tools.AddTo_FileName_Uri_Cache( luaExtname['name'], uri); + return; + }else{ + // 处理新的后缀类型 + createSybwithExt(ext, Tools.getInitPara().rootPath); + setTimeout(Tools.refresh_FileName_Uri_Cache, 0); + } + } +}); + +// 文件内容发生改变(首次打开文件时这个方法也会被调用) +documents.onDidChangeContent(change => { + if(change.document.languageId == 'lua'){ + const uri = Tools.urlDecode(change.document.uri); + const text = change.document.getText(); + CodeEditor.saveCode(uri, text); //先保存代码 + CodeSymbol.refreshCertainDocSymbols(uri, text); + + // 运行语法检查 + getDocumentSettings(uri).then( + (settings) => { + if (settings.codeLinting.checkWhileTyping == true) { + validateTextDocument(change.document); + } + } + ); + } +}); + +// 保存文件 +documents.onDidSave(change => { + // try { + // 运行语法检查 + getDocumentSettings(change.document.uri).then( + (settings) => { + if (settings.codeLinting.checkAfterSave == true) { + validateTextDocument(change.document); + } + } + ); + // } catch (error) { + // Logger.InfoLog(error.stack); + // } +}); + +//----------------------------------------------------------------------------- +//-- 未实现能力 +//----------------------------------------------------------------------------- +// 代码着色 +connection.onDocumentColor( + (handler: DocumentColorParams): ColorInformation[] =>{ + return new Array(); + } +); + +connection.onColorPresentation( + (handler: ColorPresentationParams):ColorPresentation[] =>{ + return new Array(); + } +); + +//代码单击高亮 +connection.onDocumentHighlight ( + (handler: TextDocumentPositionParams) : DocumentHighlight[] =>{ + // console.log("onDocumentHighlight"); + return new Array(); + } +); + + +//----------------------------------------------------------------------------- +//-- 工具方法 +//----------------------------------------------------------------------------- +function getDocumentSettings(resource: string): Thenable { + if (!hasConfigurationCapability) { + return Promise.resolve(globalSettings); + } + let result = documentSettings.get(resource); + if (!result) { + result = connection.workspace.getConfiguration({ + scopeUri: resource, + section: 'lua_analyzer' + }); + documentSettings.set(resource, result); + } + return result; +} + +async function validateTextDocument(textDocument: TextDocument): Promise { + let settings = await getDocumentSettings(textDocument.uri); + + // 如果总开关未打开,无论从哪里调用validateTextDocument都不执行语法检查直接返回 + if (settings.codeLinting.enable == false) { + // 清空诊断输出 + connection.sendDiagnostics({ uri: textDocument.uri, diagnostics: [] }); + return; + } + + // 处理忽略文件 + let ignoreFolderRegExpArray = settings.codeLinting.ignoreFolderRegularExpression.split(';'); + if (ignoreFolderRegExpArray.length > 0) { + if (Tools.isMatchedIgnoreRegExp(textDocument.uri, ignoreFolderRegExpArray)) { + // 清空诊断输出 + connection.sendDiagnostics({ uri: textDocument.uri, diagnostics: [] }); + return; + } + } + + // let globalSymbols = CodeSymbol.getRequireTreeGlobalSymbols(Tools.urlDecode(textDocument.uri)); + let globalSymbols = CodeSymbol.getWorkspaceSymbols(Tools.SearchRange.GlobalSymbols); + let globalVariables: string[] = Object.keys(globalSymbols); + + let luacheckProcess: Promise<{}> = CodeLinting.processLinting(textDocument, settings, globalVariables); + luacheckProcess.then( + () => { + connection.sendDiagnostics({ uri: textDocument.uri, diagnostics: [] }); + }, + luaErrorOrWaining => { + const diagnosticArray = CodeLinting.parseLuacheckResult(luaErrorOrWaining, settings); + connection.sendDiagnostics({ uri: textDocument.uri, diagnostics: diagnosticArray }); + } + ) + .catch(() => { + connection.sendDiagnostics({ uri: textDocument.uri, diagnostics: [] }); + }); +} + +//创建指定后缀的lua文件的符号 +function createSybwithExt(luaExtname: string, rootpath: string) { + //记录此后缀代表lua + Tools.setLoadedExt(luaExtname); + //解析workSpace中同后缀文件 + let exp = new RegExp(luaExtname + '$', "i"); + dir.readFiles(rootpath, { match: exp }, function (err, content, filePath, next) { + if (!err) { + CodeSymbol.getCertainDocSymbolsReturnArray(Tools.pathToUri(filePath), content); + } + next(); + }, (err) => { + if (err) { + return; + } + }); +} + +// Make the text document manager listen on the connection +// for open, change and close text document events +documents.listen(connection); + +// Listen on the connection +connection.listen(); diff --git a/src/code/server/typeInfer.ts b/src/code/server/typeInfer.ts new file mode 100644 index 0000000..8775cf1 --- /dev/null +++ b/src/code/server/typeInfer.ts @@ -0,0 +1,246 @@ +// Tencent is pleased to support the open source community by making LuaPanda available. +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +// https://opensource.org/licenses/BSD-3-Clause +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +//这个文件中要处理的主要是tag类型查找 +//包含 前缀的去除 , 查找, 补回查找 +import * as Tools from './codeTools'; +import { CodeSymbol } from "./codeSymbol"; +// import { Logger } from './codeLogManager'; + +//类型推断文件 +export class TypeInfer { +//----------------------------------------------------------------------------- +//-- 对外接口 +//----------------------------------------------------------------------------- + // 定义查找接口 + public static processDefineSymbolTag(symbolInfo, uri){ + return this.recursiveProcessSymbolTag(symbolInfo, uri, '', new Array()); + } + + // 自动补全接口 + public static processCompleting(prefixStr, uri){ + let sy = { + containerURI: uri, + isLocal: false, + location: null, + name: prefixStr + } + return this.recursiveProcessSymbolTag(sy, uri, '', new Array()); + } + +//----------------------------------------------------------------------------- +//-- 私有方法 +//----------------------------------------------------------------------------- + // 处理函数返回值 | element是赋值的符号 , a = func() element是a的符号 + private static processFunctionReturn(element, symbolInfo, uri, prefixStrList, alreadySearchNameList, SCHName){ + let returnFuncList = CodeSymbol.searchSymbolinDoc(uri , SCHName ,Tools.SearchMode.ExactlyEqual); + if (returnFuncList == null || ( returnFuncList && returnFuncList.length <= 0) ){ + returnFuncList = CodeSymbol.searchAllSymbolinRequireTreeforCompleting(uri ,SCHName ,Tools.SearchMode.ExactlyEqual); + } + + let retrunSymbol = new Array(); + if(returnFuncList && returnFuncList.length > 0){ + for (let index = 0; index < returnFuncList.length; index++) { + // 遍历所有的函数,并在函数中查找返回类型 + const retFuncSymbol = returnFuncList[index]; + if( retFuncSymbol['funcRets'] ){ + let tag_type = retFuncSymbol['funcRets']; + //根据函数定义符号记录的返回类型,找到返回变量符号 + // let tmpSymbol = CodeSymbol.searchSymbolinWorkSpace(tag_type, Tools.SearchMode.ExactlyEqual); + symbolInfo.name = tag_type.name + prefixStrList; + let tmpSymbol = this.recursiveProcessSymbolTag( symbolInfo, uri, '', alreadySearchNameList); + //找到了返回符号,但是要过滤深度(仅查找对应函数中的符号) + // tmpSymbol = CodeSymbol.selectSymbolinCertainContainer(tmpSymbol, retFuncSymbol.containerList); + if(tmpSymbol){ + retrunSymbol = retrunSymbol.concat(tmpSymbol); + } + } + } + return retrunSymbol; + }else{ + //等式右边的符号无法被直接搜索到 + symbolInfo.name = element.funcRets['name']; + retrunSymbol = this.recursiveProcessSymbolTag( symbolInfo, uri, '', alreadySearchNameList); + if(prefixStrList){ + symbolInfo.name = symbolInfo.name + prefixStrList; + retrunSymbol = this.recursiveProcessSymbolTag( symbolInfo, uri, '', alreadySearchNameList); + } + + return retrunSymbol; + } + } + + // 处理用户标记 + private static processUserTag(element, symbolInfo, uri, prefixStrList, alreadySearchNameList, userInputTxt, SCHName){ + let tag_type = element.tagType; + // let tag_reason = element.tagReason; + // let reqFile = element.requireFile; + let checkName = ''; + + checkName = tag_type.replace(/\s/g, '.'); + symbolInfo.name = checkName; + let tx = this.recursiveProcessSymbolTag( symbolInfo, uri, prefixStrList, alreadySearchNameList); + return tx; + } + + // 处理元表标记 + private static processMetaTable(element, symbolInfo, uri, prefixStrList, alreadySearchNameList, userInputTxt, SCHName){ + //含有tagType,在tagType中查 + // let tag_type = element.tagType; + let tag_reason = element.tagReason; + // let reqFile = element.requireFile; + let checkName = ''; + + if(tag_reason == Tools.TagReason.MetaTable){ + checkName = element.tagType + ".__index"; + } + + symbolInfo.name = checkName; + let indexDefList = this.recursiveProcessSymbolTag( symbolInfo, uri, prefixStrList, alreadySearchNameList); + if( indexDefList && indexDefList.length > 0 ){ + //过滤 + indexDefList = CodeSymbol.selectSymbolinCertainContainer(indexDefList, element.containerList); + let retrunSymbol = new Array(); + for (let index = 0; index < indexDefList.length; index++) { + const indexSymbol = indexDefList[index]; + if(indexSymbol.tagType){ + symbolInfo.name = indexSymbol.tagType; + let tmpSymbol = this.recursiveProcessSymbolTag( symbolInfo, uri, prefixStrList, alreadySearchNameList); + if(tmpSymbol){ + retrunSymbol = retrunSymbol.concat(tmpSymbol); + } + } + else if(indexSymbol.searchName.match(/__index/)){ + //若查找的字符串中包含__index + retrunSymbol = retrunSymbol.concat(indexSymbol); + + } + } + return retrunSymbol; + } + } + + // 处理引用标记 + private static processRequire(element, symbolInfo, uri, prefixStrList, alreadySearchNameList, checkName, SCHName){ + //到对应的文件中查一下return,找到后当做 userTag处理 + uri = Tools.transFileNameToUri(element.requireFile); + let retTag = CodeSymbol.getCertainDocReturnValue(uri); + if(retTag && retTag.length > 0){ + let tag_type = retTag; + // let tag_reason = Tools.TagReason.UserTag; + let reqFile = element.requireFile; + + checkName = tag_type; // a.b => tag + let uri = Tools.transFileNameToUri(reqFile); + let finalSymbs = CodeSymbol.searchSymbolinDoc(uri, checkName, Tools.SearchMode.ExactlyEqual); + return finalSymbs; + } + } + + // 递归核心推导方法 | 处理符号的tag。要求:可以查找符号链。不要返回相同的符号 + // symbInstance 保存最终结果,并返回给用户的符号 + // symbolInfo 用户输入的(被查找的)符号信息 + // prefixStr 搜索的前缀信息List + // alreadySearchNameList 以查找过的符号列表 + private static recursiveProcessSymbolTag(symbolInfo, uri, prefixStrList, alreadySearchNameList){ + // 防止循环遍历 + // let alreadySearchLen = alreadySearchNameList.length; + // const element = alreadySearchNameList[alreadySearchLen - 1]; + // if(element == symbolInfo.name ){ + // return; + // } + // // Logger.ErrorLog("recursiveProcessSymbolTag : " + symbolInfo.name); + // alreadySearchNameList.push(symbolInfo.name); + //防止循环遍历-- + + let findTagRetSymbArray + findTagRetSymbArray = CodeSymbol.searchSymbolinDoc(uri , symbolInfo.name ,Tools.SearchMode.ExactlyEqual); + if (findTagRetSymbArray == null || (findTagRetSymbArray &&findTagRetSymbArray.length <= 0)){ + findTagRetSymbArray = CodeSymbol.searchAllSymbolinRequireTreeforCompleting(uri ,symbolInfo.name, Tools.SearchMode.ExactlyEqual); + } + if(findTagRetSymbArray && findTagRetSymbArray.length > 0) return findTagRetSymbArray; + + //切断用户输入 + let userInputTxt = symbolInfo.name; + let DotToBlankArr = Tools.splitToArrayByDot(userInputTxt); + let preStr = '' + //a.b.c -> a.b -> a 查找tag 递减缩减查找tag + for (let index = DotToBlankArr.length - 1; index >= 0; index--) { + //先把第一个参数pop + preStr = "." + DotToBlankArr.pop() + preStr ; + //确定要查找的符号名 + let SCHName = DotToBlankArr.join('.'); + + // 先搜索本文件,如果找不到再搜索调用树 + let findTagRetSymbArray + findTagRetSymbArray = CodeSymbol.searchSymbolinDoc(uri , SCHName ,Tools.SearchMode.ExactlyEqual); + if (findTagRetSymbArray == null || (findTagRetSymbArray &&findTagRetSymbArray.length <= 0)){ + findTagRetSymbArray = CodeSymbol.searchAllSymbolinRequireTreeforCompleting(uri ,SCHName, Tools.SearchMode.ExactlyEqual); + } + + //没找到,继续pop + if(!findTagRetSymbArray || findTagRetSymbArray.length == 0) continue; + + //找到了用户输入的符号 + //没有找到需要的符号,遍历判断符号是否有 require, function ret, tag 标记 + if(findTagRetSymbArray && findTagRetSymbArray.length > 0){ + let MaxFor = findTagRetSymbArray.length > 10 ? 1: findTagRetSymbArray.length; //对搜索结果过多的保护 + for (let ix = MaxFor - 1; ix >= 0 ; ix--) { + const element = findTagRetSymbArray[ix]; + //搜索tag + let findoutSymbs; + if(element.tagType && (element.tagReason === Tools.TagReason.UserTag || element.tagReason === Tools.TagReason.Equal) ){ //USERTag + findoutSymbs = this.processUserTag(element, symbolInfo, uri, prefixStrList, alreadySearchNameList, userInputTxt, SCHName); + }else if(element.tagType && element.tagReason == Tools.TagReason.MetaTable ){ + findoutSymbs = this.processMetaTable(element, symbolInfo, uri, prefixStrList, alreadySearchNameList, userInputTxt, SCHName); + }else if(element.requireFile && element.requireFile.length > 0){ //Require + let checkName = DotToBlankArr.join('.'); + findoutSymbs = this.processRequire(element, symbolInfo, uri, prefixStrList, alreadySearchNameList, checkName, SCHName); + }else if(element.funcRets){ + findoutSymbs = this.processFunctionReturn(element, symbolInfo, uri, preStr, alreadySearchNameList, SCHName) + //funcReturnSymbol 如果有prefix ,拼起来再找,没有prefix就找到了 + }else if(element.chunk && element.chunk.returnSymbol){ + let chunkRet = element.chunk.returnSymbol; + findoutSymbs = CodeSymbol.searchAllSymbolinRequireTreeforCompleting(uri ,chunkRet, Tools.SearchMode.ExactlyEqual); + } + + //已经拿到了符号, 有preStr + if(findoutSymbs && findoutSymbs.length > 0 && preStr.length > 0){ + let MaxFor2 = findoutSymbs.length > 10 ? 1: findoutSymbs.length; + for (let findoutSymIdx = 0; findoutSymIdx < MaxFor2; findoutSymIdx++) { + if(!findoutSymbs[findoutSymIdx]) continue; + let chkName = ''; + if( !element.funcRets ){ + chkName = findoutSymbs[findoutSymIdx].searchName + preStr ; //拼出完整的符号 + }else{ + if( element.funcRets.name == "require"){ + chkName = findoutSymbs[findoutSymIdx].searchName + preStr ; //拼出完整的符号 + }else{ + chkName = findoutSymbs[findoutSymIdx].searchName; + } + } + + //防止死循环 + if(chkName == userInputTxt){ + continue; + } + + let sy = { + containerURI: findoutSymbs[findoutSymIdx].containerURI, + isLocal: findoutSymbs[findoutSymIdx].isLocal, + location: null, + name: chkName + } + + let ret = this.recursiveProcessSymbolTag(sy , uri, '', alreadySearchNameList); + if(ret) return ret; + } + } + } + } + } + } +} diff --git a/src/LogManager.ts b/src/common/LogManager.ts similarity index 100% rename from src/LogManager.ts rename to src/common/LogManager.ts diff --git a/src/StatusBarManager.ts b/src/common/StatusBarManager.ts similarity index 58% rename from src/StatusBarManager.ts rename to src/common/StatusBarManager.ts index 938495f..fd175f9 100644 --- a/src/StatusBarManager.ts +++ b/src/common/StatusBarManager.ts @@ -3,10 +3,17 @@ import * as vscode from 'vscode'; export class StatusBarManager { private static MemStateBar; + private static Setting; + public static init() { this.MemStateBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 5.0); this.MemStateBar.tooltip = "Click to collect garbage"; this.MemStateBar.command = 'luapanda.LuaGarbageCollect'; + + this.Setting = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 6.0); + this.Setting.tooltip = "Click open setting page"; + this.Setting.command = 'luapanda.openSettingsPage'; + this.Setting.hide(); } //刷新内存数据显示区的值 @@ -15,6 +22,12 @@ export class StatusBarManager { this.MemStateBar.show(); } + //刷新内存数据显示区的值 + public static showSetting(message: string) { + this.Setting.text = message; + this.Setting.show(); + } + //按钮恢复到初始状态 public static reset() { diff --git a/src/Tools.ts b/src/common/Tools.ts similarity index 82% rename from src/Tools.ts rename to src/common/Tools.ts index 71b6dec..6d83809 100644 --- a/src/Tools.ts +++ b/src/common/Tools.ts @@ -1,16 +1,56 @@ import * as vscode from 'vscode'; +import { DebugLogger } from './logManager'; +import * as fs from "fs"; import { isArray } from 'util'; let path = require("path"); let pathReader = require('path-reader'); -import { DebugLogger } from './LogManager'; export class Tools { public static extMap = new Object(); // 可处理的文件后缀列表 - public static fileNameToPathMap; // 文件名-路径Map + public static fileNameToPathMap; // 文件名-路径 Map public static useAutoPathMode = false; public static pathCaseSensitivity = false; + public static adapterVersion; //赋值放在了插件初始化时 + public static VSCodeOpenedFolder; // VSCode当前打开的用户工程路径。打开文件夹后,由languageServer赋值 + public static luapandaPathInUserProj; // 用户工程中luapanda文件所在的路径,它在调试器启动时赋值。但也可能工程中不存在luapanda文件导致路径为空 + public static VSCodeExtensionPath; // VSCode插件所在路径,插件初始化时就会被赋值 + + // 路径相关函数 + // 获取扩展中预置的lua文件位置 + public static getLuaPathInExtension() : string{ + let luaPathInVSCodeExtension = this.VSCodeExtensionPath + "/Debugger/LuaPanda.lua"; + return luaPathInVSCodeExtension; + } + + // 获取扩展中预置的lua文件位置 + public static getClibPathInExtension() : string{ + let ClibPathInVSCodeExtension = this.VSCodeExtensionPath + "/Debugger/debugger_lib/plugins/"; + return ClibPathInVSCodeExtension; + } + + // 读文本文件内容 + // @path 文件路径 + // @return 文件内容 + public static readFileContent(path: string): string { + if(path === '' || path == undefined){ + return ''; + } + let data = fs.readFileSync(path); + let dataStr = data.toString(); + return dataStr; + } + + // 写文件内容 + // @path 文件路径 + // @return 文件内容 + public static writeFileContent(path: string, content:string) { + if(path === '' || path == undefined){ + return; + } + fs.writeFileSync(path, content); + } - // 把传入的路径标准路径 + // 把传入的路径转为标准路径 public static genUnifiedPath(beProcessPath) : string{ //全部使用 / beProcessPath = beProcessPath.replace(/\\/g, '/'); @@ -76,8 +116,7 @@ export class Tools { } } - //建立/刷新 工程下 文件名-路径Map - // 评估执行效率,这个函数可以考虑应该区分同步,以优化体验 + // 建立/刷新 工程下文件名-路径Map public static rebuildWorkspaceNamePathMap(rootPath : string){ let beginMS = this.getCurrentMS();//启动时毫秒数 let _fileNameToPathMap = new Array(); // 文件名-路径 cache @@ -128,13 +167,13 @@ export class Tools { this.fileNameToPathMap = _fileNameToPathMap; } - //获取当前毫秒数 + // 获取当前毫秒数 public static getCurrentMS(){ - var currentMS = new Date();//获取当前时间 + let currentMS = new Date();//获取当前时间 return currentMS.getTime(); } - // 检查同名文件 + // 检查同名文件, 如果存在,通过日志输出 public static checkSameNameFile(){ let sameNameFileStr; for (const nameKey in this.fileNameToPathMap) { @@ -159,7 +198,7 @@ export class Tools { // 从URI分析出文件名和后缀 public static getPathNameAndExt(UriOrPath): Object{ let name_and_ext = path.basename(UriOrPath).split('.'); - let name = name_and_ext[0]; //文件名 + let name = name_and_ext[0]; //文件名 let ext = name_and_ext[1] || ''; //文件后缀 for (let index = 2; index < name_and_ext.length; index++) { ext = ext + '.' + name_and_ext[index]; @@ -210,4 +249,4 @@ export class Tools { DebugLogger.showTips("调试器没有找到文件 " + shortPath + " 。 请检查launch.json文件中lua后缀是否配置正确, 以及VSCode打开的工程是否正确", 2); return shortPath; } -} +} \ No newline at end of file diff --git a/src/BreakPoint.ts b/src/debug/BreakPoint.ts similarity index 100% rename from src/BreakPoint.ts rename to src/debug/BreakPoint.ts diff --git a/src/dataProcesser.ts b/src/debug/dataProcesser.ts similarity index 99% rename from src/dataProcesser.ts rename to src/debug/dataProcesser.ts index 3f5ee1e..fd3e9a7 100644 --- a/src/dataProcesser.ts +++ b/src/debug/dataProcesser.ts @@ -1,6 +1,6 @@ import { LuaDebugRuntime } from './luaDebugRuntime'; import { Socket } from 'net'; -import { DebugLogger } from './LogManager'; +import { DebugLogger } from '../common/logManager'; import { LuaDebugSession } from './luaDebug'; //网络收发消息,记录回调 diff --git a/src/debugAdapter.ts b/src/debug/debugAdapter.ts similarity index 100% rename from src/debugAdapter.ts rename to src/debug/debugAdapter.ts diff --git a/src/luaDebug.ts b/src/debug/luaDebug.ts similarity index 97% rename from src/luaDebug.ts rename to src/debug/luaDebug.ts index 70de590..2ace210 100755 --- a/src/luaDebug.ts +++ b/src/debug/luaDebug.ts @@ -17,10 +17,12 @@ import { LuaDebugRuntime, LuaBreakpoint } from './luaDebugRuntime'; const { Subject } = require('await-notify'); import * as Net from 'net'; import { DataProcesser } from './dataProcesser'; -import { DebugLogger } from './LogManager'; -import { StatusBarManager } from './StatusBarManager'; -import { LineBreakpoint, ConditionBreakpoint, LogPoint } from './BreakPoint'; -import { Tools } from './Tools'; +import { DebugLogger } from '../common/logManager'; +import { StatusBarManager } from '../common/statusBarManager'; +import { LineBreakpoint, ConditionBreakpoint, LogPoint } from './breakpoint'; +import { Tools } from '../common/tools'; +import { UpdateManager } from './updateManager'; + export class LuaDebugSession extends LoggingDebugSession { public static isNeedB64EncodeStr: boolean = true; private static THREAD_ID = 1; //调试器不支持多线程,硬编码THREAD_ID为1 @@ -138,15 +140,18 @@ export class LuaDebugSession extends LoggingDebugSession { Tools.useAutoPathMode = !!args.autoPathMode; Tools.pathCaseSensitivity = !!args.pathCaseSensitivity; - //1.1.生成文件map if(Tools.useAutoPathMode === true){ Tools.rebuildAcceptExtMap(args.luaFileExtension); Tools.rebuildWorkspaceNamePathMap(args.cwd); Tools.checkSameNameFile(); } - //去除out, Debugger/debugger_lib/plugins/Darwin/ libpdebug_版本号.so - let clibPath = path.dirname(__dirname) + '/Debugger/debugger_lib/plugins/' + // 普通模式下才需要检查升级,单文件调试不用 + if(args.name === 'LuaPanda'){ + UpdateManager.checkIfLuaPandaNeedUpdate(); + } + + // 去除out, Debugger/debugger_lib/plugins/Darwin/ libpdebug_版本号.so let sendArgs = new Array(); sendArgs["stopOnEntry"] = !!args.stopOnEntry; sendArgs["luaFileExtension"] = args.luaFileExtension; @@ -157,11 +162,9 @@ export class LuaDebugSession extends LoggingDebugSession { sendArgs["debugMode"] = args.DebugMode; sendArgs["pathCaseSensitivity"] = args.pathCaseSensitivity; sendArgs["OSType"] = os.type(); - sendArgs["clibPath"] = clibPath; + sendArgs["clibPath"] = Tools.getClibPathInExtension(); sendArgs["useCHook"] = args.useCHook; - let pkg = require("../package.json"); - let adapterVersion = pkg.version; - sendArgs["adapterVersion"] = String(adapterVersion); + sendArgs["adapterVersion"] = String(Tools.adapterVersion); sendArgs["autoPathMode"] = Tools.useAutoPathMode; if(args.docPathReplace instanceof Array && args.docPathReplace.length === 2 ){ @@ -189,7 +192,7 @@ export class LuaDebugSession extends LoggingDebugSession { if (typeof info.debuggerVer == "string"){ //转数字 let DVerArr = info.debuggerVer.split("."); - let AVerArr = String(adapterVersion).split("."); + let AVerArr = String(Tools.adapterVersion).split("."); if (DVerArr.length === AVerArr.length && DVerArr.length === 3 ){ //在adapter和debugger版本号长度相等的前提下,比较大版本,大版本 <2 或者 小版本 < 1 就提示. 2.1.0以下会提示 if ( parseInt(DVerArr[0]) < 2 || parseInt(DVerArr[1]) < 1 ){ @@ -270,8 +273,8 @@ export class LuaDebugSession extends LoggingDebugSession { // 把路径加入package.path let pathCMD = "'"; - let pathArr = path.dirname(__dirname).split( path.sep ); - let stdPath = pathArr.join('/'); + let pathArr = Tools.VSCodeExtensionPath.split( path.sep ); + let stdPath = pathArr.join('/'); pathCMD = pathCMD + stdPath + "/Debugger/?.lua;" pathCMD = pathCMD + args.packagePath.join(';') pathCMD = pathCMD + "'"; diff --git a/src/luaDebugRuntime.ts b/src/debug/luaDebugRuntime.ts similarity index 98% rename from src/luaDebugRuntime.ts rename to src/debug/luaDebugRuntime.ts index 00bd7ae..217fd78 100755 --- a/src/luaDebugRuntime.ts +++ b/src/debug/luaDebugRuntime.ts @@ -2,9 +2,9 @@ import * as vscode from 'vscode'; import { EventEmitter } from 'events'; import { DataProcesser } from './dataProcesser'; import { DebugProtocol } from 'vscode-debugprotocol'; -import { DebugLogger } from './LogManager'; -import { StatusBarManager } from './StatusBarManager'; -import { Tools } from './Tools'; +import { DebugLogger } from '../common/logManager'; +import { StatusBarManager } from '../common/statusBarManager'; +import { Tools } from '../common/tools'; export interface LuaBreakpoint { diff --git a/src/debug/updateManager.ts b/src/debug/updateManager.ts new file mode 100644 index 0000000..255c9c9 --- /dev/null +++ b/src/debug/updateManager.ts @@ -0,0 +1,49 @@ +import { Tools } from '../common/tools'; +import { DebugLogger } from '../common/logManager'; +import * as vscode from 'vscode'; +import * as fs from "fs"; + +export class UpdateManager{ + // 获取调试器lua文件的版本号,并提示用户升级 + public static checkIfLuaPandaNeedUpdate(){ + // 从列表中找到文件 + if(Tools.fileNameToPathMap && typeof(Tools.fileNameToPathMap["LuaPanda"]) === 'string'){ + Tools.luapandaPathInUserProj = Tools.fileNameToPathMap["LuaPanda"]; + } + + if(!Tools.luapandaPathInUserProj){ + return; + } + + let luapandaTxt = Tools.readFileContent(Tools.luapandaPathInUserProj); + let dver = luapandaTxt.match(/(?<=local debuggerVer = )("(.*?)")/); + if(dver && dver.length === 3){ + let DVerArr = dver[2].split('.'); + let AVerArr = String(Tools.adapterVersion).split("."); + if (DVerArr.length === AVerArr.length && DVerArr.length === 3 ){ + if ( parseInt(DVerArr[0]) < parseInt(AVerArr[0]) || parseInt(DVerArr[1]) < parseInt(AVerArr[1]) || parseInt(DVerArr[2]) < parseInt(AVerArr[2]) ){ + vscode.window.showInformationMessage('当前工程中 LuaPanda 文件版本比较低,是否自动升级为新版本?', 'Yes', 'No').then(value => { + if(value === "Yes"){ this.updateLuaPandaFile(Tools.luapandaPathInUserProj) }; + }) + } + }else{ + //版本号异常,不做处理 + } + } + } + + // 更新调试器lua文件(读取预置文件,写入工程的目标文件中) + public static updateLuaPandaFile(pandaPath) { + if(!pandaPath){ + pandaPath = Tools.luapandaPathInUserProj; + } + //文件替换 + let luapandaContent = fs.readFileSync(Tools.getLuaPathInExtension()); + fs.writeFile(pandaPath, luapandaContent , function(err: NodeJS.ErrnoException){ + if(err){ + DebugLogger.showTips("升级失败,", 1); + } + DebugLogger.showTips("升级成功", 0); + }); + } +} \ No newline at end of file diff --git a/src/debug/visualSetting.ts b/src/debug/visualSetting.ts new file mode 100644 index 0000000..f839fc5 --- /dev/null +++ b/src/debug/visualSetting.ts @@ -0,0 +1,87 @@ +// 可视化配置部分 +import { Tools } from '../common/tools'; +import * as fs from "fs"; + +export class VisualSetting { + + private static readLaunchjson(){ + let launchPath = Tools.VSCodeOpenedFolder + "/.vscode/launch.json"; + //如果文件不存在,就创建一个 + let launchExist = fs.existsSync(launchPath); + let jsonStr; + if(!launchExist){ + // 文件不存在,读取预制文件,创建launch + let launchTemplate = Tools.readFileContent(Tools.VSCodeExtensionPath + "/res/others/launch.json"); + Tools.writeFileContent(Tools.VSCodeOpenedFolder + "/.vscode/launch.json" ,launchTemplate); + jsonStr = launchTemplate; + }else{ + // 文件存在,读取launch.json的信息 + jsonStr = Tools.readFileContent(launchPath); + } + + if(jsonStr == null || jsonStr == ''){ + // 没有找到launch.json 文件,生成一份(读取预制内容,拷贝到其中) + return null; + } + + //去除注释行 + let reg = /(\/\/.*)|(\/\*[\s\S]*?\*\/)/g;// 正则表达式 + jsonStr = jsonStr.replace(reg, ''); + let launchSettings = JSON.parse(jsonStr); + return launchSettings; + } + + // 处理配置文件launch.json + public static setLaunchToWeb(webview){ + let settings = this.readLaunchjson(); + + let obj = new Object(); + obj["command"] = "init_setting"; + for (const key in settings.configurations) { + const v = settings.configurations[key]; + + if(v["name"] === "LuaPanda"){ + obj["LuaPanda"] = v; + } + if(v["name"] === "LuaPanda-DebugFile"){ + obj["LuaPanda-DebugFile"] = v; + } + } + //setting反馈到html中 + let newJson = JSON.stringify(obj); + webview.postMessage(newJson); + } + + public static getWebMessage(message) { + let messageObj = JSON.parse(message.webInfo); + switch (messageObj.command) { + case 'save_settings': + this.processSaveSettings(messageObj); + break; + } + } + + private static processSaveSettings(messageObj) { + // 再读取一次launch.json , 序列化,用传来的obj替换之前的 + let settings = this.readLaunchjson(); + for (const keyLaunch in settings.configurations) { + let valueLaunch = settings.configurations[keyLaunch] + if(valueLaunch["name"] === "LuaPanda"){ + for (const keyWeb of Object.keys(messageObj["LuaPanda"])) { + valueLaunch[keyWeb] = messageObj["LuaPanda"][keyWeb]; + } + } + + if(valueLaunch["name"] === "LuaPanda-DebugFile"){ + for (const keyWeb of Object.keys(messageObj["LuaPanda-DebugFile"])) { + valueLaunch[keyWeb] = messageObj["LuaPanda-DebugFile"][keyWeb]; + } + } + + } + //序列化并写入 + let launchJson = JSON.stringify(settings, null, 4); + // console.log(launchJson); + Tools.writeFileContent(Tools.VSCodeOpenedFolder + "/.vscode/launch.json" ,launchJson); + } +} \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index 9802953..bd737b3 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -2,36 +2,127 @@ import * as vscode from 'vscode'; import * as Net from 'net'; -import { LuaDebugSession } from './luaDebug'; -import { DebugLogger } from './LogManager'; -import { StatusBarManager } from './StatusBarManager'; -import { Tools } from './Tools'; +import * as path from 'path'; +import { LuaDebugSession } from './debug/luaDebug'; +import { DebugLogger } from './common/logManager'; +import { StatusBarManager } from './common/statusBarManager'; +import { Tools } from './common/tools'; +import { + LanguageClient, + LanguageClientOptions, + ServerOptions, + TransportKind +} from 'vscode-languageclient'; +import { workspace, ExtensionContext } from 'vscode'; +import { VisualSetting } from './debug/visualSetting' +let client: LanguageClient; -export function activate(context: vscode.ExtensionContext) { - //reloadWindow +export function activate(context: ExtensionContext) { + // reloadWindow let reloadWindow = vscode.commands.registerCommand('luapanda.reloadLuaDebug', function () { vscode.commands.executeCommand("workbench.action.reloadWindow") }); context.subscriptions.push(reloadWindow); - //force garbage collect + // force garbage collect let LuaGarbageCollect = vscode.commands.registerCommand('luapanda.LuaGarbageCollect', function () { LuaDebugSession.getInstance().LuaGarbageCollect(); vscode.window.showInformationMessage('Lua Garbage Collect!'); }); context.subscriptions.push(LuaGarbageCollect); + let openSettingsPage = vscode.commands.registerCommand('luapanda.openSettingsPage', function () { + // 和VSCode的交互 + let panel: vscode.WebviewPanel = vscode.window.createWebviewPanel( + 'LuaPanda Setting', + 'LuaPanda 项目配置', + vscode.ViewColumn.One, + { + retainContextWhenHidden: true, + enableScripts: true + } + ); + + panel.webview.html = Tools.readFileContent(Tools.VSCodeExtensionPath + '/res/web/settings.html'); + // Handle messages from the webview + panel.webview.onDidReceiveMessage(message => { + VisualSetting.getWebMessage(message) + }, + undefined, + context.subscriptions + ); + // 读入配置 + VisualSetting.setLaunchToWeb(panel.webview); + }); + context.subscriptions.push(openSettingsPage); + const provider = new LuaConfigurationProvider() context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider('lua', provider)); context.subscriptions.push(provider); - //init log + + // 公共变量赋值 + let pkg = require( context.extensionPath + "/package.json"); + Tools.adapterVersion = pkg.version; + Tools.VSCodeExtensionPath = context.extensionPath; + // init log DebugLogger.init(); StatusBarManager.init(); + + // language server 相关 + // The server is implemented in node + let serverModule = context.asAbsolutePath( + path.join('out', 'code', 'server', 'server.js') + ); + // The debug options for the server + // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging + let debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] }; + + // If the extension is launched in debug mode then the debug server options are used + // Otherwise the run options are used + let serverOptions: ServerOptions = { + run: { module: serverModule, transport: TransportKind.ipc }, + debug: { + module: serverModule, + transport: TransportKind.ipc, + options: debugOptions + } + }; + + // Options to control the language client + let clientOptions: LanguageClientOptions = { + // Register the server for plain text documents + documentSelector: [{ scheme: 'file', language: 'lua' }], + synchronize: { + // Notify the server about file changes to '.clientrc files contained in the workspace + fileEvents: workspace.createFileSystemWatcher('**/.clientrc') + } + }; + + // Create the language client and start the client. + client = new LanguageClient( + 'lua_analyzer', + 'Lua Analyzer', + serverOptions, + clientOptions + ); + + // Start the client. This will also launch the server + client.start(); + client.onReady().then(() => { + client.onNotification("showProgress", showProgress); + client.onNotification("setRootFolder", setRootFolder); + client.onNotification("setLuaPandaPath", setLuaPandaPath); + }); + } export function deactivate() { - // nothing to do + if (!client) { + return undefined; + } + return client.stop(); } +// debug启动时的配置项处理 class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { private _server?: Net.Server; resolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, token?: vscode.CancellationToken): vscode.ProviderResult { @@ -64,8 +155,8 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { // 把路径加入package.path let path = require("path"); let pathCMD = "'"; - let pathArr = path.dirname(__dirname).split( path.sep ); - let stdPath = pathArr.join('/'); + let pathArr = Tools.VSCodeExtensionPath.split( path.sep ); + let stdPath = pathArr.join('/'); pathCMD = pathCMD + stdPath + "/Debugger/?.lua;" pathCMD = pathCMD + config.packagePath.join(';') pathCMD = pathCMD + "'"; @@ -186,3 +277,16 @@ class LuaConfigurationProvider implements vscode.DebugConfigurationProvider { } } } + +// code server端消息回调函数 +function showProgress(message: string) { + StatusBarManager.showSetting(message); +} + +function setRootFolder(message: string) { + Tools.VSCodeOpenedFolder = message; +} + +function setLuaPandaPath(message: string) { + Tools.luapandaPathInUserProj = message; +} diff --git a/src/tsconfig.json b/src/tsconfig.json index d5421db..fd4441a 100755 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { "module": "commonjs", + "lib": ["es6", "dom", "es2017"], "target": "es6", - "noImplicitAny": false, "removeComments": false, "noUnusedLocals": true, @@ -11,7 +11,8 @@ "sourceMap": true, "outDir": "../out", "preserveConstEnums": true, - "strictNullChecks": true, - "noUnusedParameters": false + "strictNullChecks": false, + "noUnusedParameters": false, + "strict": false /* enable all strict type-checking options */ } } From 831f7a78011f578639410ea5ad56465219575b4d Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 29 Oct 2019 10:14:48 +0800 Subject: [PATCH 103/431] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A1=A5=E5=85=A8?= =?UTF-8?q?=E5=92=8C=E8=B7=AF=E5=BE=84=E8=B7=B3=E8=BD=ACbugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/code/server/codeCompleting.ts | 4 +- src/code/server/codeSymbol.ts | 182 ++++++++++++++++-------------- src/code/server/codeTools.ts | 5 +- src/code/server/server.ts | 2 +- 4 files changed, 106 insertions(+), 87 deletions(-) diff --git a/src/code/server/codeCompleting.ts b/src/code/server/codeCompleting.ts index 3a1726c..069cda8 100644 --- a/src/code/server/codeCompleting.ts +++ b/src/code/server/codeCompleting.ts @@ -133,7 +133,7 @@ export class CodeCompleting { } }else{ - tagSearchRetSymb = CodeSymbol.searchGlobalInRequireTree(searchName, uri, Tools.SearchMode.FirstLetterContinuousMatching ); + tagSearchRetSymb = CodeSymbol.searchAllSymbolinRequireTreeforCompleting(uri, searchName, Tools.SearchMode.FirstLetterContinuousMatching); } if( !tagSearchRetSymb || tagSearchRetSymb.length < 1 ){ //当直接替换tag查不到的时候,用一次类型推导 @@ -143,7 +143,7 @@ export class CodeCompleting { this.replaceDic[tagSearchRetSymb[0].searchName] = addElement.searchName; searchName = tagSearchRetSymb[0].searchName; //再做一次搜索 - tagSearchRetSymb = CodeSymbol.searchGlobalInRequireTree(tagSearchRetSymb[0].searchName , uri, Tools.SearchMode.FirstLetterContinuousMatching ); + tagSearchRetSymb = CodeSymbol.searchAllSymbolinRequireTreeforCompleting(uri, tagSearchRetSymb[0].searchName , Tools.SearchMode.FirstLetterContinuousMatching); }else{ // tag 符号没有查到,类型推导也没有找到。 return; diff --git a/src/code/server/codeSymbol.ts b/src/code/server/codeSymbol.ts index 9c786e9..1be2592 100644 --- a/src/code/server/codeSymbol.ts +++ b/src/code/server/codeSymbol.ts @@ -4,7 +4,10 @@ // https://opensource.org/licenses/BSD-3-Clause // Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -//创建并管理文件中的符号 +// CodeSymbol 管理AST中的符号, 对上提供各种接口。 +// 获取/刷新文件符号 +// + import * as Tools from './codeTools'; import { CodeEditor } from './codeEditor'; import { DocSymbolProcesser } from './docSymbolProcesser'; @@ -34,7 +37,7 @@ export class CodeSymbol { if(luaText == undefined){ luaText = CodeEditor.getCode(uri); } - this.createDocSymbals(uri, luaText); + this.createDocSymbol(uri, luaText); } // 获取指定文件的所有符号 , 并返回Array形式 @@ -69,11 +72,14 @@ export class CodeSymbol { // 获取指定文件的返回值,如无返回null public static getCertainDocReturnValue(uri):string{ + this.createCertainDocSymbols(uri); let docSymbals = this.docSymbolMap.get(uri); - if(docSymbals) + if(docSymbals){ return docSymbals.getFileReturnArray(); - else + } + else{ return null; + } } // 指定文件夹中的符号处理 @@ -86,7 +92,7 @@ export class CodeSymbol { filesArray.forEach(pathArray => { let uri = Tools.pathToUri(pathArray); if(!this.docSymbolMap.has(uri)){ - this.createDocSymbals( uri , pathArray ); + this.createDocSymbol( uri , pathArray ); } }); } @@ -98,7 +104,7 @@ export class CodeSymbol { } let filesArray = Tools.getDirFiles( path ); filesArray.forEach(element => { - this.createDocSymbals( element ); + this.createDocSymbol( element ); }); } @@ -130,23 +136,23 @@ export class CodeSymbol { return g_symb; } - // 获取Require文件中的全局符号(本文件引用的其他文件), 以dictionary的形式返回 - public static getRequireTreeGlobalSymbols(uri: string){ - if(uri === undefined || uri === ''){ - return; - } - - let fileList = this.getRequireTreeList(uri); - let g_symb = {}; - for (let index = 0; index < fileList.length; index++) { - let g_s = this.getCertainDocSymbolsReturnDic( fileList[index], null, Tools.SearchRange.GlobalSymbols); - for (const key in g_s) { - const element = g_s[key]; - g_symb[key] = element; - } - } - return g_symb; - } + // 获取Require文件中的全局符号(本文件引用的其他文件), 以dictionary的形式返回 + // public static getRequireTreeGlobalSymbols(uri: string){ + // if(uri === undefined || uri === ''){ + // return; + // } + + // let fileList = this.getRequireTreeList(uri); + // let g_symb = {}; + // for (let index = 0; index < fileList.length; index++) { + // let g_s = this.getCertainDocSymbolsReturnDic( fileList[index], null, Tools.SearchRange.GlobalSymbols); + // for (const key in g_s) { + // const element = g_s[key]; + // g_symb[key] = element; + // } + // } + // return g_symb; + // } //reference处理 public static searchSymbolReferenceinDoc(searchSymbol) { @@ -213,10 +219,15 @@ export class CodeSymbol { * @param searchedFiles 标记已经搜索过的文件,上层调用该方法时可以不传 * @return 搜索结果,SymbolInformation数组 */ - public static searchGlobalInRequireTree(symbolName: string, uri: string , searchMethod: Tools.SearchMode , searchedFiles?: Map): Tools.SymbolInformation[] { + public static searchGlobalInRequireTree(symbolName: string, uri: string , searchMethod: Tools.SearchMode , searchedFiles?: Map, isFirstEntry?: boolean): Tools.SymbolInformation[] { if (searchedFiles == undefined) { searchedFiles = new Map(); } + + if(isFirstEntry == undefined){ + isFirstEntry = true; + } + let result: Tools.SymbolInformation[] = new Array(); // uri为空直接返回 @@ -230,7 +241,12 @@ export class CodeSymbol { } // 在单个文件中搜索全局变量 let docSymbol = this.docSymbolMap.get(uri); - let searchResult = docSymbol.searchMatchSymbal(symbolName, searchMethod, Tools.SearchRange.GlobalSymbols); + let searchResult; + if(isFirstEntry){ + searchResult = docSymbol.searchMatchSymbal(symbolName, searchMethod, Tools.SearchRange.AllSymbols); + }else{ + searchResult = docSymbol.searchMatchSymbal(symbolName, searchMethod, Tools.SearchRange.GlobalSymbols); + } result = result.concat(searchResult); searchedFiles.set(uri, true); @@ -240,12 +256,12 @@ export class CodeSymbol { // 搜索的原则为在引用树上优先搜索最近的定义,即先搜本文件,然后逆序搜索require的文件,再逆序搜索reference // 搜索require的文件 for (let i = requireFiles.length - 1; i >= 0; i--) { - let searchResult = this.searchGlobalInRequireTree(symbolName, Tools.transFileNameToUri(requireFiles[i].reqName), searchMethod, searchedFiles); + let searchResult = this.searchGlobalInRequireTree(symbolName, Tools.transFileNameToUri(requireFiles[i].reqName), searchMethod, searchedFiles, false); result = result.concat(searchResult); } // 搜索require本文件的文件(references) for (let i = references.length - 1; i >= 0; i--) { - let searchResult = this.searchGlobalInRequireTree(symbolName, references[i], searchMethod, searchedFiles); + let searchResult = this.searchGlobalInRequireTree(symbolName, references[i], searchMethod, searchedFiles, false); result = result.concat(searchResult); } @@ -323,33 +339,35 @@ export class CodeSymbol { } }); } + // 创建某个lua文件的符号 // @uri 文件uri // @text 文件内容 - private static createDocSymbals(uri: string, luaText?: string): Tools.SymbolInformation[] { + private static createDocSymbol(uri: string, luaText?: string): Tools.SymbolInformation[] { if(uri == null) return null; if (luaText == undefined) { luaText = Tools.getFileContent(Tools.uriToPath(uri)); } + let oldDocSymbol = this.docSymbolMap.get(uri); - let docSymbol: DocSymbolProcesser = DocSymbolProcesser.create(luaText, uri); - if(docSymbol){ - if( !docSymbol.parseError){ + let newDocSymbol: DocSymbolProcesser = DocSymbolProcesser.create(luaText, uri); + if(newDocSymbol){ + if( !newDocSymbol.parseError){ //解析无误 - this.docSymbolMap.set(uri, docSymbol); - this.updateReference(oldDocSymbol, docSymbol); + this.docSymbolMap.set(uri, newDocSymbol); + this.updateReference(oldDocSymbol, newDocSymbol); }else{ //解析过程有误 if ( !this.docSymbolMap.get(uri) ){ //map中还未解析过这个table - this.docSymbolMap.set(uri, docSymbol); + this.docSymbolMap.set(uri, newDocSymbol); }else{ //map中已有 let oldLen = this.docSymbolMap.get(uri).getAllSymbolsArray().length; - let newLen = docSymbol.getAllSymbolsArray().length; + let newLen = newDocSymbol.getAllSymbolsArray().length; if (newLen > oldLen){ - this.docSymbolMap.set(uri, docSymbol); - this.updateReference(oldDocSymbol, docSymbol); + this.docSymbolMap.set(uri, newDocSymbol); + this.updateReference(oldDocSymbol, newDocSymbol); } } } @@ -371,50 +389,50 @@ export class CodeSymbol { } // 获取某个文件的引用树列表 - private static getRequireTreeList(uri: string){ - if(uri === undefined || uri === ''){ - return; - } - - function recursiveGetRequireTreeList(uri: string, fileList: string[]){ - if(uri === undefined || uri === ''){ - return; - } - // 如果 uri 的符号列表不存在,创建 - if (!CodeSymbol.docSymbolMap.has(uri)) { - Logger.log("createDocSymbals : "+ uri); - let luaText = CodeEditor.getCode(uri); - CodeSymbol.createDocSymbals(uri, luaText); - } - - //如果uri所在文件存在错误,则无法创建成功。这里docProcesser == null - let docProcesser = CodeSymbol.docSymbolMap.get(uri); - if(docProcesser == null || docProcesser.getRequiresArray == null){ - Logger.log("get docProcesser or getRequireFiles error!"); - return; - } - - //当前文件已经在递归处理过了 - if(alreadyProcessFile[uri] == 1){ - return; - }else{ - alreadyProcessFile[uri] = 1; - } - - let reqFiles = docProcesser.getRequiresArray(); - for(let idx = 0, len = reqFiles.length ; idx < len ; idx++ ){ - let newuri = Tools.transFileNameToUri(reqFiles[idx]['reqName']) - recursiveGetRequireTreeList(newuri, fileList); - } - fileList.push(uri); - return fileList; - } - - let fileList = new Array(); - let alreadyProcessFile = new Object(); //防止循环引用 - recursiveGetRequireTreeList(uri, fileList); - return fileList; - } + // private static getRequireTreeList(uri: string){ + // if(uri === undefined || uri === ''){ + // return; + // } + + // function recursiveGetRequireTreeList(uri: string, fileList: string[]){ + // if(uri === undefined || uri === ''){ + // return; + // } + // // 如果 uri 的符号列表不存在,创建 + // if (!CodeSymbol.docSymbolMap.has(uri)) { + // Logger.log("createDocSymbals : "+ uri); + // let luaText = CodeEditor.getCode(uri); + // CodeSymbol.createDocSymbol(uri, luaText); + // } + + // //如果uri所在文件存在错误,则无法创建成功。这里docProcesser == null + // let docProcesser = CodeSymbol.docSymbolMap.get(uri); + // if(docProcesser == null || docProcesser.getRequiresArray == null){ + // Logger.log("get docProcesser or getRequireFiles error!"); + // return; + // } + + // //当前文件已经在递归处理过了 + // if(alreadyProcessFile[uri] == 1){ + // return; + // }else{ + // alreadyProcessFile[uri] = 1; + // } + + // let reqFiles = docProcesser.getRequiresArray(); + // for(let idx = 0, len = reqFiles.length ; idx < len ; idx++ ){ + // let newuri = Tools.transFileNameToUri(reqFiles[idx]['reqName']) + // recursiveGetRequireTreeList(newuri, fileList); + // } + // fileList.push(uri); + // return fileList; + // } + + // let fileList = new Array(); + // let alreadyProcessFile = new Object(); //防止循环引用 + // recursiveGetRequireTreeList(uri, fileList); + // return fileList; + // } // 递归搜索 引用树,查找符号 // @fileName 文件名 @@ -430,7 +448,7 @@ export class CodeSymbol { if (!this.docSymbolMap.has(uri)) { Logger.log("createDocSymbals : "+ uri); let luaText = CodeEditor.getCode(uri); - this.createDocSymbals(uri, luaText); + this.createDocSymbol(uri, luaText); } //开始递归 //如果uri所在文件存在错误,则无法创建成功。这里docProcesser == null diff --git a/src/code/server/codeTools.ts b/src/code/server/codeTools.ts index 0b25767..2b380e8 100644 --- a/src/code/server/codeTools.ts +++ b/src/code/server/codeTools.ts @@ -268,9 +268,10 @@ export function refresh_FileName_Uri_Cache(){ // @fileName 文件名 // @return uri string export function transFileNameToUri(requireName : string): string{ + //从路径中提取文件名 + let parseName = path.parse(requireName); //从fileMap中查找文件全路径 - // Logger.InfoLog("transFileNameToUri find--" + requireName); - let cacheUri = fileName_Uri_Cache[requireName]; + let cacheUri = fileName_Uri_Cache[parseName.name]; if(cacheUri){ return cacheUri; } diff --git a/src/code/server/server.ts b/src/code/server/server.ts index 5cca424..6c4f5a1 100755 --- a/src/code/server/server.ts +++ b/src/code/server/server.ts @@ -128,7 +128,7 @@ connection.onInitialize((initPara: InitializeParams) => { //引用分析 referencesProvider: false, //代码格式化 - documentFormattingProvider: true, + documentFormattingProvider: false, documentRangeFormattingProvider: false, //代码选中高亮 documentHighlightProvider: false, From 630efb02c87f4a730b2be036b28bb08124310e46 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 29 Oct 2019 10:54:13 +0800 Subject: [PATCH 104/431] bugfix --- src/code/server/codeTools.ts | 3 +++ src/code/server/docSymbolProcesser.ts | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/src/code/server/codeTools.ts b/src/code/server/codeTools.ts index 2b380e8..d3b9b0c 100644 --- a/src/code/server/codeTools.ts +++ b/src/code/server/codeTools.ts @@ -268,6 +268,9 @@ export function refresh_FileName_Uri_Cache(){ // @fileName 文件名 // @return uri string export function transFileNameToUri(requireName : string): string{ + if(requireName == null){ + return ''; + } //从路径中提取文件名 let parseName = path.parse(requireName); //从fileMap中查找文件全路径 diff --git a/src/code/server/docSymbolProcesser.ts b/src/code/server/docSymbolProcesser.ts index a7fd252..45136f4 100644 --- a/src/code/server/docSymbolProcesser.ts +++ b/src/code/server/docSymbolProcesser.ts @@ -709,6 +709,9 @@ export class DocSymbolProcesser { else if (baseNode['type'] == 'Identifier') { return { name: baseNode['name'], isLocal: baseNode['isLocal'] }; } + else if (baseNode['type'] == 'StringLiteral') { + return { name: baseNode['value'], isLocal: false }; + } else if (baseNode['type'] == 'IndexExpression') { let ret = this.baseProcess(baseNode['base']); let str = ret.name; @@ -736,6 +739,12 @@ export class DocSymbolProcesser { retObj = { name: retStr, isLocal: isLocal, origion: ret.name }; } + if(baseNode['index']['type'] == "StringLiteral"){ + let ret = this.baseProcess(baseNode['index']); + let retStr = str + '["' + ret.name + '"]'; + retObj = { name: retStr, isLocal: isLocal, origion: ret.name }; + } + return retObj; } return { name: '', isLocal: false }; From 3071f0396031a4b0dff7b9700ddd380603c8ba8b Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 29 Oct 2019 11:47:51 +0800 Subject: [PATCH 105/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=EF=BC=8C=E5=8A=A0=E5=85=A5=E4=BA=8C=E6=AC=A1?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E9=80=BB=E8=BE=91=E5=92=8C=E6=9C=AC=E6=AC=A1?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E6=9C=9F=E9=97=B4=E4=B8=8D=E5=86=8D=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/debug/luaDebug.ts | 2 +- src/debug/updateManager.ts | 31 +++++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/debug/luaDebug.ts b/src/debug/luaDebug.ts index 2ace210..a4f6539 100755 --- a/src/debug/luaDebug.ts +++ b/src/debug/luaDebug.ts @@ -147,7 +147,7 @@ export class LuaDebugSession extends LoggingDebugSession { } // 普通模式下才需要检查升级,单文件调试不用 - if(args.name === 'LuaPanda'){ + if( args.name === 'LuaPanda' ){ UpdateManager.checkIfLuaPandaNeedUpdate(); } diff --git a/src/debug/updateManager.ts b/src/debug/updateManager.ts index 255c9c9..88afb62 100644 --- a/src/debug/updateManager.ts +++ b/src/debug/updateManager.ts @@ -4,8 +4,18 @@ import * as vscode from 'vscode'; import * as fs from "fs"; export class UpdateManager{ + private static checkUpdate = true; + + public static setCheckUpdate(state){ + this.checkUpdate = state; + } + // 获取调试器lua文件的版本号,并提示用户升级 public static checkIfLuaPandaNeedUpdate(){ + if(!this.checkUpdate){ + return; + } + // 从列表中找到文件 if(Tools.fileNameToPathMap && typeof(Tools.fileNameToPathMap["LuaPanda"]) === 'string'){ Tools.luapandaPathInUserProj = Tools.fileNameToPathMap["LuaPanda"]; @@ -23,8 +33,19 @@ export class UpdateManager{ if (DVerArr.length === AVerArr.length && DVerArr.length === 3 ){ if ( parseInt(DVerArr[0]) < parseInt(AVerArr[0]) || parseInt(DVerArr[1]) < parseInt(AVerArr[1]) || parseInt(DVerArr[2]) < parseInt(AVerArr[2]) ){ vscode.window.showInformationMessage('当前工程中 LuaPanda 文件版本比较低,是否自动升级为新版本?', 'Yes', 'No').then(value => { - if(value === "Yes"){ this.updateLuaPandaFile(Tools.luapandaPathInUserProj) }; - }) + if(value === "Yes"){ + vscode.window.showInformationMessage('已准备好更新 ' + Tools.luapandaPathInUserProj+ ' 如用户对此文件有修改, 建议备份后升级。是否现在升级?', '确认升级', '稍后再试').then(value => { + if(value === "确认升级"){ + UpdateManager.updateLuaPandaFile(Tools.luapandaPathInUserProj) + } + }); + } + else{ + // 本次插件运行期间不再提示 + UpdateManager.setCheckUpdate(false); + }; + + }); } }else{ //版本号异常,不做处理 @@ -41,9 +62,11 @@ export class UpdateManager{ let luapandaContent = fs.readFileSync(Tools.getLuaPathInExtension()); fs.writeFile(pandaPath, luapandaContent , function(err: NodeJS.ErrnoException){ if(err){ - DebugLogger.showTips("升级失败,", 1); + DebugLogger.showTips("升级失败, " + Tools.luapandaPathInUserProj + "写入失败! 可以手动替换此文件到github最新版", 1); + }else{ + DebugLogger.showTips("升级成功, " + Tools.luapandaPathInUserProj + "版本已升级为 " + Tools.adapterVersion , 0); } - DebugLogger.showTips("升级成功", 0); + UpdateManager.setCheckUpdate(false); }); } } \ No newline at end of file From e6569b473c95d0369dc23c956c4dc44039d9c8c1 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 29 Oct 2019 15:46:28 +0800 Subject: [PATCH 106/431] =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=BA=86=20luapanda.?= =?UTF-8?q?lua=20=E4=BB=85=E4=BF=9D=E7=95=99=E4=B8=80=E4=B8=AA=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/DebugTools.lua | 584 --------------------------------------- Debugger/LuaPanda.lua | 589 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 586 insertions(+), 587 deletions(-) delete mode 100644 Debugger/DebugTools.lua diff --git a/Debugger/DebugTools.lua b/Debugger/DebugTools.lua deleted file mode 100644 index bf3143f..0000000 --- a/Debugger/DebugTools.lua +++ /dev/null @@ -1,584 +0,0 @@ ---工具函数 -local DebugTools = {}; -local this = DebugTools; - -function this.getFileSource() - local info = debug.getinfo(1, "S") - for k,v in pairs(info) do - if k == "source" then - return v; - end - end -end - ---序列化并打印table -function this.printTable(t, name ,indent) - local str = (this.show(t, name, indent)); - print(str); -end - ---序列化并返回table -function this.serializeTable(t, name, indent) - local str = (this.show(t, name, indent)) - return str -end - ---[[ -Author: Julio Manuel Fernandez-Diaz -Date: January 12, 2007 -Modified slightly by RiciLake to avoid the unnecessary table traversal in tablecount() -Formats tables with cycles recursively to any depth. -The output is returned as a string. -References to other tables are shown as values. -Self references are indicated. -The string returned is "Lua code", which can be procesed -(in the case in which indent is composed by spaces or "--"). -Userdata and function keys and values are shown as strings, -which logically are exactly not equivalent to the original code. -This routine can serve for pretty formating tables with -proper indentations, apart from printing them: -print(table.show(t, "t")) -- a typical use -Heavily based on "Saving tables with cycles", PIL2, p. 113. -Arguments: -t is the table. -name is the name of the table (optional) -indent is a first indentation (optional). ---]] -function this.show(t, name, indent) - local cart -- a container - local autoref -- for self references - - local function isemptytable(t) return next(t) == nil end - - local function basicSerialize (o) - local so = tostring(o) - if type(o) == "function" then - local info = debug.getinfo(o, "S") - -- info.name is nil because o is not a calling level - if info.what == "C" then - return string.format("%q", so .. ", C function") - else - -- the information is defined through lines - return string.format("%q", so .. ", defined in (" .. - info.linedefined .. "-" .. info.lastlinedefined .. - ")" .. info.source) - end - elseif type(o) == "number" or type(o) == "boolean" then - return so - else - return string.format("%q", so) - end - end - - local function addtocart (value, name, indent, saved, field) - indent = indent or "" - saved = saved or {} - field = field or name - - cart = cart .. indent .. field - - if type(value) ~= "table" then - cart = cart .. " = " .. basicSerialize(value) .. ";\n" - else - if saved[value] then - cart = cart .. " = {}; -- " .. saved[value] - .. " (self reference)\n" - autoref = autoref .. name .. " = " .. saved[value] .. ";\n" - else - saved[value] = name - --if tablecount(value) == 0 then - if isemptytable(value) then - cart = cart .. " = {};\n" - else - cart = cart .. " = {\n" - for k, v in pairs(value) do - k = basicSerialize(k) - local fname = string.format("%s[%s]", name, k) - field = string.format("[%s]", k) - -- three spaces between levels - addtocart(v, fname, indent .. " ", saved, field) - end - cart = cart .. indent .. "};\n" - end - end - end - end - - name = name or "PRINT_Table" - if type(t) ~= "table" then - return name .. " = " .. basicSerialize(t) - end - cart, autoref = "", "" - addtocart(t, name, indent) - return cart .. autoref -end - ------------------------------------------------------------------------------ --- JSON4Lua: JSON encoding / decoding support for the Lua language. --- json Module. --- Author: Craig Mason-Jones --- Homepage: http://github.com/craigmj/json4lua/ --- Version: 1.0.0 --- This module is released under the MIT License (MIT). --- Please see LICENCE.txt for details. --- --- USAGE: --- This module exposes two functions: --- json.encode(o) --- Returns the table / string / boolean / number / nil / json.null value as a JSON-encoded string. --- json.decode(json_string) --- Returns a Lua object populated with the data encoded in the JSON string json_string. --- --- REQUIREMENTS: --- compat-5.1 if using Lua 5.0 --- --- CHANGELOG --- 0.9.20 Introduction of local Lua functions for private functions (removed _ function prefix). --- Fixed Lua 5.1 compatibility issues. --- Introduced json.null to have null values in associative arrays. --- json.encode() performance improvement (more than 50%) through table.concat rather than .. --- Introduced decode ability to ignore /**/ comments in the JSON string. --- 0.9.10 Fix to array encoding / decoding to correctly manage nil/null values in arrays. ------------------------------------------------------------------------------ - -function this.createJson() - ----------------------------------------------------------------------------- - -- Imports and dependencies - ----------------------------------------------------------------------------- - local math = require('math') - local string = require("string") - local table = require("table") - - ----------------------------------------------------------------------------- - -- Module declaration - ----------------------------------------------------------------------------- - local json = {} -- Public namespace - local json_private = {} -- Private namespace - - -- Public constants - json.EMPTY_ARRAY={} - json.EMPTY_OBJECT={} - - -- Public functions - - -- Private functions - local decode_scanArray - local decode_scanComment - local decode_scanConstant - local decode_scanNumber - local decode_scanObject - local decode_scanString - local decode_scanWhitespace - local encodeString - local isArray - local isEncodable - - ----------------------------------------------------------------------------- - -- PUBLIC FUNCTIONS - ----------------------------------------------------------------------------- - --- Encodes an arbitrary Lua object / variable. - -- @param v The Lua object / variable to be JSON encoded. - -- @return String containing the JSON encoding in internal Lua string format (i.e. not unicode) - function json.encode (v) - -- Handle nil values - if v==nil then - return "null" - end - - local vtype = type(v) - - -- Handle strings - if vtype=='string' then - return '"' .. json_private.encodeString(v) .. '"' -- Need to handle encoding in string - end - - -- Handle booleans - if vtype=='number' or vtype=='boolean' then - return tostring(v) - end - - -- Handle tables - if vtype=='table' then - local rval = {} - -- Consider arrays separately - local bArray, maxCount = isArray(v) - if bArray then - for i = 1,maxCount do - table.insert(rval, json.encode(v[i])) - end - else -- An object, not an array - for i,j in pairs(v) do - if isEncodable(i) and isEncodable(j) then - table.insert(rval, '"' .. json_private.encodeString(i) .. '":' .. json.encode(j)) - end - end - end - if bArray then - return '[' .. table.concat(rval,',') ..']' - else - return '{' .. table.concat(rval,',') .. '}' - end - end - - -- Handle null values - if vtype=='function' and v==json.null then - return 'null' - end - - assert(false,'encode attempt to encode unsupported type ' .. vtype .. ':' .. tostring(v)) - end - - - --- Decodes a JSON string and returns the decoded value as a Lua data structure / value. - -- @param s The string to scan. - -- @param [startPos] Optional starting position where the JSON string is located. Defaults to 1. - -- @param Lua object, number The object that was scanned, as a Lua table / string / number / boolean or nil, - -- and the position of the first character after - -- the scanned JSON object. - function json.decode(s, startPos) - startPos = startPos and startPos or 1 - startPos = decode_scanWhitespace(s,startPos) - assert(startPos<=string.len(s), 'Unterminated JSON encoded object found at position in [' .. s .. ']') - local curChar = string.sub(s,startPos,startPos) - -- Object - if curChar=='{' then - return decode_scanObject(s,startPos) - end - -- Array - if curChar=='[' then - return decode_scanArray(s,startPos) - end - -- Number - if string.find("+-0123456789.e", curChar, 1, true) then - return decode_scanNumber(s,startPos) - end - -- String - if curChar==[["]] or curChar==[[']] then - return decode_scanString(s,startPos) - end - if string.sub(s,startPos,startPos+1)=='/*' then - return json.decode(s, decode_scanComment(s,startPos)) - end - -- Otherwise, it must be a constant - return decode_scanConstant(s,startPos) - end - - --- The null function allows one to specify a null value in an associative array (which is otherwise - -- discarded if you set the value with 'nil' in Lua. Simply set t = { first=json.null } - function json.null() - return json.null -- so json.null() will also return null ;-) - end - ----------------------------------------------------------------------------- - -- Internal, PRIVATE functions. - -- Following a Python-like convention, I have prefixed all these 'PRIVATE' - -- functions with an underscore. - ----------------------------------------------------------------------------- - - --- Scans an array from JSON into a Lua object - -- startPos begins at the start of the array. - -- Returns the array and the next starting position - -- @param s The string being scanned. - -- @param startPos The starting position for the scan. - -- @return table, int The scanned array as a table, and the position of the next character to scan. - function decode_scanArray(s,startPos) - local array = {} -- The return value - local stringLen = string.len(s) - assert(string.sub(s,startPos,startPos)=='[','decode_scanArray called but array does not start at position ' .. startPos .. ' in string:\n'..s ) - startPos = startPos + 1 - -- Infinite loop for array elements - local index = 1 - repeat - startPos = decode_scanWhitespace(s,startPos) - assert(startPos<=stringLen,'JSON String ended unexpectedly scanning array.') - local curChar = string.sub(s,startPos,startPos) - if (curChar==']') then - return array, startPos+1 - end - if (curChar==',') then - startPos = decode_scanWhitespace(s,startPos+1) - end - assert(startPos<=stringLen, 'JSON String ended unexpectedly scanning array.') - local object - object, startPos = json.decode(s,startPos) - array[index] = object - index = index + 1 - until false - end - - --- Scans a comment and discards the comment. - -- Returns the position of the next character following the comment. - -- @param string s The JSON string to scan. - -- @param int startPos The starting position of the comment - function decode_scanComment(s, startPos) - assert( string.sub(s,startPos,startPos+1)=='/*', "decode_scanComment called but comment does not start at position " .. startPos) - local endPos = string.find(s,'*/',startPos+2) - assert(endPos~=nil, "Unterminated comment in string at " .. startPos) - return endPos+2 - end - - --- Scans for given constants: true, false or null - -- Returns the appropriate Lua type, and the position of the next character to read. - -- @param s The string being scanned. - -- @param startPos The position in the string at which to start scanning. - -- @return object, int The object (true, false or nil) and the position at which the next character should be - -- scanned. - function decode_scanConstant(s, startPos) - local consts = { ["true"] = true, ["false"] = false, ["null"] = nil } - local constNames = {"true","false","null"} - - for i,k in pairs(constNames) do - if string.sub(s,startPos, startPos + string.len(k) -1 )==k then - return consts[k], startPos + string.len(k) - end - end - assert(nil, 'Failed to scan constant from string ' .. s .. ' at starting position ' .. startPos) - end - - --- Scans a number from the JSON encoded string. - -- (in fact, also is able to scan numeric +- eqns, which is not - -- in the JSON spec.) - -- Returns the number, and the position of the next character - -- after the number. - -- @param s The string being scanned. - -- @param startPos The position at which to start scanning. - -- @return number, int The extracted number and the position of the next character to scan. - function decode_scanNumber(s,startPos) - local endPos = startPos+1 - local stringLen = string.len(s) - local acceptableChars = "+-0123456789.e" - while (string.find(acceptableChars, string.sub(s,endPos,endPos), 1, true) - and endPos<=stringLen - ) do - endPos = endPos + 1 - end - -- local stringValue = 'return ' .. string.sub(s, startPos, endPos - 1) - -- local stringEval = loadstring(stringValue) - -- assert(stringEval, 'Failed to scan number [ ' .. stringValue .. '] in JSON string at position ' .. startPos .. ' : ' .. endPos) - local numberValue = string.sub(s, startPos, endPos - 1) - return numberValue, endPos - end - - --- Scans a JSON object into a Lua object. - -- startPos begins at the start of the object. - -- Returns the object and the next starting position. - -- @param s The string being scanned. - -- @param startPos The starting position of the scan. - -- @return table, int The scanned object as a table and the position of the next character to scan. - function decode_scanObject(s,startPos) - local object = {} - local stringLen = string.len(s) - local key, value - assert(string.sub(s,startPos,startPos)=='{','decode_scanObject called but object does not start at position ' .. startPos .. ' in string:\n' .. s) - startPos = startPos + 1 - repeat - startPos = decode_scanWhitespace(s,startPos) - assert(startPos<=stringLen, 'JSON string ended unexpectedly while scanning object.') - local curChar = string.sub(s,startPos,startPos) - if (curChar=='}') then - return object,startPos+1 - end - if (curChar==',') then - startPos = decode_scanWhitespace(s,startPos+1) - end - assert(startPos<=stringLen, 'JSON string ended unexpectedly scanning object.') - -- Scan the key - key, startPos = json.decode(s,startPos) - assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) - startPos = decode_scanWhitespace(s,startPos) - assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) - assert(string.sub(s,startPos,startPos)==':','JSON object key-value assignment mal-formed at ' .. startPos) - startPos = decode_scanWhitespace(s,startPos+1) - assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) - value, startPos = json.decode(s,startPos) - object[key]=value - until false -- infinite loop while key-value pairs are found - end - - -- START SoniEx2 - -- Initialize some things used by decode_scanString - -- You know, for efficiency - local escapeSequences = { - ["\\t"] = "\t", - ["\\f"] = "\f", - ["\\r"] = "\r", - ["\\n"] = "\n", - ["\\b"] = "\b" - } - setmetatable(escapeSequences, {__index = function(t,k) - -- skip "\" aka strip escape - return string.sub(k,2) - end}) - -- END SoniEx2 - - --- Scans a JSON string from the opening inverted comma or single quote to the - -- end of the string. - -- Returns the string extracted as a Lua string, - -- and the position of the next non-string character - -- (after the closing inverted comma or single quote). - -- @param s The string being scanned. - -- @param startPos The starting position of the scan. - -- @return string, int The extracted string as a Lua string, and the next character to parse. - function decode_scanString(s,startPos) - assert(startPos, 'decode_scanString(..) called without start position') - local startChar = string.sub(s,startPos,startPos) - -- START SoniEx2 - -- PS: I don't think single quotes are valid JSON - assert(startChar == [["]] or startChar == [[']],'decode_scanString called for a non-string') - --assert(startPos, "String decoding failed: missing closing " .. startChar .. " for string at position " .. oldStart) - local t = {} - local i,j = startPos,startPos - while string.find(s, startChar, j+1) ~= j+1 do - local oldj = j - i,j = string.find(s, "\\.", j+1) - local x,y = string.find(s, startChar, oldj+1) - if not i or x < i then - i,j = x,y-1 - end - table.insert(t, string.sub(s, oldj+1, i-1)) - if string.sub(s, i, j) == "\\u" then - local a = string.sub(s,j+1,j+4) - j = j + 4 - local n = tonumber(a, 16) - assert(n, "String decoding failed: bad Unicode escape " .. a .. " at position " .. i .. " : " .. j) - -- math.floor(x/2^y) == lazy right shift - -- a % 2^b == bitwise_and(a, (2^b)-1) - -- 64 = 2^6 - -- 4096 = 2^12 (or 2^6 * 2^6) - local x - if n < 0x80 then - x = string.char(n % 0x80) - elseif n < 0x800 then - -- [110x xxxx] [10xx xxxx] - x = string.char(0xC0 + (math.floor(n/64) % 0x20), 0x80 + (n % 0x40)) - else - -- [1110 xxxx] [10xx xxxx] [10xx xxxx] - x = string.char(0xE0 + (math.floor(n/4096) % 0x10), 0x80 + (math.floor(n/64) % 0x40), 0x80 + (n % 0x40)) - end - table.insert(t, x) - else - table.insert(t, escapeSequences[string.sub(s, i, j)]) - end - end - table.insert(t,string.sub(j, j+1)) - assert(string.find(s, startChar, j+1), "String decoding failed: missing closing " .. startChar .. " at position " .. j .. "(for string at position " .. startPos .. ")") - return table.concat(t,""), j+2 - -- END SoniEx2 - end - - --- Scans a JSON string skipping all whitespace from the current start position. - -- Returns the position of the first non-whitespace character, or nil if the whole end of string is reached. - -- @param s The string being scanned - -- @param startPos The starting position where we should begin removing whitespace. - -- @return int The first position where non-whitespace was encountered, or string.len(s)+1 if the end of string - -- was reached. - function decode_scanWhitespace(s,startPos) - local whitespace=" \n\r\t" - local stringLen = string.len(s) - while ( string.find(whitespace, string.sub(s,startPos,startPos), 1, true) and startPos <= stringLen) do - startPos = startPos + 1 - end - return startPos - end - - --- Encodes a string to be JSON-compatible. - -- This just involves back-quoting inverted commas, back-quotes and newlines, I think ;-) - -- @param s The string to return as a JSON encoded (i.e. backquoted string) - -- @return The string appropriately escaped. - - local escapeList = { - ['"'] = '\\"', - ['\\'] = '\\\\', - ['/'] = '\\/', - ['\b'] = '\\b', - ['\f'] = '\\f', - ['\n'] = '\\n', - ['\r'] = '\\r', - ['\t'] = '\\t' - } - - function json_private.encodeString(s) - local s = tostring(s) - return s:gsub(".", function(c) return escapeList[c] end) -- SoniEx2: 5.0 compat - end - - -- Determines whether the given Lua type is an array or a table / dictionary. - -- We consider any table an array if it has indexes 1..n for its n items, and no - -- other data in the table. - -- I think this method is currently a little 'flaky', but can't think of a good way around it yet... - -- @param t The table to evaluate as an array - -- @return boolean, number True if the table can be represented as an array, false otherwise. If true, - -- the second returned value is the maximum - -- number of indexed elements in the array. - function isArray(t) - -- Next we count all the elements, ensuring that any non-indexed elements are not-encodable - -- (with the possible exception of 'n') - if (t == json.EMPTY_ARRAY) then return true, 0 end - if (t == json.EMPTY_OBJECT) then return false end - - local maxIndex = 0 - for k,v in pairs(t) do - if (type(k)=='number' and math.floor(k)==k and 1<=k) then -- k,v is an indexed pair - if (not isEncodable(v)) then return false end -- All array elements must be encodable - maxIndex = math.max(maxIndex,k) - else - if (k=='n') then - if v ~= (t.n or #t) then return false end -- False if n does not hold the number of elements - else -- Else of (k=='n') - if isEncodable(v) then return false end - end -- End of (k~='n') - end -- End of k,v not an indexed pair - end -- End of loop across all pairs - return true, maxIndex - end - - --- Determines whether the given Lua object / table / variable can be JSON encoded. The only - -- types that are JSON encodable are: string, boolean, number, nil, table and json.null. - -- In this implementation, all other types are ignored. - -- @param o The object to examine. - -- @return boolean True if the object should be JSON encoded, false if it should be ignored. - function isEncodable(o) - local t = type(o) - return (t=='string' or t=='boolean' or t=='number' or t=='nil' or t=='table') or - (t=='function' and o==json.null) - end - return json -end - --- Sourced from http://lua-users.org/wiki/BaseSixtyFour - --- Lua 5.1+ base64 v3.0 (c) 2009 by Alex Kloss --- licensed under the terms of the LGPL2 - --- character table string -local base64CharTable='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - --- encoding -function this.base64encode(data) - return ((data:gsub('.', function(x) - local r,b='',x:byte() - for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end - return r; - end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) - if (#x < 6) then return '' end - local c=0 - for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end - return base64CharTable:sub(c+1,c+1) - end)..({ '', '==', '=' })[#data%3+1]) -end - --- decoding -function this.base64decode(data) - data = string.gsub(data, '[^'..base64CharTable..'=]', '') - return (data:gsub('.', function(x) - if (x == '=') then return '' end - local r,f='',(base64CharTable:find(x)-1) - for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end - return r; - end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) - if (#x ~= 8) then return '' end - local c=0 - for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end - return string.char(c) - end)) -end -return this; diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 8161ce6..2995222 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -47,14 +47,14 @@ local consoleLogLevel = 2; --打印在控制台(print)的日志等级 local connectTimeoutSec = 0.005; --等待连接超时时间, 单位s. 时间过长等待attach时会造成卡顿,时间过短可能无法连接。建议值0.005 - 0.05 --用户设置项END -local debuggerVer = "2.3.0"; --debugger版本号 +local debuggerVer = "2.8.0"; --debugger版本号 LuaPanda = {}; local this = LuaPanda; -local tools = require("DebugTools"); --引用的开源工具,包括json解析和table展开工具等 +local tools = {}; --引用的开源工具,包括json解析和table展开工具等 this.tools = tools; this.curStackId = 0; --json处理 -local json = tools.createJson() +local json; --hook状态列表 local hookState = { DISCONNECT_HOOK = 0, --断开连接 @@ -2592,5 +2592,588 @@ function this.processWatchedExp(msgTable) return retTab; end + +function tools.getFileSource() + local info = debug.getinfo(1, "S") + for k,v in pairs(info) do + if k == "source" then + return v; + end + end +end + +--序列化并打印table +function tools.printTable(t, name ,indent) + local str = (tools.show(t, name, indent)); + print(str); +end + +--序列化并返回table +function tools.serializeTable(t, name, indent) + local str = (tools.show(t, name, indent)) + return str +end + +--[[ +Author: Julio Manuel Fernandez-Diaz +Date: January 12, 2007 +Modified slightly by RiciLake to avoid the unnecessary table traversal in tablecount() +Formats tables with cycles recursively to any depth. +The output is returned as a string. +References to other tables are shown as values. +Self references are indicated. +The string returned is "Lua code", which can be procesed +(in the case in which indent is composed by spaces or "--"). +Userdata and function keys and values are shown as strings, +which logically are exactly not equivalent to the original code. +This routine can serve for pretty formating tables with +proper indentations, apart from printing them: +print(table.show(t, "t")) -- a typical use +Heavily based on "Saving tables with cycles", PIL2, p. 113. +Arguments: +t is the table. +name is the name of the table (optional) +indent is a first indentation (optional). +--]] +function tools.show(t, name, indent) + local cart -- a container + local autoref -- for self references + + local function isemptytable(t) return next(t) == nil end + + local function basicSerialize (o) + local so = tostring(o) + if type(o) == "function" then + local info = debug.getinfo(o, "S") + -- info.name is nil because o is not a calling level + if info.what == "C" then + return string.format("%q", so .. ", C function") + else + -- the information is defined through lines + return string.format("%q", so .. ", defined in (" .. + info.linedefined .. "-" .. info.lastlinedefined .. + ")" .. info.source) + end + elseif type(o) == "number" or type(o) == "boolean" then + return so + else + return string.format("%q", so) + end + end + + local function addtocart (value, name, indent, saved, field) + indent = indent or "" + saved = saved or {} + field = field or name + + cart = cart .. indent .. field + + if type(value) ~= "table" then + cart = cart .. " = " .. basicSerialize(value) .. ";\n" + else + if saved[value] then + cart = cart .. " = {}; -- " .. saved[value] + .. " (self reference)\n" + autoref = autoref .. name .. " = " .. saved[value] .. ";\n" + else + saved[value] = name + --if tablecount(value) == 0 then + if isemptytable(value) then + cart = cart .. " = {};\n" + else + cart = cart .. " = {\n" + for k, v in pairs(value) do + k = basicSerialize(k) + local fname = string.format("%s[%s]", name, k) + field = string.format("[%s]", k) + -- three spaces between levels + addtocart(v, fname, indent .. " ", saved, field) + end + cart = cart .. indent .. "};\n" + end + end + end + end + + name = name or "PRINT_Table" + if type(t) ~= "table" then + return name .. " = " .. basicSerialize(t) + end + cart, autoref = "", "" + addtocart(t, name, indent) + return cart .. autoref +end + +----------------------------------------------------------------------------- +-- JSON4Lua: JSON encoding / decoding support for the Lua language. +-- json Module. +-- Author: Craig Mason-Jones +-- Homepage: http://github.com/craigmj/json4lua/ +-- Version: 1.0.0 +-- This module is released under the MIT License (MIT). +-- Please see LICENCE.txt for details. +-- +-- USAGE: +-- This module exposes two functions: +-- json.encode(o) +-- Returns the table / string / boolean / number / nil / json.null value as a JSON-encoded string. +-- json.decode(json_string) +-- Returns a Lua object populated with the data encoded in the JSON string json_string. +-- +-- REQUIREMENTS: +-- compat-5.1 if using Lua 5.0 +-- +-- CHANGELOG +-- 0.9.20 Introduction of local Lua functions for private functions (removed _ function prefix). +-- Fixed Lua 5.1 compatibility issues. +-- Introduced json.null to have null values in associative arrays. +-- json.encode() performance improvement (more than 50%) through table.concat rather than .. +-- Introduced decode ability to ignore /**/ comments in the JSON string. +-- 0.9.10 Fix to array encoding / decoding to correctly manage nil/null values in arrays. +----------------------------------------------------------------------------- + +function tools.createJson() + ----------------------------------------------------------------------------- + -- Imports and dependencies + ----------------------------------------------------------------------------- + local math = require('math') + local string = require("string") + local table = require("table") + + ----------------------------------------------------------------------------- + -- Module declaration + ----------------------------------------------------------------------------- + local json = {} -- Public namespace + local json_private = {} -- Private namespace + + -- Public constants + json.EMPTY_ARRAY={} + json.EMPTY_OBJECT={} + + -- Public functions + + -- Private functions + local decode_scanArray + local decode_scanComment + local decode_scanConstant + local decode_scanNumber + local decode_scanObject + local decode_scanString + local decode_scanWhitespace + local encodeString + local isArray + local isEncodable + + ----------------------------------------------------------------------------- + -- PUBLIC FUNCTIONS + ----------------------------------------------------------------------------- + --- Encodes an arbitrary Lua object / variable. + -- @param v The Lua object / variable to be JSON encoded. + -- @return String containing the JSON encoding in internal Lua string format (i.e. not unicode) + function json.encode (v) + -- Handle nil values + if v==nil then + return "null" + end + + local vtype = type(v) + + -- Handle strings + if vtype=='string' then + return '"' .. json_private.encodeString(v) .. '"' -- Need to handle encoding in string + end + + -- Handle booleans + if vtype=='number' or vtype=='boolean' then + return tostring(v) + end + + -- Handle tables + if vtype=='table' then + local rval = {} + -- Consider arrays separately + local bArray, maxCount = isArray(v) + if bArray then + for i = 1,maxCount do + table.insert(rval, json.encode(v[i])) + end + else -- An object, not an array + for i,j in pairs(v) do + if isEncodable(i) and isEncodable(j) then + table.insert(rval, '"' .. json_private.encodeString(i) .. '":' .. json.encode(j)) + end + end + end + if bArray then + return '[' .. table.concat(rval,',') ..']' + else + return '{' .. table.concat(rval,',') .. '}' + end + end + + -- Handle null values + if vtype=='function' and v==json.null then + return 'null' + end + + assert(false,'encode attempt to encode unsupported type ' .. vtype .. ':' .. tostring(v)) + end + + + --- Decodes a JSON string and returns the decoded value as a Lua data structure / value. + -- @param s The string to scan. + -- @param [startPos] Optional starting position where the JSON string is located. Defaults to 1. + -- @param Lua object, number The object that was scanned, as a Lua table / string / number / boolean or nil, + -- and the position of the first character after + -- the scanned JSON object. + function json.decode(s, startPos) + startPos = startPos and startPos or 1 + startPos = decode_scanWhitespace(s,startPos) + assert(startPos<=string.len(s), 'Unterminated JSON encoded object found at position in [' .. s .. ']') + local curChar = string.sub(s,startPos,startPos) + -- Object + if curChar=='{' then + return decode_scanObject(s,startPos) + end + -- Array + if curChar=='[' then + return decode_scanArray(s,startPos) + end + -- Number + if string.find("+-0123456789.e", curChar, 1, true) then + return decode_scanNumber(s,startPos) + end + -- String + if curChar==[["]] or curChar==[[']] then + return decode_scanString(s,startPos) + end + if string.sub(s,startPos,startPos+1)=='/*' then + return json.decode(s, decode_scanComment(s,startPos)) + end + -- Otherwise, it must be a constant + return decode_scanConstant(s,startPos) + end + + --- The null function allows one to specify a null value in an associative array (which is otherwise + -- discarded if you set the value with 'nil' in Lua. Simply set t = { first=json.null } + function json.null() + return json.null -- so json.null() will also return null ;-) + end + ----------------------------------------------------------------------------- + -- Internal, PRIVATE functions. + -- Following a Python-like convention, I have prefixed all these 'PRIVATE' + -- functions with an underscore. + ----------------------------------------------------------------------------- + + --- Scans an array from JSON into a Lua object + -- startPos begins at the start of the array. + -- Returns the array and the next starting position + -- @param s The string being scanned. + -- @param startPos The starting position for the scan. + -- @return table, int The scanned array as a table, and the position of the next character to scan. + function decode_scanArray(s,startPos) + local array = {} -- The return value + local stringLen = string.len(s) + assert(string.sub(s,startPos,startPos)=='[','decode_scanArray called but array does not start at position ' .. startPos .. ' in string:\n'..s ) + startPos = startPos + 1 + -- Infinite loop for array elements + local index = 1 + repeat + startPos = decode_scanWhitespace(s,startPos) + assert(startPos<=stringLen,'JSON String ended unexpectedly scanning array.') + local curChar = string.sub(s,startPos,startPos) + if (curChar==']') then + return array, startPos+1 + end + if (curChar==',') then + startPos = decode_scanWhitespace(s,startPos+1) + end + assert(startPos<=stringLen, 'JSON String ended unexpectedly scanning array.') + local object + object, startPos = json.decode(s,startPos) + array[index] = object + index = index + 1 + until false + end + + --- Scans a comment and discards the comment. + -- Returns the position of the next character following the comment. + -- @param string s The JSON string to scan. + -- @param int startPos The starting position of the comment + function decode_scanComment(s, startPos) + assert( string.sub(s,startPos,startPos+1)=='/*', "decode_scanComment called but comment does not start at position " .. startPos) + local endPos = string.find(s,'*/',startPos+2) + assert(endPos~=nil, "Unterminated comment in string at " .. startPos) + return endPos+2 + end + + --- Scans for given constants: true, false or null + -- Returns the appropriate Lua type, and the position of the next character to read. + -- @param s The string being scanned. + -- @param startPos The position in the string at which to start scanning. + -- @return object, int The object (true, false or nil) and the position at which the next character should be + -- scanned. + function decode_scanConstant(s, startPos) + local consts = { ["true"] = true, ["false"] = false, ["null"] = nil } + local constNames = {"true","false","null"} + + for i,k in pairs(constNames) do + if string.sub(s,startPos, startPos + string.len(k) -1 )==k then + return consts[k], startPos + string.len(k) + end + end + assert(nil, 'Failed to scan constant from string ' .. s .. ' at starting position ' .. startPos) + end + + --- Scans a number from the JSON encoded string. + -- (in fact, also is able to scan numeric +- eqns, which is not + -- in the JSON spec.) + -- Returns the number, and the position of the next character + -- after the number. + -- @param s The string being scanned. + -- @param startPos The position at which to start scanning. + -- @return number, int The extracted number and the position of the next character to scan. + function decode_scanNumber(s,startPos) + local endPos = startPos+1 + local stringLen = string.len(s) + local acceptableChars = "+-0123456789.e" + while (string.find(acceptableChars, string.sub(s,endPos,endPos), 1, true) + and endPos<=stringLen + ) do + endPos = endPos + 1 + end + -- local stringValue = 'return ' .. string.sub(s, startPos, endPos - 1) + -- local stringEval = loadstring(stringValue) + -- assert(stringEval, 'Failed to scan number [ ' .. stringValue .. '] in JSON string at position ' .. startPos .. ' : ' .. endPos) + local numberValue = string.sub(s, startPos, endPos - 1) + return numberValue, endPos + end + + --- Scans a JSON object into a Lua object. + -- startPos begins at the start of the object. + -- Returns the object and the next starting position. + -- @param s The string being scanned. + -- @param startPos The starting position of the scan. + -- @return table, int The scanned object as a table and the position of the next character to scan. + function decode_scanObject(s,startPos) + local object = {} + local stringLen = string.len(s) + local key, value + assert(string.sub(s,startPos,startPos)=='{','decode_scanObject called but object does not start at position ' .. startPos .. ' in string:\n' .. s) + startPos = startPos + 1 + repeat + startPos = decode_scanWhitespace(s,startPos) + assert(startPos<=stringLen, 'JSON string ended unexpectedly while scanning object.') + local curChar = string.sub(s,startPos,startPos) + if (curChar=='}') then + return object,startPos+1 + end + if (curChar==',') then + startPos = decode_scanWhitespace(s,startPos+1) + end + assert(startPos<=stringLen, 'JSON string ended unexpectedly scanning object.') + -- Scan the key + key, startPos = json.decode(s,startPos) + assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) + startPos = decode_scanWhitespace(s,startPos) + assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) + assert(string.sub(s,startPos,startPos)==':','JSON object key-value assignment mal-formed at ' .. startPos) + startPos = decode_scanWhitespace(s,startPos+1) + assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) + value, startPos = json.decode(s,startPos) + object[key]=value + until false -- infinite loop while key-value pairs are found + end + + -- START SoniEx2 + -- Initialize some things used by decode_scanString + -- You know, for efficiency + local escapeSequences = { + ["\\t"] = "\t", + ["\\f"] = "\f", + ["\\r"] = "\r", + ["\\n"] = "\n", + ["\\b"] = "\b" + } + setmetatable(escapeSequences, {__index = function(t,k) + -- skip "\" aka strip escape + return string.sub(k,2) + end}) + -- END SoniEx2 + + --- Scans a JSON string from the opening inverted comma or single quote to the + -- end of the string. + -- Returns the string extracted as a Lua string, + -- and the position of the next non-string character + -- (after the closing inverted comma or single quote). + -- @param s The string being scanned. + -- @param startPos The starting position of the scan. + -- @return string, int The extracted string as a Lua string, and the next character to parse. + function decode_scanString(s,startPos) + assert(startPos, 'decode_scanString(..) called without start position') + local startChar = string.sub(s,startPos,startPos) + -- START SoniEx2 + -- PS: I don't think single quotes are valid JSON + assert(startChar == [["]] or startChar == [[']],'decode_scanString called for a non-string') + --assert(startPos, "String decoding failed: missing closing " .. startChar .. " for string at position " .. oldStart) + local t = {} + local i,j = startPos,startPos + while string.find(s, startChar, j+1) ~= j+1 do + local oldj = j + i,j = string.find(s, "\\.", j+1) + local x,y = string.find(s, startChar, oldj+1) + if not i or x < i then + i,j = x,y-1 + end + table.insert(t, string.sub(s, oldj+1, i-1)) + if string.sub(s, i, j) == "\\u" then + local a = string.sub(s,j+1,j+4) + j = j + 4 + local n = tonumber(a, 16) + assert(n, "String decoding failed: bad Unicode escape " .. a .. " at position " .. i .. " : " .. j) + -- math.floor(x/2^y) == lazy right shift + -- a % 2^b == bitwise_and(a, (2^b)-1) + -- 64 = 2^6 + -- 4096 = 2^12 (or 2^6 * 2^6) + local x + if n < 0x80 then + x = string.char(n % 0x80) + elseif n < 0x800 then + -- [110x xxxx] [10xx xxxx] + x = string.char(0xC0 + (math.floor(n/64) % 0x20), 0x80 + (n % 0x40)) + else + -- [1110 xxxx] [10xx xxxx] [10xx xxxx] + x = string.char(0xE0 + (math.floor(n/4096) % 0x10), 0x80 + (math.floor(n/64) % 0x40), 0x80 + (n % 0x40)) + end + table.insert(t, x) + else + table.insert(t, escapeSequences[string.sub(s, i, j)]) + end + end + table.insert(t,string.sub(j, j+1)) + assert(string.find(s, startChar, j+1), "String decoding failed: missing closing " .. startChar .. " at position " .. j .. "(for string at position " .. startPos .. ")") + return table.concat(t,""), j+2 + -- END SoniEx2 + end + + --- Scans a JSON string skipping all whitespace from the current start position. + -- Returns the position of the first non-whitespace character, or nil if the whole end of string is reached. + -- @param s The string being scanned + -- @param startPos The starting position where we should begin removing whitespace. + -- @return int The first position where non-whitespace was encountered, or string.len(s)+1 if the end of string + -- was reached. + function decode_scanWhitespace(s,startPos) + local whitespace=" \n\r\t" + local stringLen = string.len(s) + while ( string.find(whitespace, string.sub(s,startPos,startPos), 1, true) and startPos <= stringLen) do + startPos = startPos + 1 + end + return startPos + end + + --- Encodes a string to be JSON-compatible. + -- This just involves back-quoting inverted commas, back-quotes and newlines, I think ;-) + -- @param s The string to return as a JSON encoded (i.e. backquoted string) + -- @return The string appropriately escaped. + + local escapeList = { + ['"'] = '\\"', + ['\\'] = '\\\\', + ['/'] = '\\/', + ['\b'] = '\\b', + ['\f'] = '\\f', + ['\n'] = '\\n', + ['\r'] = '\\r', + ['\t'] = '\\t' + } + + function json_private.encodeString(s) + local s = tostring(s) + return s:gsub(".", function(c) return escapeList[c] end) -- SoniEx2: 5.0 compat + end + + -- Determines whether the given Lua type is an array or a table / dictionary. + -- We consider any table an array if it has indexes 1..n for its n items, and no + -- other data in the table. + -- I think this method is currently a little 'flaky', but can't think of a good way around it yet... + -- @param t The table to evaluate as an array + -- @return boolean, number True if the table can be represented as an array, false otherwise. If true, + -- the second returned value is the maximum + -- number of indexed elements in the array. + function isArray(t) + -- Next we count all the elements, ensuring that any non-indexed elements are not-encodable + -- (with the possible exception of 'n') + if (t == json.EMPTY_ARRAY) then return true, 0 end + if (t == json.EMPTY_OBJECT) then return false end + + local maxIndex = 0 + for k,v in pairs(t) do + if (type(k)=='number' and math.floor(k)==k and 1<=k) then -- k,v is an indexed pair + if (not isEncodable(v)) then return false end -- All array elements must be encodable + maxIndex = math.max(maxIndex,k) + else + if (k=='n') then + if v ~= (t.n or #t) then return false end -- False if n does not hold the number of elements + else -- Else of (k=='n') + if isEncodable(v) then return false end + end -- End of (k~='n') + end -- End of k,v not an indexed pair + end -- End of loop across all pairs + return true, maxIndex + end + + --- Determines whether the given Lua object / table / variable can be JSON encoded. The only + -- types that are JSON encodable are: string, boolean, number, nil, table and json.null. + -- In this implementation, all other types are ignored. + -- @param o The object to examine. + -- @return boolean True if the object should be JSON encoded, false if it should be ignored. + function isEncodable(o) + local t = type(o) + return (t=='string' or t=='boolean' or t=='number' or t=='nil' or t=='table') or + (t=='function' and o==json.null) + end + return json +end + +-- Sourced from http://lua-users.org/wiki/BaseSixtyFour + +-- Lua 5.1+ base64 v3.0 (c) 2009 by Alex Kloss +-- licensed under the terms of the LGPL2 + +-- character table string +local base64CharTable='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + +-- encoding +function tools.base64encode(data) + return ((data:gsub('.', function(x) + local r,b='',x:byte() + for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end + return r; + end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) + if (#x < 6) then return '' end + local c=0 + for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end + return base64CharTable:sub(c+1,c+1) + end)..({ '', '==', '=' })[#data%3+1]) +end + +-- decoding +function tools.base64decode(data) + data = string.gsub(data, '[^'..base64CharTable..'=]', '') + return (data:gsub('.', function(x) + if (x == '=') then return '' end + local r,f='',(base64CharTable:find(x)-1) + for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end + return r; + end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) + if (#x ~= 8) then return '' end + local c=0 + for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end + return string.char(c) + end)) +end + +-- tools变量 +json = tools.createJson(); --json处理 this.printToConsole("load LuaPanda success", 1); return this; From c637985d256a14d9ec0fc135193470e1f09af2d6 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 29 Oct 2019 16:07:46 +0800 Subject: [PATCH 107/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + res/others/launch.json | 2 +- res/web/settings.html | 47 ++++++++++++++---------------------------- 3 files changed, 18 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index a53ee67..e6f6b8d 100755 --- a/package.json +++ b/package.json @@ -276,6 +276,7 @@ "cwd": "${workspaceFolder}", "luaFileExtension": "", "connectionPort": 8818, + "pathCaseSensitivity": true, "stopOnEntry": true, "useCHook": true, "autoPathMode": true, diff --git a/res/others/launch.json b/res/others/launch.json index 1320e9e..fab00b5 100644 --- a/res/others/launch.json +++ b/res/others/launch.json @@ -12,7 +12,7 @@ "stopOnEntry": true, "useCHook": true, "autoPathMode": false, - "logLevel": 1, + "logLevel": 1 }, { "type": "lua", diff --git a/res/web/settings.html b/res/web/settings.html index 5f4a36f..394f567 100644 --- a/res/web/settings.html +++ b/res/web/settings.html @@ -15,26 +15,26 @@

LuaPanda Settings

luaFileExtension
- connectionPort:
cwd:
+ connectionPort:
- pathCaseSensitivity: + stopOnEntry:
- -

- stopOnEntry: + autoPathMode:
- -

+
useCHook:
@@ -45,17 +45,16 @@

LuaPanda Settings


- autoPathMode: + pathCaseSensitivity:
- -
+
-
- +
+ .onoffswitch { + position: relative; + width: 40px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + } + + .onoffswitch-checkbox { + display: none; + } + + .onoffswitch-label { + display: block; + overflow: hidden; + cursor: pointer; + border: 2px solid #999999; + border-radius: 20px; + } + + .onoffswitch-inner { + display: block; + width: 200%; + margin-left: -100%; + transition: margin 0.3s ease-in 0s; + } + + .onoffswitch-inner:before, + .onoffswitch-inner:after { + display: block; + float: left; + width: 50%; + height: 5px; + padding: 0; + line-height: 5px; + font-size: 14px; + color: white; + font-family: Trebuchet, Arial, sans-serif; + font-weight: bold; + box-sizing: border-box; + } + + .onoffswitch-inner:before { + content: ""; + padding-left: 10px; + background-color: rgb(73, 128, 247); + color: #FFFFFF; + } + + .onoffswitch-inner:after { + content: ""; + padding-right: 10px; + background-color: #EEEEEE; + color: #999999; + text-align: right; + } + + .onoffswitch-switch { + display: block; + width: 15px; + margin: -5px; + background: rgb(73, 128, 247); + position: absolute; + top: 0; + bottom: 0; + right: 31px; + border: 2px solid #999999; + border-radius: 20px; + transition: all 0.3s ease-in 0s; + } + + .onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner { + margin-left: 0; + } + + .onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch { + right: 0px; + } + + div { + display: inline-block; + } + + .lab { + display: inline-block; + width: 30%; + text-align: right; + } + + .btn_st { + border: none; + background: rgb(52, 93, 206); + color: #ffffff !important; + font-weight: 100; + padding: 10px; + text-transform: uppercase; + border-radius: 6px; + display: inline-block; + transition: all 0.1s ease 0s; + } + + .btn_st:hover { + color: #ffffff !important; + font-weight: 700 !important; + cursor: pointer; + letter-spacing: 1px; + background: rgb(74, 118, 240); + -webkit-box-shadow: 0px 5px 40px -10px rgba(255, 255, 255, 0.57); + -moz-box-shadow: 0px 5px 40px -10px rgba(255, 255, 255, 0.57); + transition: all 0.0s ease 0s; + } + \ No newline at end of file From 8aa7f8ee43c36daf1e660e30980eacc1c6fe8fe8 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Mon, 4 Nov 2019 18:42:44 +0800 Subject: [PATCH 127/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86package?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index f1ee06c..dd0b22d 100755 --- a/package.json +++ b/package.json @@ -271,6 +271,7 @@ "initialConfigurations": [ { "type": "lua", + "request": "launch", "name": "LuaPanda", "program": "", "cwd": "${workspaceFolder}", @@ -284,6 +285,7 @@ }, { "type": "lua", + "request": "launch", "name": "LuaPanda-DebugFile", "luaPath": "", "packagePath": [], From cecfac6d6af7f5fe05b368068fd8039910849dc6 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Mon, 4 Nov 2019 18:57:01 +0800 Subject: [PATCH 128/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/Development-instructions/project-description.md | 3 +-- Docs/Manual/access-guidelines.md | 2 +- Docs/Manual/quick-use.md | 8 ++++---- Docs/Manual/update.md | 2 +- readme.md | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Docs/Development-instructions/project-description.md b/Docs/Development-instructions/project-description.md index 40ffc52..d302e45 100644 --- a/Docs/Development-instructions/project-description.md +++ b/Docs/Development-instructions/project-description.md @@ -35,8 +35,7 @@ │   ├── debugger_lib │   │ ├── libpdebug.h/cpp C调试库源码 │   │ └── plugins 打包好的调试库文件 -│   ├── LuaPanda.lua Debugger源码 -│   └── DebugTools.lua Debugger工具文件 +│   └── LuaPanda.lua Debugger源码 ├── Docs 项目文档 ├── LICENSE.txt 证书 ├── package.json 工程配置文件 diff --git a/Docs/Manual/access-guidelines.md b/Docs/Manual/access-guidelines.md index 5e60934..62035f0 100644 --- a/Docs/Manual/access-guidelines.md +++ b/Docs/Manual/access-guidelines.md @@ -71,7 +71,7 @@ launch.json文件中配置项 `"autoPathMode": true/false` 可以设置是否使 ### 第二步 放入debugger 文件,并引用 -文件:`LuaPanda.lua`, `DebugTools.lua` +文件:`LuaPanda.lua` 下载位置:github 的 `Debugger` 目录下 diff --git a/Docs/Manual/quick-use.md b/Docs/Manual/quick-use.md index c46252b..d30e2f1 100644 --- a/Docs/Manual/quick-use.md +++ b/Docs/Manual/quick-use.md @@ -28,7 +28,7 @@ 1. **下载 slua 工程** 下载 slua 工程源码 https://github.com/pangweiwei/slua 2. **slua 工程设置** 使用 Unity 打开 slua 工程,切换工程平台到 Android/iOS , 点击菜单 Slua -> All -> Make,选择 `Slua/Editor/example/Circle` 场景。 -3. **放入调试文件** 把github中 /Debugger 下的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到slua工程 `Slua/Resources/` 目录下, 并修改文件后缀为 `.txt` +3. **放入调试文件** 把github中 /Debugger 下的 `LuaPanda.lua` 文件拷贝到slua工程 `Slua/Resources/` 目录下, 并修改文件后缀为 `.txt` 4. **配置工程** VSCode 打开 `Slua/Resources/` 目录,点击 VSCode 调试选项卡下的齿轮图标,选择 LuaPanda。把配置项 luaFileExtension 值修改为 "txt"。 5. **开始调试** 在 `Slua/Resources/circle/circle.txt` 中加入代码 `require("LuaPanda").start("127.0.0.1",8818)`. VSCode切换到调试选项卡,配置项选择`LuaPanda`,点击 VSCode 调试的绿色箭头,再运行Unity,在加入 require 的位置后会自动停止。也可以打断点调试 @@ -37,7 +37,7 @@ ### xlua 1. **下载 xlua 工程** https://github.com/Tencent/xLua -2. **放入调试文件** 把github中 /Debugger 下的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到xlua工程 `\XLua\Examples\07_AsyncTest\Resources` 目录下, 并修改后缀为 `.lua.txt` +2. **放入调试文件** 把github中 /Debugger 下的 `LuaPanda.lua` 文件拷贝到xlua工程 `\XLua\Examples\07_AsyncTest\Resources` 目录下, 并修改后缀为 `.lua.txt` 3. **配置工程** 把`\XLua\Examples\07_AsyncTest\Resources` 文件夹放入 VSCode , 点击 VSCode 调试选项卡下的齿轮图标,选择 LuaPanda。把配置项 luaFileExtension 值修改为 "lua.txt" 4. **开始调试** 在`\XLua\Examples\07_AsyncTest\Resources\async_test.lua.txt` 中加入`require("LuaPanda").start("127.0.0.1",8818)` 。VSCode切换到调试选项卡,配置项选择`LuaPanda`, 点击 VSCode 的开始调试箭头,运行Unity,在加入 require 的位置后会自动停止。也可以打断点调试。 @@ -46,7 +46,7 @@ ### slua-unreal 1. **下载slua-unreal工程** https://github.com/Tencent/sluaunreal -2. **放入调试文件** 把github中 /Debugger 下的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到slua-unreal 工程`sluaunreal/Content/Lua/`目录下 +2. **放入调试文件** 把github中 /Debugger 下的 `LuaPanda.lua` 文件拷贝到slua-unreal 工程`sluaunreal/Content/Lua/`目录下 3. **配置工程** 把`sluaunreal/Content`文件夹放入 VSCode , 点击 VSCode 调试选项卡下的齿轮图标,选择 LuaPanda。 4. **开始调试** 在执行的lua代码中加入`require("LuaPanda").start("127.0.0.1",8818)` 。VSCode切换到调试选项卡,配置项选择`LuaPanda`, 点击 VSCode 的开始调试箭头,再运行ue4,在加入 require 的位置后会自动停止。之后可以打断点调试。 @@ -58,7 +58,7 @@ 1. 下载cocos2dx并创建新工程 -2. **放入调试器文件** 把github中 /Debugger 下的 `LuaPanda.lua, DebugTools.lua` 两个文件拷贝到cocos2dx工程 /src下,和main.lua 文件同级 +2. **放入调试器文件** 把github中 /Debugger 下的 `LuaPanda.lua` 文件拷贝到cocos2dx工程 /src下,和main.lua 文件同级 3. **配置工程** 把`src`文件夹拖入 VSCode , 点击 VSCode 调试选项卡下的齿轮图标,选择 LuaPanda。 4. **开始调试** 在main.lua文件 `require "cocos.init"` 行之前加入代码 `require("LuaPanda").start("127.0.0.1",8818)` 。VSCode切换到调试选项卡,配置项选择`LuaPanda`, 点击 VSCode 的开始调试箭头,再运行cocos2dx工程,在加入 require 的位置后会自动停止。之后可以打断点调试。 \ No newline at end of file diff --git a/Docs/Manual/update.md b/Docs/Manual/update.md index 646e99d..f10e15b 100644 --- a/Docs/Manual/update.md +++ b/Docs/Manual/update.md @@ -8,7 +8,7 @@ + lua文件。 下载地址:https://github.com/Tencent/LuaPanda/releases - LuaPanda.lua,DebugTools.lua + LuaPanda.lua 需要用户手动下载最新的文件,替换工程中原有文件。 diff --git a/readme.md b/readme.md index 73fd942..5960738 100644 --- a/readme.md +++ b/readme.md @@ -73,7 +73,7 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` 另外调试器目前支持标准lua虚拟机,cocos2dx集成的是luajit,可能会在单步时出现跳步的情况,后续完整支持luajit会解决此问题。 - 如希望体验新功能,请按照 [升级说明](./Docs/Manual/update.md) 手动替换工程中的 `LuaPanda.lua,DebugTools.lua` 文件。 + 如希望体验新功能,请按照 [升级说明](./Docs/Manual/update.md) 手动替换工程中的 `LuaPanda.lua` 文件。 From fa6c0848eb592935b2501e6a80492d434d770138 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Mon, 4 Nov 2019 19:11:26 +0800 Subject: [PATCH 129/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/Manual/quick-use.md | 4 ++++ Docs/Manual/update.md | 3 ++- readme.md | 42 ++++++++++++++-------------------------- 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/Docs/Manual/quick-use.md b/Docs/Manual/quick-use.md index d30e2f1..6151848 100644 --- a/Docs/Manual/quick-use.md +++ b/Docs/Manual/quick-use.md @@ -1,5 +1,9 @@ # 调试器快速试用 +代码辅助工具无需配置,使用VSCode打开含有 lua 的文件夹即可。下面的内容是调试器功能的快速试用。 + + + 注:VSCode的调试插件机制是: 当使用某个插件调试过一种语言时,会导致该语言的其他调试插件无法生效,请先禁用之前的调试插件并重新启动VSCode。 以下是各框架下快速试用调试器的方法,开始之前请先到 VSCode 扩展商店下载安装 `LuaPanda` 调试插件。 diff --git a/Docs/Manual/update.md b/Docs/Manual/update.md index f10e15b..c635bec 100644 --- a/Docs/Manual/update.md +++ b/Docs/Manual/update.md @@ -18,4 +18,5 @@ -通常用户只要手动更新lua文件即可。 \ No newline at end of file +通常用户只要手动更新lua文件即可。 + diff --git a/readme.md b/readme.md index 5960738..e9276e9 100644 --- a/readme.md +++ b/readme.md @@ -14,6 +14,18 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` +# 接入和开发指引 + +接入和使用文档 + +[项目介绍](./Docs/Manual/feature-introduction.md) | [快速试用指引](./Docs/Manual/quick-use.md) | [调试器接入指引](./Docs/Manual/access-guidelines.md) | [真机调试](./Docs/Manual/debug-on-phone.md) | [单文件调试和运行](./Docs/Manual/debug-file.md) | [升级说明](./Docs/Manual/update.md) | [FAQ](./Docs/Manual/FAQ.md) + +调试器开发文档 + +[工程说明](./Docs/Development-instructions/project-description.md) | [调试器开发指引](./Docs/Development-instructions/how_to_join.md) | [特性简述](./Docs/Development-instructions/debugger-principle.md) + + + # Tips + 版本说明和升级建议 @@ -24,8 +36,7 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` - 另外加入了配置页面,点击状态栏的LuaPanda图标即可打开。其中提供了一些常用配置方便用户修改。 -配置页面打开时读取launch.json中的对应数据,并在配置完成后把数据写回launch.json, 如果不想使用配置页面,直接修改launch.json中的项目可以达到同样的效果。 + 另外加入了配置页面,点击状态栏的LuaPanda图标即可打开。其中提供了一些常用配置方便用户修改。配置页面打开时读取launch.json中的对应数据,并在配置完成后把数据写回launch.json, 如果不想使用配置页面,直接修改launch.json中的项目可以达到同样的效果。 @@ -72,19 +83,8 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` 之前的版本在cocos2dx中运行时会报查找 c 库错误。2.3.0 修复了此问题,测试 cocos2dx 在 win/mac 下都可以使用c库。 另外调试器目前支持标准lua虚拟机,cocos2dx集成的是luajit,可能会在单步时出现跳步的情况,后续完整支持luajit会解决此问题。 - - 如希望体验新功能,请按照 [升级说明](./Docs/Manual/update.md) 手动替换工程中的 `LuaPanda.lua` 文件。 - - - -+ v2.2.1 - - 小幅更新,优化了单文件调试和调试控制台的使用。 - - - 修复单文件调试 文件路径中的 \ 被当做转义符的问题。 - - 修复单文件调试 首次运行窗口报错的问题。 - - 优化调试控制台的使用,动态执行表达式不必再加p 。 - + + @@ -102,18 +102,6 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` -# 接入和开发指引 - -接入和使用文档 - -[项目介绍](./Docs/Manual/feature-introduction.md) | [快速试用指引](./Docs/Manual/quick-use.md) | [接入指引](./Docs/Manual/access-guidelines.md) | [真机调试](./Docs/Manual/debug-on-phone.md) | [单文件调试和运行](./Docs/Manual/debug-file.md) | [升级说明](./Docs/Manual/update.md) | [FAQ](./Docs/Manual/FAQ.md) - -调试器开发文档 - -[工程说明](./Docs/Development-instructions/project-description.md) | [调试器开发指引](./Docs/Development-instructions/how_to_join.md) | [特性简述](./Docs/Development-instructions/debugger-principle.md) - - - # 依赖和适用性 调试器功能依赖 LuaSocket , 可运行于 slua,slua-unreal ,xlua 等已集成 LuaSocket 的 lua 环境,也可以在 console 中调试。lua 版本支持 5.1- 5.3。 From 5ab0167158389aafac0ced1f8b3bfbdac3d5d4dd Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Mon, 4 Nov 2019 21:25:51 +0800 Subject: [PATCH 130/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=92=8C=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- readme.md | 5 ++++- res/web/settings.html | 8 ++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index dd0b22d..d914244 100755 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ }, "main": "./out/extension", "activationEvents": [ - "onLanguage:lua" + "onLanguage:lua", "onDebug" ], "contributes": { "breakpoints": [ diff --git a/readme.md b/readme.md index e9276e9..3bc6a99 100644 --- a/readme.md +++ b/readme.md @@ -68,7 +68,10 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` 采用了配置界面,方便用户可视化配置常用选项。原理是把用户的配置结果写回到 launch.json,和直接修改 launch.json 中的配置效果一致。 - + + 合并了 `LuaPanda.lua` 和 `DebugTools.lua` 。 为了方便文件拷贝和升级,合并了这两个文件,内容全部放入 `LuaPanda.lua`,DebugTools.lua 不再使用。 + + + + v2.3.0 diff --git a/res/web/settings.html b/res/web/settings.html index 238a4e7..bb6e532 100644 --- a/res/web/settings.html +++ b/res/web/settings.html @@ -17,7 +17,7 @@

LuaPanda Settings

   
-    cwd:    
   
@@ -31,7 +31,7 @@

LuaPanda Settings


- +

- +

- +

nmzl=|+ygr@KNK7_8W zs(*o!*%1fXUsa7N8*pc8B0Vu`KROwIej@8n3ow+K9r6;E>9bO>#>%z}FFs`KI`aRS z07GkGB0;hR&ue-6JmcQyfEHwRe_eT0bKJ zH-RR^-Lfq!?d9^5p{_U)2)AUjM6C0C+<=X{ZCggdTQu#SvHEq8B*72WBnek*=>4X&;@9?K1X8`NKekn| z|F)Fp;=P?|7bk!ceAP-kNIpY_CV8}0PY({nlYUqM^xF}WfXuLP;zvaI5}NFtB6!^w z%=<^CwR$nP#qvKV;EZx-hNFI9lU`LwjsXPmbqOjNRQt{dQYGkC$z52>XFV)RU*x zT#dKR+<5B@L!z8Q7?KD)C0vWnLULt#sf? zU{^$DT*muk|2ChEvHS^A=U+HL@|u4iI^2B#rDQJ*;b`5k=lz7fO*4E;m%fdoZ$m&{ z9f7-9|70wN!)=ZC4c}6D*m5~sn|=i*sigohSNnc<4@VxM2f=B9>?;z8Yev1wk+7!k zoq9mr2wmNSR71%~zdFp{6B;+$IWy0wenmcegr15#rs7s}3--pyu|vIQ%J+3X(2vQO zw`F~!`0R4~_Lkwy{n{Ml*Ozgte+DoX4_=)li)2~@j%u&Us=X>AD=y%&M;w=>B+LyisAgGcL8l4RjEK5lh9JhKDz>QeUl{u=u#n^Oplb2MB&+m}0?a8v$w^;6PgC!+C1+-fcvs!|b;-&3*7akUc<|A04bw#%JucK_3W4c;-2+02q?rg_KwR-17aKzDsf9L;@tqo9#qKJM^P%yjq3#WFIoaG5l>g|6z2e&td^}&^P=~=yhw1 z@lJAYo9x7^!r)8g8Am>hX>m^`R=1ud=K*br-X66VzP73@wzA*;1n9~ML0hW#M5)`o zqUWj?n|&8NjWSoqm1+c3Jrl=M>HjFh|Kao>tVKkv^PN@Sj#)au`82PAq5?}MB9Wzt1ht zJ=orE&R=DFIMvTBaj^4GyA-!Xwt%e_I9^k=4!r4BwMBblSFIc*yr1rmm0T1f%J=$; zF@&O_@82Eh=XfV*hdAvY%{G>dv%i=Lx|PK{8#G5ohS5~s9R_PweH&TPFC8q12hhKO z#@j%8|1&4|U)46=+X7DT%%piO@&5=uH|wunp?Ss3ZM-iup#4P*vlFiUNT9psD{WhS z$6?zUtZg|wG_T`>8ZTw6`D_C2z2l-Q291O1sEMj*KY$C`=rh3%P9cPiFe>hB0OOyjf;l0GHr-nXACj0rr#;;mAKzL3BrP53DT1X(RRJ(tR=t(`q$HvRy+5=6{ORxTmDlNPj zG`mV2ny6#XdPxL5B%^K`PC^EQ2{5=AVj6~c)jrW5aj1@|zHlxl=lD7C8;>74s|(TY zFC2_t0)GARi^mTWnXBu3tB+%YmBe{mo$-OCx$wxh?F{TQ&qI;_H`4|isg$&h@wBlK zHn>1XPq7aB+4as^Pdw%mt4SJ95~Rnia#cnSt2Q>xRQ9JYY1TCdT@LQ7nC~J$@&p{HSZ4jwbz(5iV$F zteujUJ}h1_BLxeZZ=Q!*&TDHjsbLq>W`S}qD3@Go43^~DN*`z z8{Z{(aZMw>sBn_tx_V&seDu2W(d*84;x`^Y^t$uW>&_pHUjlw;dGpca=Cjvr^nJVz zQLw+xGy|Ch%>@i*4UF$#fU-v}gu<67jjwLfFS2D-mu|wZ-dXKx0EebVc9MLHjgj^B zm;Ph?!&_{s_e`fwZ3Z|uEQp;}yV&T(2J-+Id$vLBhcF=MS~(D$-4nxPZ?PUI79O)Y&9 zRkA9o&m4BypiQLE<;dp&#l@bhSLlpoQ_>mB=Hwqz*s74RY^cs!De;VdIA>suB>ZSX zwz4_;&O{GP-96OZ3thHcUr|5mny=#}Ko8rW(avg;+af17#;vJiN5^+$YA{*B79J8| ztsLK>Bf{F>RyjVRF1b2<%T&J`Z5@;&#-*Ip+38{*>|8r z<~0@e+(Dz+Rj`J|pgEd-dlJ1Hb>BoveV0PwXto@-jL|GpyD&zx9m<7AxyaBiCc~EP zHN3&}q^sBP-j}`^{jJA*4UeIyp)5omJfIu}<-sk~XC7R%fu-}l?+esjoQ@2{_0wo% zp7nPwGL64%n61H&YB~0i8iq6p?3Pq}+6MM!Jh9<2W$}+go$asT2o-afLzy*|gEJ#5 zaTamV+n@QiD}rsMGQn^Q!@=YPH(X80olhH6a_7Mh}pmFOfdBZ``(axl6~G_Cm5<$&p?^KixG4om`p2!!v zWvj594B$K$jRVWrRc%A#uDgY!;;P2oxOjkSUx~^wCq4_W{;YZty9|U_@8C#n%|6*Q z#yP9Mz#Eit*PjT;$IzU$6CCnIvD(WV4(BdB1RV7)2ii>X=6T*Z1gt3jmbvu@T)x|@ zm`fbQCE!ndd59V6Rb*x)CUez$rq-T#fKP%U60t30(a(m9Mu=8~3N#0AE*-+OcxUFY z6!oxGq%-YM+^PnI^PDU;JkhMT)l0g1X{7zc$R zZB9O@^=$+$d8ykJyuV!iCE9xgh?cnIs`q`~O~w(~gDRBPq+SD%tCJcOf3j4q+J>Z& zzOj*{kz}=`I;57TIB~%me`_1U_{IpM)%5(o;JHkf?}k3KiRFNIld~E(R}k_;GD+mq zim7ngc25E*N$Rnog*hm?%=dh4*dsyiA;|4~kZV4&aU5ZMWV2OP@h?i3W4ND|Q%Kn@`$alIh zJ<;u@49VNcmq%B9jO5|I3uZmsPw@3af@IyV9)laC@gTSgWc+G|Yt794wR&TA4_24^ zqt#U#tZXq0!g@J$14aC65M=}!?fX5Pv7UB^Y@w_(=|~L9Bhv1GxP$GGvjWm?lH60a z#Y#Ng|l?VVi7+nFrq?8O2)&ICJa1$gIfxSTs?z zLmbO;0z4_U<=L)^6O~1^hP_;lkW2{#BcuY>#hDb;61JjRHhFQTq3kLGUzr*<*%3xr zf=Ef0rHTsITcm738CF+dn8pT!%GwUgatgb05IkWH&1vqcNwPRGB%0g&#tDldn|-87 zV=WIU(D5TCX*>1tr=+2hC#_8z(0z7pXs+Xyq6UlByXKaJ-2CVsv%woo-p!#D*tTPrXQ`yBpwr4EnVW`{8 z#Yyq|=POsJGu{T3%c!8J_bQhmv%oXJe3Q96yBV0d+}vRWZc;5~-|>uG1$rXn@`Y`B zxSsPY)l-C9 zi&aK8__nemv1H_bR4pDT_wK{5#gb}@+dB5U0{!IkxxNd$=S`^{`!Dvrz9#OcO5#V% zDL9#&8jF6pm2NGQTXoKOx3r6)e$+QVr>pmU{i#zEea|RJ26@(~7e-RE@AZ^mrw(@X z5VRahjwR1@4<1W!K8Otk&it36Q(T##_xBr&LfeUBqz z(81JQ@j4&uyPGc`0Pvz#?)zKh|NVUyh?<@!}XJz87Rb;NiJ)wXabj$OA|m}JlN^@3TGvMW+2YA_sa)kEd+FXv#K)DCIlgv2^9 z7IR?y0TurlC$Fl&|12$@TH zOr2ksJczN7M~jlvbHt+=sjBkLz{U^eU>N2w+XA5nCM479oSd42*9}x0FRLkYYQBvV zlG(7E(a8BFv~h_WQ?xA5(qgiQyttZtlj<>usEd=Z08-nbjAo z`P7iD4a(oGA^jyAKBN$1{17}M-RxYo7jx%U&a%}s_ARVA(1zw(CRn;tYJ|xV%!{kx zjC~o-@i{NH3ZrdGPPe{(*!dwB+G%*#o~PVkhjPAes*Db@7U$0Ygg5@aw&m$o+o^sw z`ID&qqUzVcMir+~T&`wrF&+$=7WeQ0tTwnHWxW_;yzBi&X4>E4u3y8_K!4UR6OX_8 zUPpAvCY4wCu|mU*e*Y~!ypnpuZrUcx@VJMccmB!$^mmhf`rC(>nO~4(kq3QqR^luL z3$I^sfsU&>nFsfgdS>f^C`lDf!pcLwzDVg*uo~Z=CzpI!y4H@w3{r)Vnf8J+?n3k> z?|Dv+i;s-!-R;Jl__f#{ShWMg&vq;)zVdzoOO@y82ZD#8qd+jW2ZA5r#h2Boi-NH!ZDTKcAKMIr8sc`^y6Jg5GDwT?k?r z>|DI*IWw#F!q&_ody-y{i;p@Xu6NW)lEwuL=Kh(vYH#b5+7;d68KF}$ha5!yUo(-} z&Ah&!=P!e;#FjQU*LU(V^tAl(= zFspVcLi@r;Dh~9;+>NiiaZ&;}lr@v5RsP`pvE*O|{^%b}xG|1w%cj+o#zGUkDxvu) zxbRyz_NR=065O!9prw`Z`y(^kcZ^@%N{Zf!#Qh+>0ULuC6F?8oPUd;Uh+NRY%0HH@ z{LwLkL|~7tob7RbO>$($1^BlWw*|1Rkj!#=OsgqDqpXbI-@VxfYAZy|hh!*5I)TXu ze5~L!FfT#;u1Z8#T#LCv`wkvVpCcpZ#na=k9rxQt(DWhSCvL?;DRvDQ184pvD=rf^ zbWSFV)ZeO$ZPw~(L>rU0+EF)-#=UX8PXFSfsRmqCZ;p{K2cA`5&zKvJ7k zdqMA0HR0|dA2|xbX=#wtdC-Bwg>*=I;X}UnWyzgZtPG@i?WpNQwb3)AX7qSUH5cr{ z3;`}I-P1jATi1S86T)vl>t*?UMSge6Z?pWqF28Tc?{4|sBfoFS?>qAQp8W2W-w)+? zpZtC-zdrf>RDKW0@8|N{D!*UK@7MDCjr_LB?;-j9UVeX+Uoo8VjF8_b`Hhj^So!TC zzdhx*m;A=dZy)(RQGWZ$Z-4ncMScg!??Cw_4RrfiXUOj$`8`{H2g~nJ`5i95=gM!Q z{3grqNcl~X-&FY>Bfn$icbxo=$G7l1^r0nRqLplN7b*W zDyM2SRcooblBx|T#+{r~+5%_QFS~+DKJ2!fE*pRdcDjiK+*vx{j(J zsp6q-;dJzNEhSXlNmT(=pHg)RRedmuwD7>Va4J<7QdLRSSgP)(Dw(S7R1Kzzn@TMM zsrrGc6RA3tWz~bK5mX7Pim3Vqlc&N}R2`sdJyjo4)j$OHDFRDDL(x{<%po$<8m)6D|c5^6qS~Qk%LD5F@EkvMJ33^ z^2KO%72Z6nKW4o!>?1$ezPqq(#t+s}eaZr&9?-OPUTB_QItd6GpB$$`G%iOsh z*@FCj8RdienOlr5q9k;Glg$1|b{Zw6C2WZSjZih!fcU_^S$~aKx39l7BJ#g5q6qPf z;e-nA)AU0JEl5X$y`Ur6u)zzoPvf<%0hAxqJ|{!iCdRf)(aVMB;K zrKuF0ZM;hd58yWtzc&f?;)kP4@ppnR@na(2Cdh#o%(8n4E(KT)S&BCR7?-T6`B}>PY=k_w^aa~5J}%yaR{UbEWtSdQnassJRR7Pzo>t@(O~x0YCyO3J4AWFznd`JR4_077`2w;EXPh zV7}F)T$?PQ3HSe)ebUVV0H$#oOdPCn=Nl%hN{riBx_Jozo5M={2rvQ4aWt8Z+QTfD zNhs9dQkq;1zzM5N_RpciikV826nu&yOM&D-w68yOEsFi1M1Pf9_)x)udWNpjV8%MI zk%0Nbc;87tw)(VIOwa~kdR~C!(L^S^6krg56u$2YoX|g-&}%PDE^6`6f2-ZYkZ_aT(7}xv{r);`w}T=%CL2RI8{P?sG##) zYOqse#H46nza7z-K((1?RIp86Mei2iw;w+#rb34ehYKMY%P~sdNH6Qw8Td)7J+YvQw+eIm z{{w3D#>cFQX9CdVeVQa%O(trScWE*MA2am%+T?ATEVi0lsZIERqu{B(>E<`uoFha)PJv`#XM8=sNOi0QM8tp=T7|;0Mxg zv6_H%RoJQ!&k>x2ETgAna4WbgM{qsCY=F-p*Ah%ZY-B}-TJ(nwbIMB-Qe?64D+tcV z$4uxH09w0(CKuyFYo!EB@F|2Wh1vGGB_{?-f+0RajavND zsGuT{k(1D4i&V`%^TqZU^J!RuuhXXG>O8;G-2DN z$t;?%shB3`X_J{W;nnz(BGG-@i=~#`m{wvj->XN z{7_KQ6Tchj@c?{&2KhS3j`Q)^2OtGaEp^unoeFj)pV0Uj{4S(|qJ8~8Q0#IhvrFj+ zK?OUdAt(s(0e(I3I~~Bm$qT{HXu`Pz0Xrwha{!EBUz+>{pa!xOP(zsMXXsK;!8md3 z7u)f>7e6V?`ELo}6#VWv4xb3v;jpNRy?} zD%+%+R0IuYVlzGX2H@wAHxRtlO;x262_~R-ptT1GHUO~tNo&mjtZ~=TIw0E;||)(!x$ua&+y7e$RZvBI#DiDLXmL|+4 zUaY>J;7eqe8Mp&F^k5N9df~&s-2{X1F|CaNptZR)8IKRGN#EuG$ch3Dl;?KTn+a4- z;fI0>I&C1h7{6>PDE^2aO`arRUAOc*X8oH*LkcQr`&6VuPA#WFmf|6Nk!>OoCJqKO zLu%vG4LWplGToer&mhBu8kYL^wZd4DLqQj;zQTdeFxsQAq>Zgh3My!um0mdUIaBFl zLZMBrq{%XTLZ$6LsBP)_a*YvxDmVsCV*EKDc@aM;%r?8+(4m4gWivI_;+IARg=x1@ zLVTz=6~8F@`!;?V_(@^f4Xc0B@eRm9v=-4uzuv(wnFAL2W!Ne}4Ix1ZC54QK>pDat$v^#|wBk{4= zHTJ@;f)PijI`r*wphdSXens#N9F#%cNw6NV;(+v9g3TJ-Lcp!EB*?!bU=LRTS-N=) zKt>Z9Vi1fOmuqP)2_JTZD+wm!V`kDE09xY?kI2V|)~+I0j?ZGqQkd(Uj{q6{Y>YW# zB4W&?>`VgEj8U%Try7xD7{4UgpusGHZ2)w0DZy8W@fnbn8w40{m@subVU*%yi`V{Q+q07c@BwA6nz1fZ}|7)gsVs>DoMa8RO#X|^LmH`2%hSUNf7y^B?Uzu96BWU zEhoV8!crI(mo7?>&iy)Y70PC2No8(vQGwOSv%JiGx=21Z`P@;7;@q<;1de!07P)77 zOLBO+D9XxlI5?|xPR=BpD2hwd-FeY0JTV4(yW!+L%w2l)oGuVbLOG zmcO(>DHawLyK&IxQ3y2=^?i=JoQHl&E3eFjYO2)CK>Ri>Cuxg?@6%1EUw@OwpM2y>za$kxwoOJw%o%mrO61(O`V^Qd! zmIG?X=~#i}IwCLXeOwgP7eVcS`l5v14$+EXU;!L0faN@ngAl~A7^g4$92*-aV0rUT zA%8d}Ith!%e_@!&KzbmrLt<`%Ts0Ll1;~Y%vRw8J7Nl6e z?15Z17wUtE>m_(p6S5~4cH6Kh%!hr*>lVTu7@uCQ^h9CH5NeL>lNbG?_jn9vu4OEu15MG=iLam-{TOh2Fo$XTWVnrc|aY^ zA@|<^`3DSWcOf5sL_9Vk9*~=Vk9kcyPC@TMTp&OG2mB!S*u-*li1Pbceh%@<14s+x z_Z~!kL;exd`d1)FVC-yz{OrS+1)*qTFjdWleBxtV|2V|29_JCJL#${(njo+H6XqRQ zc;5F6Ue1F&{8=I1fPCvV6mX)Sr{!M5@LiSFGfUM4f!F+S=~gpN4ts0P2EMr*dC($ojrx)<(?w)&%H3*_ZE@Y zp#CJBETVom8J;8v@#z`DaoU+8s_{(Wcx8}?{rOoU#&@=ey7nC5_~0B7Q#BazA1b0! zhY3gFFxVR=jsx9a6e!<%fKn~Gez=G_G+a2w{9HtS`g7qJcCLuH{X7wqk|-i?N)nEp zNyy(3B4XPJ;W%-mh{ElV?op$J_)UuF_Hhc5l`6UqOhcUf4)?iRL?_%MB6i**qHn!d#C&tFi0yZuh~9Reh#2%oZ2oK#-74=Fj=>Lz zh<=+@Q#A~xl5;rRY>5n1x2h`9Gj^a+1P zytj#{XSa*k>z@}5xMzQ5fl5Gh;DdIM1I|jcJ_vdefFORpLXDRh{^@X$UzXTCUUb?OMK9%MWR}LCd?f-2Acf@hvUy)AHw9ZqssvPG?Uo_tSEM zmWOJ2q?X5N*{S83TE0xn3$5PrOF=VjWTH?-V;PUrr$cHrLv?O&F5{~IlT*oA-b z`&D>Gei-Sk*Z#f8eQk(S<|>(ULyC^lo85tbLicwobUOEHS^3tne^nj$m#zI9x=i`t z(Q>1fJBnX@2mWo;{`Fa|{JTuco3z}Kf2|$(*Q)(nt<&k#@_{b=OFW>$x0lCwJ#GxX zQkj=)`B^P@6u;~a{HxRc-FTJq?+q;{tWdZk|LQvMZ?E>xo?g!JDLV46xdZhE7x2%sQJYL9ZsW`JM90o{fWAN zEY$Kg9j}hcqgjV9Z2fP%p6}SxyGQ%CuY>fqc95P0+CO{zx*A{NKi4^8i(kF=?^a!| zZCWnInvbHR^p4m5+3U+JZrDN?vO-czekvvTmRkE$;|7g?)nD29oyP0>D*S-Puk}&* z8I9XCepTamjo;MxbgUUEKGgV5ZQiQ!5{)Cfs~G;Xx3V9n@l0)ghQ@ECDD$BjH){K1 zHQu9fmd2YkR<8c{`@cExzd7)~IS`x!y-!b=nZDrUNelWpGQgX zKDnqMLsZ3E%|@Hokd&!3o0Vx^sImB)A#8?e=Iy+tIP-Aj<5HOi{HS0t}14Mit(&K+wyW?Q3waIjS6f7_1g-CCnE3c@e0Ebys&ERdK z-LT;OnQy=Cb8m~_UT<5H6 z{IY|%!)h2e1*@8)f`bUWaTOek;7fW{4MuV4dSxam#D&bNwO|($GQUIKzO0(Naouqn z*V#P||0ZQs!@oKR?=Wr?R_%$jWfUBTxJp{pU?%R7XHfq)uC=@C;EG+47C4W|!H~z0xWl zSo?%ZknFR5ste5>R_xBMJyvZx-j-RNj9Tc8*MZGX$dqwJ>+C9MRa3Mrpsp{QR&COO zwc9Er0y8gvR@vJo49#2RRc+>Y>2Jfq<3PQw|Hv`MKYJHkwNCfIRvVr7z*d_fdtlQ- z$33vsimeB3vh~1LtKsy(O}YoRy6d0^Hm!uw1Dke3^}tPLC#9-{X*uls_f=ILm00Lb zyuO<)q{HaH_e9v-qJkN>u)DeiZgwSR65%*hzil74P5T}7*T&#%wHWGdwAnmNi$~Wt zTfMRLiHF-a8{Qmo-)!~35|6|0o2?%GWXvXl`erj!&Z#=Ml5Y0Rrsc!yn@wk^bK&*P zri&x!n+>-J%-=T~GYN~Kzi(b^_RX?^skwKZIf&cl+n3nq;8^xuQ6Ir+_Uw|Sm`l56 zx+}a(+@elg(GU@^5=%KyGNGfE^(`X_Jp*M=0#i==H|OSTz@9IDXofB6-e{3IihHe2LBCrc_r!(6TbEs_?TAattgaZPlhay zx?|uc3U21qoKY^uaosWSFE_{U-^OF(pG@nfK)*14lXOvT7s&dK%84lKx? zVoxYTxf2Ah_XZfIdB`(`9b85c1NJG?98Ve;qAV#QOBCs4RTQf>HeGVTD@8IzA`Pjg ziKfG~QF7}-TJX4+fqoR4b$(ZhLrgyT`p{&Z--LsVslU;$zp&hG3uBYtu-q-XNqSZ9 z*ERJTRBZekDGNa@Ov{Z?Gz;4+?)=4M4F$?#nluHP6sugJNwaAJvRsmdR#113 z)^+8BcGu(f7kJ4RO!HWEp~Uiw;Z(bJJ> zFtj|Sd7w6S=a$f7qhD8N=`w0J`L(V2Y3h? zrL^5jTu~xP_ZQMao7C`>=NHO?tcsyIpz>|4h8R$3xsK3NBu9K>3)tZj(c(DQC1Pd1 zxHAgnh8y9M#9FM0E*1~PpoU7a=NEe@!gxPHbj_)XvO2Z)$t+~!OYjS;D`r_L>3lqp_~RNXc}MRpoV zoO9%bh2KSuM*OltS8dVdK>M$5vji?eMvavD!bWN#D#t!VnZ9ZmG!xpg82M0gEefp!=vmM_+W06l-x<*lm;w6sfDM$OoOX#TDXKB$^`A zWPTb1?8t{K+?DXBt4Q3BT=*^~C113IJ~H64gvFZl?1k77MHQr`Mh=taJ3C*z9Gfa$ zi;Wb!&j2xOQAVZ3$t;(+F{;3>b#oNFvTNQ7-UzGD1WoBJ{A}RozB57QY9nQTI!aR2 zyTk{lM2gL{;3^jHMzI02e052y(p^75Lue-~vTlCO%66d;_96no%HOrCf)I$yjM z?Gc|xql_(7`E@ZS&HimMfn@);gJxHe>;EmTlZ2%49UfUwViLqtI~$nAHb;GA`b8flovAX{ws%rf(q+s)Ke14UL&x51z`FtGWz>z>+w?Man$XUHW z?S&A3j#aaId5cB1KDN0=RJpn-@a40q_h;mN%wr?zJf(tDOCnO1y8o*!V^#)OHV>J@ke{G`JymY z%kno+t5;j#)!hr>)ffEiT7*w)AwF*`!Dmwmyf+qZ!q>ytR2M(=5s^uvtp`?m;*n5pT;lfk3Ec5I*e5Eg>aUSVzPVWag#Iedbq~UHBTb_j#e>Ip zx+uS`ch^hlyZUssK>tIZPPPfYKymzJ8yEF)hqJlzUGKwTKlnRjWFs;%Dysesep~TH zKNrj(b5(q}`)xPC%R2JXhzRDR*%Tip@5}1mh!H)B4A|NIAwFRHc2#d9QnKRx8X-5s z5t1Rlb-Sr!mbD1C9{wX-`K{k0!))czUiqyfhaZ*QHhzom_X)L=_z^>b8~7-{t@2y<4s{yw6_ISdwI?Kr2Tw>Ae?QUE zdj4>N*?P900{8df7CyKV}6FmvhMcmilXpLQM$?r#8 zHo_ZJT6z}P#y{vE(8fP8eU)weAe=VdPp5Sc@Vi%j>mQ`LYBOVI$-*w$_?su25$-ax zzd*Rn@E;NXZ+=_lxA7sW>mKHJul&~6Q(g54zs>lDZr#tE5~_8-gu1@*QMznY-^Zw~ zdz|0B@>@^-Fp<1`+I~vlWzsdLayk3RsZpXCcA~@{`E7kF%E8S~u?_}pPtl;NL2Eq- zt+fr*s*~S(`E9@#Ga8q8@6@10kND#N1g>u7Vp@v((bWTRg;yzW9ssftj|p!Z5G5L= zkI&0*ll(TzZ>#*S{S!jM-Nuu8^xE0u++IC;#GKgwq|+y!nv^tT$f*mziR{1P!>Hk3 zM1B?B9C`O~?>g4>^hJ-j$8l3c?w=#4%vf-jV_(#)#JN4^3@D#6zTPq6pAj1zyCWvv z898TW`8BshX5SuhXT+zDdm|o?IJ-yBn3&6BdJO0{r(ooOM;%oTU-Xu!Z@N{!=$JTi zO4dHdtU0$t&adk6VMO}4#HNVP9WOc-Zj0RJcrW5{$DNMyapet;&!gsKXYF;|8@Voa zU&P0bDOoe8WTlUtlJyFdEA~1zM*YU|8^_Mx3yN1q?2c-S@HxIe>CtXG9SsqiqZ%T2 zNBJV&irD7J-Wahu;#Uz5!T-FC5t|*!iH9QgI2O!oh$!#Z^Nh+35idu*;aD(d%=M1F z5w|;Lm46wLa#N4*kH00N$#H!|$^+dFMZ6R7DSq{iEfE{KO?)R}Ga~quNrpP0AMZ>= ziBwE$2Sa|`i@TUCT->D`1bNvGrSI9P&`~AtxUw7;X>8of>UokfzgyFrUZC;Q znx3^x<2z5IYj7FU__QR2cWFF#w8E#r9mA{FI9cN@8V@;Hne%QeMY_hkBTI3Q#v3&r zdy2CEsm7%m4^30{*Pg1(-_kg1fWoJaQReG3zVUp8dks|PXOC5Q#LpC7ae>0K6BOoM zU5cNbuJC2QQ20+8KdP|{t7oP+YP>QZeWt>d8lO8z;jcCJXnZ~HQ&QZj@otUxY0SI8 z6lrHE_q-EK@n0IZY5cCn112l;p;&AVL~SwXt7q8oGKs5%aS!RY+T6Gw)bAYS-k=*l z--Zh$t`f%mrBxam_n4m2*r2=qOk;yy{nWuKJ-pjY@jHzpG~M=l8XNbSoI{lTKHB_I zjg9+F!-pz!8o*>5cU?^UJvJGFD^be#B)qe5J<5{e%ZJ zHtrYj?G5^8(4!xexJnrJsra@9&5e6Ze1C%2xTkc9#>PFPWf~jzaPHCAxTmt+hCk5Q zxHr-J=gNQM-or06Ht6K%OI#(4dtNKGxj~Qrj5as$R~k>BqRMafx%9tEv0R1L?=|L~ zb&4-F=G}FQapx)fyu(iMh{m_iQuteq<7X>8DN)%s?r(wgPljjQzq(&z<37~~8XNbj zPDVe)_!;-B7HVwVm%3eJPg|9g#jr=KEyl#XA4!fQ3&t?}y`^X@;zz!YWw zl0^!;G$u~~ia%;h-T)LW8k0u=#X0D=nI9`OF4XvGjUUjMyaXtI(3m_0C@x07P4_cP z6yB^cw>&7?HEz>*F8XoWCockuhcq5krf^U6>og~i0*bpd-s@HPJ&n_sDttQnecCtf zpIxT0aS!dc8XNb~KGE2?Up5Hi1l=3=%yKn0?wdWPv2kC_r?GMW>vW7GbZ^`PyF_E- zKG-IWjr(2y(Ac==H4uAkbZ^}ED$&@uul0M4$(w=VQ^S0v!slR|qWk13g$p!p()dY@ ze^af@PZ_W5f1~kD8k6S(#li8)oV*_>N+&2x9uO2COAI~}H!J*ejB5;kq{ihMlUD@A zry7%I1VsVHJ=!Pl2#R+!Ubj&~QJSvIn}4tH&oUJL{vL%lYfRn}6lYzi%*kVd;$e-+ zYl33vWMxjC6BM^<{Hq5QKBO^uQBb5gm3{K0pm<7S@}{5|m#NI-A6EE%jmfiu;^HaF ze09CTf6@43jT5FSbMm&JSg5ga|LsAIjr(h#YfK&(6jQU5d-B4dxKm;wjQeBTH8$>Z zeW>jl_&aTG+%rp>G`Z`(s0=tN0rC z$QEiG)1bn8N@Mc$py)nB*(YxgimNpK@Xrdrt?`pv6dszb?Du;{;j1+^?uR|1F?obg zL|&xqlUE4EFEzgDIfb9r`0Pf7d(Bk#uhiJB@d1sG&r#;{w<-J2X)Jk=K1~A@G?qM6pcVZ~Wxr~#GQUvcZ5sExM41o# zP?>+I@sxikeCSeT{-ee@^AsC3<9_`W#8Kcm(xUADnmAhV?V-*eG$#KZiUy6z$A{uC z8k3(7#d{i)uMfo+8k4^dMbv!dKl%JnoTM@N{ZI_mn0$XIF3_0#e<-pwCLbV*e2vKu zh@w(s@&%%()|mW(C^l$JK0y=@Yn-m}HjT+Qh~jS=lYbC}Ph;{CqWDf@@)M%yXNY2o#^g6dF<)cy9iqS%gDem7AELNkWAY)QxLsrNBcganWAY`U z*rqZ06H)Ben0$&TKGm4~iYR{6n0$*U`Ycf4lYbG#*$WgVA0vt}3lt_lBZ}z@6eeFI zio6Bdy~dRqlg|;wjSIAYKS(I<)R=saC>~v)%*p?V;>86DlMfQbTMHB>KO~CJ7br}= zNE8vd3X?w)ML&(nCy8RH#^jeoF-~LhO`@2o@hciH)R=sfD6Z6){FEqur7`&`QQWQZ z3XPxCn0%HfUe=iWmMGrSn0%KgzSNlfmnd*zE9(RKFj1VMG5Il3oU1YUGEq#_nEaV2 z<{0iZzT9xH@9ka#Jn;A`lRwM`jSc=SI4zdu27j2dG&cCcI5jr-&bT!;_|IIYvB6j7 zPZ}G1Xbxy>@Q3M#c{$@_@RiBd*x)O3lg0+$ng=yD_|^PFV}n1R48!5?Rg#s(=u)cS_Oygx5{|2~M zFYpf2_+E`$HGYgZ9(=vXEF7Xq<9jv!tHzr&{#fJ98XwZQUgJKClz)vHN5RiHcuihy z6vOc&uJ0?M%rIf|P!-jl5GqZ(f^Lg9THZ%I`6xCrGxdDBslqb|eSrR`s?@fjN5 zsxf)iQ9Pva1|vNh-=gsWjaO@oV{7UEeHx!hjQU~lkr=OWqrR6<)~Yl&_@-QGU|s&} zG&cC*JgKq4$E3x;+I}|_DE%||beyg6cpct_8XJ5I3N<$PtlVYT*L*MjuCa0NpO0|S ze}m7$z-WaV4L%AQ*J<~B>xuRaz9vs9WQZIl`!~q++yHQW$}xLH8%Luykg+bl=-I`8~lc1 zW0ijfznJqiHuxv}Qscw}%Kb8p4SqiB409d+PL1m|Zq+z`zjA+0cO9Pg&!uslwtt<* z^*X-yX>9PXc-gS8-ADCM{u%sa#%XNuAGy-NI(#z8XZ{)dk$!fZ!Uq3|$r>B{Zm!VS z;1@zB{&b(HdQd71XFNt+w|Bi_{5 z;4g7N+t1eaqmNhVOVzj!G5k09XPl+6!9QcP#)C(z{F z#s+_l>oqp`Yt(6M@aMQ!V}swuV;UR$Hg;%i@Yi@-V}qZ^0b-P&d<+B94;sfB=|$Nf zx#(q;I74A*DN$j=kJ<3oHarqx!LjLnx($16_+}g4WW)Pxm<+nC{!g>v-`Vg!8&1Nw zVRe6{4R5#M*gk>whuH9?HoVe?@3rAAHoV)057=-7#${`K2iWik8&0=jmknPhag|v< z>ul!F*>H;ux7*xzJCX78``1fiMp=o$3Y+yS#b%yq!=Xjo(A~)#LXFew^bzj^7jbZNcvu{GP>+ zZ}l|dw-vu__-)7UdHi0)uL-}G@FSD_zu@-@ey`%U6TjE+YsPOEetb3JulT)z-{0`t zjo;t#+k@Ym_`QYS+xWeM-@Ev|haVr8*o)r>_AN7CA-=7i23;6B8@BhcLUruXKObsx4vi}Uv$n+OB4x=A3ogHRBWOdg;KV(|zq#v@{>8Kwv?HqPLWOZrj5yI$Z4VOpK4_Vz> zLJg}Qvbz0A`yn%+F8U$UUYGrlX)~OD$g~_@KV(?9_d^zae?Js_BUiZaL{b28IyFps zbb;^d0kbT`Gg?Z|yl$&t;B8!`XUkjZmF4*@+yv%RT$aqXX{gM$F`+@9YVZL) zHr!_{9C2_h^!b&u_-+K__jMjWZ-?Q;T~WqncookQ{1gEi`KyZ4%5bRT&_* zN5HJ61Gkd-hQ;iNSi=NxusM3q{H$w^)-Masnxpk9fLYDadS-H|Ia-fQ_B6-9qkQh( z7@PtzD?;aDXGmkQ5GE&@E?h_!G=4km3S_Xsyl4ED0{Q>?_3g}PLYY)r(x~m*T7aE{ zu-}&ejx^8?WJLoF{|14Te{lwb^c#iBH*F<|ks}=jatRK}Q#ja~T$Y7kCM<1+3Pv(3 zgDIJkb<9o2Fi~uDG_vx~(OO(pD8@Nj!^Sa3>l&M7|0dF9KrxjIZ^|aP_f7{kmikJK*}bH9 zM#^AILz#CR6(gD;=FX@gx`P;5TvXx7%uY(>OPVh5ohzxpQ>KzrX&~#loMac6&)FK; z2(Wzt{{`2P%_YE^Ezy-(l$7Y-qJ>{0i@_KsvnT_mBVF`-WLa)edFIrjoY9N{#Ppn0 zS7uHMkhU_xl{pnSCqr22zk8oVnqrxd~GA}b3EFyKfp0}~hINk|7|2@~if zC&|^Nlf!foXq`bCaWXn`^r$Q9wtU}Mvj=Ax0q-h047Kt z@WWE2iHTfpu@?`gl0o~?l&?$HkWPwtRA3RO=^|#)x{}bxqJrtTXtsx$s0KMs*Yq3| zx~vhBts$(#C+MSkj4p7a_LnZt$fh5dR5D$P_bx1CS7yj=dU{fdTCU`Ju>g^sk~xTl zY7JmFXcR@z+$s^l1o3T5v@>qZKot!u!vnIblbk5Z8G(H8Hy9%)tO3JH7g;jGpCy{D zV4{BoE(I~D&?f(%5&_~l8h-07z`DIQKZXTQgj8X>0rA zms2vMB}iwSn_%o_3qkj2&UR7l)XWFd7qw)Xs%O{sWG5x5eOJjPTk#=JRvfeajL0)E z3jo`3&J)1cG6O9N^YGEu%uBMn!Ias$PZL%s%oQ1o%bmX@7kjo??Q|4gII(7*q5LzG zcnmy6=cFUK%!6r_y8!0}i;mu3j&91|MK}~Zx`ZcT)~@5&xo0TX;1ft=39Xkr9Y57# zv&fkV=b4hC3@6|=W4WL8(>yf8D1yiJmF{w^=2Q@xiMD_C$z8V)X-y2Mrk$iU&|*+p z4P*V#n%x{VyXzwe^N|?V1zLAil!0$SW(;pG_7$=91j<#TZ8_ zym=V&@I*re7*B@?8@-&BG{@!{vs*pe(m@9tI-3J)qCJ~~O|97+XxeEu2U-ozW}7)m z+d@laZ!TSCbD(d@U1W2hZFb!O*=#co&St}c(WE#IhI~J#(;iy84lc${UFn`Roaqp| zR>cFp7|jt~G-{ce@gsy_dZxe~%kU;}<{SnAEIGz)_nBLy+qH)Ep2ytnj(01e4IqG0x*( z)iYK5zwS>#)8)y<7B!c5T*_Le41s~mhR*%nJRJAopA+CDTl}Ft3u{`M1U>OI zN(H#EICqhH=gHbkQWT+*jDSDAGRVL<;S7=)pthnimY|u8w61v%)1Op5KjPy{{$3RWbRlpStrQwBXl&-?-~;bX0Fw_oYu)zwejeatD+dsiShhc zRhUZKo{B%KyYvj9dnH4E0McAuYvLx`V;)wjQAB_1EZ)sN@77Ipa{fJml;f9Kh-AjAQWZhLM3)rc# zRJg7xiX}!}WUR1gfXV^%U7QW$#jf1)+v**UGX{|KjsauFtroH5D>plS@uIg8gEqi}}{@6Y+i zTrPyv1VIvRbb2+yKJ`2tr}l~5VYm%rKF0-tB^6yPRmiV8_@b==_BRTjIF{3e%x2;o-XsC;q4pW;713_*jF(c4|+VTcio>zbegsUZ5r!*p!R#lv$QPNoFUCXSdU z2DFpdy}{bWKHmrqL(SY|hFR}lg!>?IhNNIo1bC?dAsV&AelVD(=uGiqVP>{kpd4W` zG5MLGmSY_S#WLa&-CKq;3;AXdUqL+Kiz5R@;-%%-nIUD3?8elt z+mY2Abla13OaeQyBOin0O#n6Eb=>tyb6e*ZYG36DGZ>ZE9Cg*M3mzV_EII6(S4W;& zYe?q!-cfC0JvN3wHas-|vMybYf*9q>>%2}_2J4@uB3QD>7|;;Vv7VH4R4cHB+~I)u zQ$z#Pz{A|)#MXBX??qVhDO9CBCK-l`#d{QT8mFqTo?q!%dx$E0%)>P+bWq=*g33qD zMacwh;dWTU+;$72)%$(tC=}$q$_`DZ2|*$e+H+&=X5^U7^FU*Z=Z1kUEWZg<;gECbNFEM3S7SBW zB!7e%Vrhxm&~=r9RR^Z(E>KD>Ir=;@7d#UuOqx0~j#w&6ueQ!*%q2nk!XH8F%2VSp_z0*f&?*CC4BE|#qGcckM#fhB$44Inb;#)dPeoq!8>0%aMNE?=m6S=t+DU{pb*d>K1;iTjc@e5JxNy#DN9HNwyMg(Vi z(ufdo9u>mgs8IHTvot9sM4UsEe^N?_IEN_iq!8tuloDLUl2StCX-bIrjSdmN(ILum zbcj3{9U>1#2UpRg(ILuwbci^Q4iUf95aEWXx=A7GZgOI99wa9QhmjnjP9`S>$1gcV zT}uv8*OHS%gfSwxe3M6{urmagJ7e=j?P;6qrvOvV-F~7Ahl&NC84U~}f%oBT=2-Iw z?|%ox)pi@s<{k;L+;_1VVyp@4rislN#(5ss37X$6HUw?PC!@Nba!|WLShV;LD6AK!>1?cfOUeQvM^pQZ%c3BLJmvxACfJv<0B<=Q3mjmAKGJc7`>I&$w< znr5XImoCb3SGtSYwzAU9S(JoHBf+EE^2UqQ95pe!un3%{VLd6CJle8x!DJe^l_;$d mbOH{}YKKPYjYe;izqr8dCassZ1e6L=e>8bNXO%7z;{O2g;?Udx From 7a936bbf576ef59481b9fb7d78a4cad43150b002 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 8 Oct 2019 17:38:34 +0800 Subject: [PATCH 088/431] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=AF=B9?= =?UTF-8?q?=E9=A6=96=E5=AD=97=E7=AC=A6@=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 10 +++++----- src/Tools.ts | 5 +++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 56c3975..3e97b54 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -1406,12 +1406,12 @@ function this.getPath( info ) end end - if not autoPathMode then - --如果路径头部有@,去除 - if filePath:sub(1,1) == '@' then - filePath = filePath:sub(2); - end + --如果路径头部有@,去除 + if filePath:sub(1,1) == '@' then + filePath = filePath:sub(2); + end + if not autoPathMode then --绝对路径和相对路径的处理 | 若在Mac下以/开头,或者在Win下以*:开头,说明是绝对路径,不需要再拼。 if filePath:sub(1,1) == [[/]] or filePath:sub(1,2):match("^%a:") then isAbsolutePath = true; diff --git a/src/Tools.ts b/src/Tools.ts index 0b4d7f2..353de08 100644 --- a/src/Tools.ts +++ b/src/Tools.ts @@ -158,6 +158,11 @@ export class Tools { return shortPath; } + //如果首字符是@,去除@ + if('@' === shortPath.substr(0,1)){ + shortPath = shortPath.substr(1); + } + let nameExtObject = this.getPathNameAndExt(shortPath); let fileName = nameExtObject['name']; let fullPath = this.fileNameToPathMap[fileName]; From 786f74b41bffa81986cdf7d0109d1cb98acb2ba7 Mon Sep 17 00:00:00 2001 From: stuartwang <3030078087@qq.com> Date: Tue, 8 Oct 2019 17:41:17 +0800 Subject: [PATCH 089/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index 3e97b54..2b5b295 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -47,7 +47,7 @@ local consoleLogLevel = 2; --打印在控制台(print)的日志等级 local connectTimeoutSec = 0.005; --等待连接超时时间, 单位s. 时间过长等待attach时会造成卡顿,时间过短可能无法连接。建议值0.005 - 0.05 --用户设置项END -local debuggerVer = "2.2.70"; --debugger版本号 +local debuggerVer = "2.3.0"; --debugger版本号 LuaPanda = {}; local this = LuaPanda; local tools = require("DebugTools"); --引用的开源工具,包括json解析和table展开工具等 diff --git a/package.json b/package.json index e8ae39d..baa3be7 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "luapanda", "displayName": "LuaPanda", - "version": "2.2.5", + "version": "2.3.0", "publisher": "stuartwang", "description": "lua debug adapters for VS Code.", "author": { From 5d606aa91f67c0d8253459bdd8816f9f81ee4cdd Mon Sep 17 00:00:00 2001 From: "TENCENT\\stuartwang" Date: Tue, 8 Oct 2019 18:35:53 +0800 Subject: [PATCH 090/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86win=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/win/x86/501/libpdebug.dll | Bin 71168 -> 36864 bytes .../plugins/win/x86/503/libpdebug.dll | Bin 72192 -> 38400 bytes .../plugins/win/x86_64/501/libpdebug.dll | Bin 90112 -> 45056 bytes .../plugins/win/x86_64/503/libpdebug.dll | Bin 91648 -> 46592 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Debugger/debugger_lib/plugins/win/x86/501/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86/501/libpdebug.dll index 9430f84a29d1a0a4172eeac674ffc7ca195410ad..dc95bb456aa60ee272316f4439c410b1c92b881d 100644 GIT binary patch literal 36864 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 WiY?GtJE5mK^c>r71IGW~{{9cdj<(qV literal 71168 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 diff --git a/Debugger/debugger_lib/plugins/win/x86_64/501/libpdebug.dll b/Debugger/debugger_lib/plugins/win/x86_64/501/libpdebug.dll index 10ec166b954436ed13f96c02f2e85315a165ef8e..5a3fc7159c378196a13978c9a8d222658ce19e03 100644 GIT binary patch literal 45056 zcmeIb3v^Re_CJ2pHYF5lQXtTRXwV{61PiU$QYr~;;096&Pf@_Ow1HMj8=*^6#*Y(exH5Ly-8Y%n_Sxs0+oJ0?3h{ytP_wLmS{Krpxx2m1NZ&!W8;5Vx}7(Bh|bHK^B=db<<@Z+_oSHBJDKM`K_ z34^B?^qlCsn)^>O|Ln@L3MxaZk;^U!<#+WFCNJE)SPSbCF0%BCJ5LZi2oZVcwi-Ya zbJyw!kULHg5?N3b3Ibw@iFo3K5_otf4V>*)L!J->7xK6OU!ctG_)i5j3c{yaA@B-a zf^aK9dx(=qLA^b$-w48{*oay|Xk&!O21eauCHE=`-gm3=SG4NG}a`#k0$l7nuYRoz+29w_a+W?LND9`1?9ZEj6oPzW(QA}W8M#m2e z1>q2TSpHGdC_nPt#k1Z`S;zCNdFWWkTBT*(70Jr;hx9iiYA?rj=+GVwu^QkE7N(~< zgU)ozoO$!FMQJ$>xl0UHrLPj@cSZSo<&|(aEC#F6Go12ar@U8eE=;#jlZo;%Q8tKy z{c&OQE_CX^{%~ERQQQssbBb?RyihICItMs2MftdvPq~rk2BN^eOeAv3@AGn9j^=`f zpHY}2xX>cX`h$-nS=K%g^jRIUBFf(Yi6c0p(Gi@}QWPv`1w)z(QjJ7PaE3_?+>&bY z>P0!eGalI28^q8p7O{DnnqVdp+`$v{p#;rM$d>n^WORUTG>j-8RGz<-!u~A{jD)={ z%14w(5xh~94=cMbVUE|81~{k&vNPQ(W*t&8=97PO`g)=zu+N3+NBB(~Wjv#*$+HZi z+&64K@f2YKqxK#W<$d#P^KI9P@>k;8uWAWHvwb@y7J~~+V$hQ+23HY3UU>{r#1H!! zr~Gvw|6}k+Fy6bR56jU?e6VMQox$5$3fJG(U=K}86+`9~Xc#e6)Sx^yiqWpOV`z(V zj+l4GxbD3~ioDjs5`0RPmy23NdAE4FRScZb8Si?QCAdx}27dh6c=tx~ z#a2-sCgv4ejq6$7d2lH+?F z5o27}4(et>#ImSEx0vda3_UmHHvd5M+E>f07E$e=i)lmsVwuT|ReosO|E5+%t{C}Qx zJek+ec;}d&--a&xmpHZ6J>$9Cm1hW2mTP9 zT9|aQ(}J`H7C%tTTVV1hvsfz&lKw#+l4Er_=&iMP0HY|%(>U&-qI^cfJwECN&UB>V zIENT7v|>V9#qc6^6fZ;TVtPh*7TgH9InQw;bJIH+bs_$>icLn*J=vwFkd_Hm-3-$-{uYLk8C=Ctd zKlKnCccc^sZ%wy2Ftx9^idvS^+iC7Id5dU7@kt~9l)d3XsZZFvg_Xf44ln%oF+U&3 zKKR!%KgRM3cqE>5ElPLD3o{(DFVi940+s6%Td|F44W#d3 zwtsFbQ}Xp*72!?}L-eW5eEj#+%s=8chKith3UbyRm97qa zsgttlXK3IDo!?Oynv!UTjvg{!Hwf$qkDQKlJU~Q%J!FeV;FUbEGtsuwI>m_TmbFvJ zJd)=bjOf_jd+1Ql{#3|_dhJor&?sFJP;}Dy^m85*Sbr9ZD-2l^JBPwS1$L&uaaLJ7 z2dW)q8?dmd#q<)?KPQl{M=63dxG+y&^;@iMlb!N`La@`K zjmQ(zFq_lcD1g>69csG_L4k$5VQ3o5&b{(6X!VjMke`5J;_etiizecTGn5=~Q|8x| zgJ?7{H2lGGi2rAG)JM&=$mEdY9C>@BVo?@NVqi6vI#}iOr8V2={nQV&`K!>lLpQ~^ zV^H71(R=)T#PIIAqyA1ic$b9f2pIgYbq*6{tULmHEo@C?ymKl_fll6WH7o6~jSGvA z`BIglo!|kMesxPR7h$Ld4unBx*t`ZZ0#o2lE9h4)br7XpVsKr0Bm82hFkK{13wcn> z5+fX0So7SPzQDTv)^yRDljqkL%FUh0jzCM;5pJB4Gb!GGnyovW>7w%1Q0lME>(XnH zkup=(RZWHI6+-RR5KUs>h&uk7YbRZe@#mDAMHz~NGrdB2h%!4F4WYT|6*L1#Uz0|u zktgS04(gqudl3k-)CG zpT{6pG5-xtVE!IU$w0n^WBv-B7|dBJ=1;Bw=2pak&-WsmD9<*4#p~cynum~Izlwrs zUX=CAnUey`c%X?bhVvK0$EsJ3nZ_2n_Gji9f>89>btyn^+;MAq=F+9w_~3I5PbLs5 zxyy;3l>-g)Ze`bKDzGpe6E--Q0+cUPBQW1yjAg>vh4H#HiVu8wU`do0$wY?A@lxaf zvg|01<_8!ft70;|k032WCNjuv(c}*!4jmy(-5>OwZnA$N)V*h1cP$2LpcBir9}yAw zQD>}sCILLQp8#osJU2ZX>T@4u$v~>gwc~tUJ+73l;?dRuKiwJ zHSfWyxezEsc?wj|J;p#Lc}7E3`T?uv^T`wV0juVIEKRE@A5dHv@I7hcMuRVuRW$sd zYF!w+M(@*Yjs8tMm8LEXKO_&=vy68hAP-wG?PO_Ml+Q#~)P*V=hBVpx2p!L%s;DtI zL0xk~X_Si_HqkuPs4;ceBUDlhSEnGpHc#;Diy(a#7s-Do;Zr*)UhtplyrwXC+X>)% zrzDDRVt0H8AMSzg8;J4f=y=*+_M~C@B**!2e_)Uy(lKR776+uHE zQ@MYn$-avuFlS%1x`|*PlfOl~lvFceoVQEa1?fSx%F{mwY|=t8T1X{|`iyE4EI{Mg?{);IB5bfIPdC)A#;R|!DC<~@8jTkse~Z?LC&gfr znhsr^uM4q)M7))Gq;JLGbWYI=z6(S2D)e?yo{Ayb zWDHzPp3z-cKVyg*$rJb)L-c3V1u~7)zvt|5sx8M&heu#K+!c|Mx%YufGMG>#w-m|L zVt?knsEvtV>S;FuMI`-hh$E7KFQJHz7ud?Q`g%--Ve>K$N;tRdeAM4`OLHTQczFb@-kRUdL?sQgv`B#G!6Ri?WhIXu(|CzM%5b} z9N=It0ZJ6@`8k-NAlsD%Uy`IWKZ1cSLetF)&pF$Rk`K;21Cy2Jc2NQwD|<2JJ5~d;Zs1 z;oSTjP%owC=GU*sBG^Q0VCa`~7GYwo&OnwRh8ryjR)fHx9a__y)LSn8j*W98jdL-0 zTc0NTX`wa;;~a`rCrsuoP`AKlE-VE$+R0LSnzax5&S~Y1%aK!t^?JDx;|vPfl`lcG zIP#jL`F!B7=|1pJI|BcvF@LZ~o(x&+l-+%b^1i^B-^a&%o=Y3^U-z-xeR7*T@1??=)oK2r82`Dmm^^nd zd43!!I>nGYZ-YFaW4R4lJLDm(t8U;Z%)KSUSoZ;OoNQ&y_J65T_6rnsOxvai6&+K) zGodrV;sMcc+rLb(b`%|p=;=X>DQdwKG%kcC#N&z1;Y>?MBUgnYIt6R=LilNJ{uh%m zE^b&nrZR65jG1H!d1yZ49h;tscXu;CpP`9&E16%lgxtszwiV#u@9LLcT(IN(SZ%i!$jaYy)*cPDuT8htGucFs{Qe6@tSH z;LaWX7=EQ;xx@9K|Bit~IfiD}0;1!H(wa^QlaPcKJ5Uymgw1cs)P9)gt(OO zADSa*N)5LJ_4(20GkX7E@XLR5$Q7@Q2o2~lU{++Ep+U|xDo^TKSNkh7>%-y?Gz^KKS7u%r!pD#Fa@C+ zE+Z8T2Q+m-z#=_Iu+>gV$K-*I*g2R_9_uKM=8uBfNeSS!Lw<{^8y#ROR8@_g_K!_vqvm@R3!=_?rw`WQNRd&!Kcjl;s$QV(`lO zi0?>76w>&o5u*2JQi8TX{&++|(2*H{wO9fnIBPcjbONjClRjQh$1u(Ff^cN z(*_{l{qMl{@hdOkcs@oyBbsg>3>@=R93PB8VDQQ&#L;RbWWJS0gv~R6fF$iQM#zj* z*!?EzZ$NeZCgTnp+;iYIu1iBS=3l{hj}a~>?RCR)4GRDUXc9(YZt`8g?Vo^=od!pd ze84%nCC0vib&x>zM1yKiY*g)u#&!S1;LlCYpxn90{U*k@Lp}zf;7u^u zN4NM5khHKx`oFZ(uJdz15cs~IKb5j!-h#kX=1gUhe0;}77OD4VFcb5mhyzOKpFovF z)K4r-3j6zkUy1&&I?9lksj)|t^RX@=wzw#N{$n&E{dYjRZkJw5;A=*Qd3d-Nz9QQ)L+aT8A1Kem>ARw$frqx$ofYh--FmV z{{##e!g{1f9s^_D&B!- zfHxi$MBR=kBcY~rUV;9UFpEl_VNs43GR_YRN%2M0&|7*S#KHXe2# z4?Dnu>Dv?M1tCq20BaeE7MRkgd4R7(NIv%wHzOcEKNA2WMYk1T_7WE>J zdYnhq@F*)o_$ZGG@ThVgmCvH?;87Jk>N+0v7lyE$M-}m?`G^XeT|6w8hs|bTlPD~x zzmmdezZCsx?N=Te`LaHB6#y-`*QJ*rBr&^576W$FFLI#WbUm)JznKXM0#1I@3Z zd=D#_rtnQyAm`eBM45IJk4@TI|F@;mWKCP$GqDJb?sjWSycbYUERQ2gyeFAIy2RVW z{OS_#Zl1VBxjqY}YNzt(L>@dQsut}=4Qq-gp2Z9%P(;$yFlQcZGuEz2L-oI;6KL|g z{xaIdbkRb`BFb}2m;;qo$Qq|?w-Pf%Iwck=vU1y$V%HPvimXc8csN2u7G)q3W3xqR zMgZwtqTERgvr5mC3JIKq9W59+smOJji2iSJ1XiV*fL@gMc;k!csH19>jC0Wbn7qbB zGj86GP%)Vi(&&)iAS$1P9S2Qz0it{VW1QWn2Nv z^difYyE@f}4LD@QuHg?x&b3l8a67kZPvHC;N&LH*`1cuGzlg!rCNCy39r)Lo#o5(4 zT4hlG>7hXrz$9fx{;%W^dbyPvICi$B@wO-(EhTBJVpL)=B<6a-vPPW!bb@8ZDKNsL z)8#d-Wc!*<;@j~8#t>|mIYN^%v0-go2Q5F!0UJy8SC)!6a52^Xr}KF2%N@M-u-~6u zdsLjS;I!I9-K5UaIhNJ_lw_oyjSlRP-%+O18tYtL1jMOb1YJeyg#pp=&BildyuQ1)hmoBuzNAp0weUGjn${z6K!`j=ikC4gElQ3C$L>UD2XCsq= z*JLWApwz;1Sb2903;mV^p7fR|_u;A$00<%v1oAWkuM8Cg7KtDd_5_VA)<4*JaCS1B z2_Z(u59kk0Y>SO>=C%0GR|=VUh0pQ>gztwyX!a$qg#D1Y>DJE69M~*p@x!nlcIMek{sA;gSlO{-2aA#vHKdW| z0yOzSr3`IE+W=N)9;QYA-JBqpje~u7Gw>QltHx&@h>IBR)1evjh}(b(y7WwE-T^<< zW47%1L&kyd~ej3vL8 zAFf{cL975vT%sJy50?`I82qp*QxiEeT*Qn8{teC`T1q=|uQfG;G2=nTD5Np}0~3M) z%;{nC2bj#D1~iMK_dtlQ94`iEsYBI_UeT0bLhT^KBYmC5ZNfkVMncH?GMkTXh;u$` zIbcKy^+#!hS4xIx(}8r@l~G!BXrqL9F8I$XA+JZV(JHa}MCVVgQ=spDO*+Nsr5m{} zaaeha^(PgBnzY$SkQ1kSPA>_+SmnW}5FEa+`mVL*2mh zkE8}sPmm7a>(gk6bdoSwJI5e7Kk&)>yOs5K>d2H?J@l!NhmvE?V1p&mDbFxW|Eh zpv%;OT_%it8>SVGB!$Z_2U^aATHh!#HcGU`SlKLpk2fWfyhva2cc9| z2ipWKFge+ZFH#??0rDD0aYa-CbrPsfv|CzWKn8wL4p61){O9qlVNks8APc6AVxs?ho~X%6M zeX45RR^%i0bvz3PtI0fGlO$ddC@sM_UMOVsFVtipuZhdVYG#5u8bo~|9#~ztgomit z=zX5k%ZYyy9wHf3!JOb1Fm}ANUv$)B<$sktAF4 z>poDLXJb-u7NZnVc{-AUDI^6+Y(Ui}smZlOW8FVlSwP37AQQWgf^V{5)mNuyvLcDP zx>JrL2?p&ExNxvWWK1RrMsweE#s*MQz$lpoVeZOI$k5SLXaoKbuN_& zPq!NV=}ZY zRnftGPBT+n#~}*iP1MoI;(4nqB<66|Phr!bgEZag==EHG@5%a>n~7z!*l^_Cm8z5y z(_I}wwL;zN!`fGrQJY_GlVz-cNH6=PHeu4yDNkj_B(frjp=$sHv4Gmp zH5O(6S0p|UE4NXAtWTmsAVIOs012x9(LeEs)sCP6*MEPD#AS~9M@Fu*beN(a^g)2>xXSt z;?0YfQ)aA-xkV9|XXJi84vj29(XkfA*~~whUA?43BU6}PwJ2W66SpXa3xT*)6r}PR)RN6VZ=P7e3}M|Ln0dOBQzRJ zvswW;21w4H9- z=m_s`cpW)yr`vab8E@RNr?EW_OSQQDg_mJVurbrVUWW`I_#LFQHR;B5UPWqsWPbbg z`RRORzSgwP;2cxo`hl=5&_)a*Fmo1--c4G|m+bT%mVoMQ>zBcIRMW*i4 zNJFM_S0il?{u${6=}&?D!K}oms7*4-5~P)P0`XKH>CU*cbp$l2cTajfN>e`F zMHD783P%L;r4r&vD&2^n=vX2r!q3i3GKMBlsm+~nbXWyxsZp>SkvN3t+?>vCbg$h< zZKax=dbZzNH&70A(@6UrK;KudE%5f+zckABc~l?yAT{C8$mJmg#}|}>L#P0FcM9Zz z_u0S#CWOs$Ozt7bO%0U;ZVaSi)P_0@1iYa>cr6^(@T!KUFAs9Wq~meJIL0TCqJi#7 zZ>I`ttz<=Lk4DiWh&4({OryANL?*RS?its;QC?-FsEsl+hMG;RAyAfb9SDjxK)~Hw z1Js#`u3j3z%0BzB_A7SvUDnTAjC4`<+t~I4*k>oQ_}!5XHi!yQjMk}ID~XM45WNp4 z8$<?`qVp`-ijAq^< zjDV{^01Xm#i(hSx-LDcIUm__E-~{q#F*#c=88Hgg+?xS{y`FsYm z*IVd-iz?q z^(U6;blsX}K@7rAF}`WYs7>=a30H7X9WH;u*FpmM$B;&l&@@-GlFn|LK599SARU@R z48EG)ih8phf7VVPF6pIFE(O|{M%jv@&u)~<83pqg1!$C4!LD=2tvhimJK88tDp8eN zoSInqHFW@r#_(wam1rbt3-t_xbk>ANXbQN9tnAFi~~ zJt8b}*FY_pf!#%%ID@7)m{h5E`2J4_`#2yE_~fY z!d@p-Zmx!Aof0E@CR&gyq3nAD2bIS@qn#MKJBggAE7Ve-LAjgG&XWl~hETOt@ckQn z)W*Q?jN&FQzJk+2Jj7RUu-f;f7Rg`pJzzu_FkGPe8SLq7_K*Wm=z7Q|~P)M0f5`OzDdt5g(} z#E}>F=Q-qJ6AoTmpzSN~w)6a@XXihN5ls0{v-WQ4pd?zcPq1uKIkmHg1i43XVHnY> z4qb#0ujMJGIMF*iWH<&YGN*PUQo_Z)M&&`Z009MHYn!SaP=o#fj?kh6AGT4hP)XfE ze3MU5n|RoV7_N(ah#~eP4}3og-IN*iXg><+JI6#m$Uyda_MHb9aodPxo~V6Z3vuL~ zkW9`{0b})_PY|o5iBwwel>zZopC-nMrp_!UrX^Hnhw6{CF_i`;9j5J_9Ob1xR3EIh zVI9WuYY}~{>4o%KswEU-c8ydU0Q|fMwk4D$@uUce7T(2+u)?_nqg+nO+HVV{ID!rs zNMNuEI#M0YwhZi9qhC2Jw)GCQPmC1k<-B_ZZMUGoFz9iX_&DulmLNN5S&fVD7HYm) z@-hua?o0K12VEIkMICfe!YQW|VYh9JO}1KWxjJL0TJ2boOjw;$rY&kF3Gqd^sXV3# z<^Va-mTR*ZL%BUO5nF5298(Z!lXGpkt1P#dknk#@4p^cbVVMlMt1Y+Lsn?b8UWcR4 z2epnDA%b_j;VQ;1R7fQ&Ne%h{K~#b<^c;_51u;XZ|GJ1#{v!IOfNC|S{ucGpeh^4F z%RUMtIJT!@Y9O*>?4vxSDDQxjXv;$lCNld!o!jn>co0h*S1@>`U#0j@D1z=3~|X5A`xtf49z|E#jy-1GWq04C=3r2bU&LMMy+CT})M^ z)wM(JgQa$0H*iDZ!zfJ)?`zT55YlYpU+rqPnShD<5mxk&v~2TmcN57J_R%gS`~lnd zrj5;q(%QZHQo*jQNC{q;RHFy=hm-_j}lWmbM>7Q=YsBiPa70A+%qp z6LaJ6WfzK4H(NV#EP(Cvz+AvG#LTeT`KsgG$S^L6I(Q=)1Td!#6oaT?qd}ct4Gz`R zfGDy&U~jnFSR=Gid&TFhEn2zhNlw0n7D}*B5;_o(e3R-A!9)iBB1pf01%V%XfL8rv z2FWz2BRK!T>``ogABP{T&|8=h42v9g*AE7;uOYo)Kej6Cl2H^{!gd{}ki#T#a>y)X zC31^9$`P-zfMF$~QGPouCU%a`VoyA_(_n=1E+GnX__jUBK*17q3uxEe8b?+*x^Ad= zwc_w^V*@wsbF2gD$I&TXt7 z#!C8C#%hul=mzTqC~oK|A6-vyTI0Ii<#bzth`Lr+o z70De=`D0*u2$=9O4m47i^(7r?{n#P}!-{ZJL+x**b0^Tr>h*n^LZ6e`+Yq%E^Fj|O!R!Y4UP6jRQS<3 zGYCISKeVc#O<5mKppf-u6sZrm4{!+yvlZt_5pD1fb_P>BQ;LGup<^R}%c%wM5Q4p2PIa+i+g(6?jpq230_q7( zK+X6S0?Gm56&v4+V&L$NHi)HsnU<^Vw96xB9YJjrR#J=6ZH{>B9t}}Jc!$~Ao_J~*sF`3=> zi3#EI!S-wAgH4XlEwJ1MsiToZ(!ixm>`4z@!((e!92NT;&Y;s#v72du7Q6ryqq{Zn zQ4K|=1d`qwJxr-7MTer_gTXi4zMcl-JZKGzK|;_7w!LH79m=i!7*mGe^ETiNT4WdK#3Yw>6o>x9IK2lI5Gy(t zH4Q|6RX2t8IUGvXXv|`WB$zjn*?kXGs^fnlUU>&UV7p#<8jjey?o|C9+u`7CW!#}J z5RrU8y9#S8+`C?%1;3IAom~kcnaYJh%B|dk?LOsZI6J@GK&ux%AX%N~(U*Xs6yUBk z?jPR$2eh7YFPZ}FIU1kY9R)hKp#v#DLMuiX@pcWuo~5uaSeS8BW9KrQV-4DArPLCZ z_w2L+OQ3!7=$7p|$D1wAtUb=4y&bP&G%?tP59Sqh8B_E{Ky!9nO0pf{S{fU3rzAT7 ziM=jVz`A(vPCb#@g&Kpkv~EeoDbrU`@Jk8@ZCuxf227SYJ;iy9jTy4ab$MKy21gaIxRI z_wX^ayUkOlvZh9J@HDmgHz7pWa9m1QhYRf+aE1!q4B$lo)`O|#wDD>lQb-&*juUNJ z=6GZbd^A~n6Q2kBA?(L`3_CT*)rq6h_;zygC#bhF2?1IA>l&f29OS#XgpZBkKf(wo zo^Bh~c)AVe444AhF%ro^f5*3o<2=rQu{M`Jx|cyegK@`RO44qvW$aZRhb)7vAiKVC z2Opa_T}jwFFxmv1%{4y2cAYyer@5VvIov&A>oM&v1tx*7(Om~%69e72PgY}xLM?qi zw5APh>kHGZ&`ksRaj1_VCGG4(abM!MS^pK-0knd03`sFNEK??u&=+k;qm6M&M(hx(<;B8~>iuK6h*e;37@5#Ox81BIav3D)spv`-o) zGg4CPt|6qa5K<_YfgC}C3f7|B!0IBU(gAw3O8`0;WC!~$CBEhpelx6J1$3N|T!65< zCuC~JV5J)s5niP-(PZ85wX82ho~-xqL4*X{YIo7+4aOrxsf7M$-Ean+!j}Z!D*%}q zoAxFmdIf3~9KH|X%J1N`ZaAVW1bJCUts4$2enzPAfxToBR}Umxi3XZv*ji$N1t%m^ zvHGHAg?hTgN@DT{G#f^PG1vSoaNj}g_80IcG==VAue?kl1&4h(B9rdJhTsDW=tB5m zTIQR95jA=n;S%V_#4=yfvuc>U=gBHA1ct%dE0}^6W}xM z&d~ML*TZl2HYMzhv}fer70okWV?bdBxJk{Atjzd<2}L_4*|8EmEh1Ae_~{n+GT5z9 zF7}1tz&%3dZF#wGf%%(7yz96~2%Go&t)mE+pdm)SZ?4)k|I*xxN|9%RB zpMj5blpL5d?m|n7I39tUTaB0<^@GVT>uU%E_3bvE(hB#d$l9!b86i|^v;GCRbimZC ze@%5Ypg2LisgcIt4upx#2|6k{8ZIYKr33jvXM#lwgnpKss|6yXI|UR97-Ogx`v@lX z!)QQQ*-qpg5Hh0tSF#6Yv9Ihy!72d{!{)^lgUaTLfpUBeg3PfMG-sDEODB#&phvJx z0^$+f@kUp$gv}QqTevw8j=S}F>JaL&9!>s2Vci3oIv8vFVf|;IjIg1=P=S*;$~|aC z><@j<;^WDp$!A_{TF_C+kp5pR2FLtD`nQ-9)!iMH?<)S_x$s}k@$Wt-{+FWoH=i5- zrRTzb2s3PyYK()B{@=t$ZbU?K^zCm8?nKQd<6-zm@g6GP zXtxR=XXxwO!ScyUO0LwNQSqP}Wa_n6<6_*5;Qg?EQ|*Zx;4DzV@4G?rJ{{ zRh=p9ca#Zo4grbFDan2m8MXyl5=M4S4jT)D`tLBJ z@*5L%f|QY8k{E{#{(KLCq5AFL{{#VQSvgFEu1Ei7}W=pQfZ z??H}0i=kP63moytddjX?f_guE(!fBArCGlOPP8CC^IHNJb&4F?(Nk{{(qFY;tOU$z z%+ifxZ}GfwqQ+sZ=IZ>(;}mcp(b49JKR-1+oigXsm#9sm;UY zCBTW9l*BRcK@Gwu2D^-#zzy6#qe4rmP?Tm3n{R*<(`C}B_l7l&&~GMbi_-+HU=vOg z5VzPL48gSU6l%)GibWeHV!(})!LN+pdSc8YqbZ;Mc{-<+x7S~TDyD|bFEi!F4tu`c z6gIyAAGQ(3k$XFL<2E$+ZzI3mf@~&nce_Q*f;-D@60>%TJ28;)0P)4}WNC%v?S*EF zt7iIqDihs7q(2T4)K4HUgy&+m{-a3}`x^N(LA-#EL6{#xL0ox)rU_jsl>DL<8Nwr1 zAcEvp@>B443<4t|CZ2|y;ZbHjLKBH0LHQiCz!8TsSbqJBc1jb`PgMao{GIa&!<9z> zItPn#9$ngmrhPu-~KX_bv8I`=jBJUF`Q` z_FD+fg-1?czZvXzDErN3zdxUq{#6!onEf`gU;0Sbp+nnsdogzT8lyEpE8%pTGyV;+ti^fp8;-KQ)8#>s zGzBKIGR4m@oU+9mC0uT?#RuBEobgz2qLBRyJHq%%7wK;kFS1pWhEUYU?kZ>X62s?>P8lHj{ zWStdiT4deNj>(|MlI|WJc{_L!9=U-14rRan!6T5SK2dv3xLph5P?R_10DZ>`uTiUR z$RzhR?#>|h=BOJpuBGE1_+v4MA)a5NbfFCkC{IO0w|B;OW5kzmN&E@q@(3;(K=}O(vcr-7sYQw zyyo5+9!lECwIKup+vAq7Cee-b_^Q%YD z|H2cuD0N*ZUOoE*2<;5a(oUJvM=i3BVtJg0HTFi*a~Oe43C>_7-UbezV5d%SlEm-Q zE}+i&JFwC>EMQe!_A0rLD8r~E`A2rV>lnlO875RDaUX`h$USbo0Jg|Z2*i^WO%HWxIr5l zTVEmK4=VGuaxSIJJ?Sk`*8Da?Zx0$>%1|xuKj=m~71%3%S84P$X~`lC>Pg>XoHYV* zdX>1HkU*?v_fSp{M|IF;?O&UN)^0Rz+AZ&9A6Zog#)cv*V{OO&f1vwD>Y{vuZ;)*$ z!YT|?V8?TjIL<>Iwti{Vg4$Vduy{U-#8*o^)VJlL66GS~-H4o-e9q@v<$t@H1|UQt ze)ZeQ!*00hpCV_oek%YyWWmj3Ya#lRADQ>VwlSK1E}@?fKnHSr8LET$0G}T#SS*_q z1I5PUN4+4>@mHdlKd5MiQ`V26Ojw;^^Pg?LzuicwlLsSM*?%9h@1vhx_yOe^9bO>d z6#e)2mpRb>6p#N&h3EZ&`zffNkRVutug|k(-QO!S8^`BAwAFA+>3MZ)XS}9d(xaQx{ zgTA|Z#BVeSwX_asT+N}D4_9|sxK)Lb@c*9<>t8tDb`>hW;eL;o!;>nUSAA1;&B|(v zdsUg+BURQ^tL2v5+k5&YrRA2=D*VaLQl7Z|m(qE?rK>H~?v<7*cl9!2j%{+

zm$4eKptPDoAfAs}>k%82g2}gj!M_0O zdVa!z5jgRZ#I2-ebkFB2Hm32x-Vcwq-QbIAbG1Pzg>3B}OmsL&=XA(qTrhLLl9az7 z2YaWBPeg46#EWnrBgpaPE&J$eJv%xUhKWsXyD=}Cg+E`iFt_`XHI(M&5Hf^OpIDaS z4KzaH-EQ*?m9KXYukkKvEb~8ZXTIx~($|{Lbz_ydF86CWK0}FxeUL8?H?^!dT?Tku zhP`T?tezq(E-QuBMI8gfe>u=zQ_s&~@vR(9mpZnj5Bi4ep8L3}hYsjFWmw-ypczx7 z2B%gvVoNfakL91wbaQyUcSXL3WAHdj6Hg8fM&Ke;1Oh;6cbhXtt1@%av+h%?9tVK6 z=jeG+GhB-)*R7`ulTC{Qi1VZ~ID$KyB#JQ}}_vNa{+oDmQA9~Dfb9GvHconoJI-$c1L zl;r73k??*Q1c^iC53zF)qOoo3nMid}Og^%xP7yPO6`{=}VhzQZTBGrOA?moBQbyl4 z3beS8SU^~^q)lqJDR$>usqSRdxv*wtHt68BERnsU(__8(GCz*fZ%<4e3C?G zPmSahmyMG^TpE$PoaGmiRIYVFL{7Bwc5&4mC9@of-J~TyX*slD{gRD8rYduC_(2>b zj~TeH>8>lKCK^Tc?flRgdRFtymsO+Ze%{TgJ#BiCGYOwIng(!^!gqZHZJuTq9mEyNuXh_Wkx8dTA2KPoo}Y=z|B3iz z`DAmuQIEc~q6?;r&(`XWoM5f2lj9Eh&OY*)+o;sKm|}9^7fgufGUC{3<&_9^PfU%r zcO|<3J3^Os7?%g?9r9WberYnnaxbTD4rQU;C2j`j!MBifjP16Ead@y0$NkgaZi}%$ zBHiyNCJC;htM1nj1is-g(@XK{nL=QBVFTT97)>P+jSIla!%`nvY!h+8k!ZCljEN$R z!C_6kp6a8Zp%S?cQ!K5nAZ#G=9TX8=^THE>m+l?SL&!_Cx{Mgz-bv~A)r5d}8<2iT zTpLs@xwqqtxxQ=H5Q@vPP@G9!=W`8TeLvaRiIjjgvS;UlI5N8aEm16A=S@UQ^j7wk zW&DBVj+qW%PWu$g05df`^Avqdu-D_pNU?XMKMf^YFOvBW?z7y*JO#Q4`9v@`7|l+3 z4rXj>>h{(nZf5YxuAsT^$$@KgI1a`1cAVOlLi+3N*}+s z!k6f(h`hR}7ewH9n*D~0Mu|$0Zx&yh=s@1jgQHzoM8I{orkw9pj(=1~Zbt+#dE+j- zx2I5%`4nq%(lMo8>XSZr76cIiyr@ZI;n1)9S44Qu^-BmQv(%TgspZU zchKF_VC0DI0LRx9EWHzln!^gps6To+jQFwJA(&9{7w%2fsJU9*5A45?3wN8xB&tGR zEUc%Ab)1(NO4+j4tVx!EhKB#HN4TwP&72G`E1;wdE@Ot_R!#CWOm6qq_|1CJkfbIO zv8mRoB@oBZq0rj6#3m~Har$6e>m9=XCp;pmU;AI>I@ht8|BXxDcRlag(;M+n;}_F4 zBOak)H$8duIQjXuFmrnp-re>jq8~&1W#KOMv@LAbFmJNL;flf%&>p;(P*Bw9pQ=Z zJMw+6Aupy_*z_Z%<@NP3oaHv#g_zMI;%-aQwW+cbgmK)9uTx@u)sdn!Xe*L2X)Yll z$s!@R71|O{*KY;AM|7|2MGjP?K5k`XH+{%<&wuD=xZvg|04UEO5|^Cm>E*NL<#mk?NnD=BezRv&O^cJZFjW);yMGFz+XQ!e^PS@ zhDuvq{luo+SzZ|UNSK3z(*M={mFFV=aJvR25Kr}9-j zxrmM@6PYZw|29AQ-JIftTt4IO`=7{;vln(-3Eji1^$6sGGRLj3u3H>;Bm-dW*qm>W zc?4{9qkFrjJq)fN1)kGszkE( zp2Sp7X^5lrlm&ip0={~5bTC@7YKC*-)yW|g zIU!>`sy}Kc;H?|N?ooDzaA7hfJw(|#{W4^QqQ@3ust+H(9p}3X1+brwW%X%P(B~D9 zx{)_n_(D$CO!MWPDTisSA;c=uA8+^I;6%-kZw6%Jc1BC(u?V7_Cwk->xRd zorSu&D)YiEit5%QR0ukVFXqK}k^J1?S1g=*49d+IEp9n`iGO2*3 z{X1Th3jXQx`ns5=I5aYxfc)0}9|3=9*RAHwGxZIis(4~|5?TVs^oxMJ@8xmbf|9)_ z+oc#}HC_W7!mviQAD4e$N&3>0+TOlp!XOrHqP~#uy0rE@f0bYD^2F!n(VC^7#_8?b zzQ0PdC2u=iZ#0GgCm%K(-39INmbCnsMcY$2$%w?>_QED#VAaRo(u7!GlrsykuO@R$ ziRs3Q-k>Mk(7$i7ET+=n(r4$)3-f^d8N)C(N_?xFc4aP(f*P!+1$SvvIarmdnqWGz z04cDN!eBJ)Oj9pzO!lD>ZdHnF^5tUhrgty{=M&H*+`;7x?`vGwP@!TA zi~#6cVH9YFkh4t^P`VH@cpkUy<`B!_nm5N79sTnjl`3HhcVNs!b|67;I1+Rl0BaY4 z*~ga2UOc<@v9o81%rMP6Ksn`jZ*dRS>Ss^#a@APNOZ03+R+$>TqR_u=3bMy_-H)ku!E5(oZ9S5_#U*8zYQRCJ5MhwF7naAEd4!$1^DPSZ*CMoF&BcK|3~iwy-#DI80Zzhr<wz zvjB~{rAewakBZ0;<0f~gph{V()*NmI=7okq@6<2WO>dB;%wlWlykVC#MM-SN#o|eq z%TPOW2r-%Tqb!7EqI%a>M(ly_+@@+OYq+w?b~FyKH;m1WD;s=Gyu0{gd8$aFoDR02 z+?FN55ivurZ)tXbPB;9rJVfvmfKJEsWnVQNSzAKiRa0_O@8>08hT&!&hQVesbXjGA zcw%Xxf55wq-2PxNtO~EE`;vfH{gdj=yeWo=Y%_2JO^T_lzP?6jO@HXT zNv-8OrTQYYadQt+NlA&aL517#NB{=&BYxJ>x_S<6ufDl@og4hVp!2+edDBa|d~K6I zC8W{{4&>r&?T_XpsvD;JYpH&KA8J}KrzPwDh%Oy@&s6YGDT`?LNP47%qv!Rqhv|M) z3tivxCIAC>EN2MX>R;bM#WHCrSm@s_I@Q@YXoQR_z^PXMU`i8wCyp~Qj7NbW(%0k5 z;LUBx;SMU@C2(t=YpF-RyDy{1f>^+~yH6c9bw4igWopxW%yGcKw$-cHadXb{4!+aR z#Hbm2?6xOCHd*tp7J1M1wl+v?64Vdg7#V?~91Ca~tKR_y_MAB!NC9pJ^-Oz`mo{o~ zmk^arM5vOdWTIuRPn$|~vsmDA3+u1{H0}dcOeel!VD%Yn%*>5F65xUOr4w4pvVtL$ zek^G+WtL!fmcfAJ{ZwJU_*#kc;ewR?$$>{nY#^tY8gQwdh9+S8SU49B6&y6dv1RTh z8OI+Yn;Ke&LPns|1DrPe?$YH!f8Q)E+^EazQYp>E)O|>5xNe1QBGgXg_08VIq-QVA; zf_xDN_>BAkQ4}eEJ&PM;PZEG)IeM4KWj#^pg_>gXj?b#iJZxYu-|>=%OMQur6;12`2vWs1SF zvuc{vx%5A#jQ|HT${J0Nq^1#?FD@bu(*ehE*y#v<~XJDh(lGvqT%ETFhIQ2{X3b% zO4K2SFthG(e~=NH7&dlm8$zB9aF|mzoLfLB6O6A)AgZ-KvGMABw9M$Toi<4el0?f~ z7x+cFa?n=-vA6NlCHWm4VWo5w7Kq8VJAXkw@OwoPKj>~ndT-=KMe!Kz&{^LT+x7kY|RT^Cs&y*bsps%^fH8MMcs;j-Y10c=NtB`H885|wE} zI!?!SC~j@kN)``$h@=b#an~}*`!ewUprd5|1(DIxa+Z&@NVx%)+w!chCA5FdlZd8& z9!$GuP1Rtw{7a5l=ludf|L%z%i`WPYh+^xJDw{~%da?g!fVAwfirD(;eMojMgtj;) z4vJFyQEBt-B?GAsP4c((!&Fd2yX3aeQIO9wtGM&K5Q z`qc5oC2W;1h?9$KhrQ?JoWX>PrM1WhZ0bc8r!jZGSyG4G0wfNPW}rOCe#Z1-c*Al; zypzwD{TS_u;Y))FT&jlkTOa-HaemXVpsdzYP7A{-^Oxpd{A@2+uBaV{8K{@tJ+J~w zTc~C3H=szJy4(nHVJmyAXpK9(if!l-uo&)Ws4%i-LF;DWjndseR$NwZ`Bw5^@oV}> zW?^iR&&YJ%1|o*rh6R9*T~M&XQNbj645tTZkwZVV*VR{vr;IkBnCVW`qr>4?@0O1E zVkwqvXbi7k*B*}0_Z0hwX9m2QaIe7xWd7XdtEG}%7}wszdfRYph8i;PA!q zk4CWgY`|Y*M>=M;g!@J7e%)5otSk;aOY_8iE^in3JrI02Dw1k8Pb16wNgv+!KRwk- zpvp`I(cqDcDTkl7n-H5n<5MPm%k>f+(ft&96Y9`r$7YLz6$5ka>)sy;A~0s0@vYxy zCo-3#WH{y5^gUm{oJsl~3<~{0_O0kzYnS%8q4SZiP4}g&jm_P$)?O@@Pcz1II5Q2` zTUO`Vzlfz%pFqxW#oD4Ifbd-#@GaS-iQjPy5^1Se@M67B#>sa?`a@oF&2dwz`j451 zL+g+od_c9#_wYVEnsr)DXGYgGTOVPg1#rGD$=UvOuVqj(COn8~0GRs6fyXbA-x&dh z2I(^!e{nSS?)x!M{`yMcj5Si$mzgeuUeziu<4rkwGhtnt$WTwMqc9Y5;B`}6(o}^8Km7m4?raZ)qZcS8z<+9}zfep+59BXyhvtE7w&L~!w ziuqQwp92#_!o&BgkDOs~{^b*3vb!IVV0XCTT1PriYR=IBY`I{vi>$$ADcx7b#6VVu z#^>9<+}WIKM7#XSxY1a<+#bm@;(r)a(kPK?>{)wm@6H&rYGl0*2T|Qa4wwKtL^7J` z2Kh$=h1}<3&CIpZ;3TxnqXf`*yxEiW_rs*eglWvPxgix)of}GIf?VdycYnT=){BDbpln5Qs zgT6%BC~*Z*bx1mdo*J2|+?1PWvf8*0O|d`pk@wXjb*W*XF!lO~=?k?VlW6!zu?4W* z@FKZ#I|bw;;R(QK+3#e@(K5l?7SyXu)|-yAw0iCZg)^G=xAMQf)M8Yyvz0PpN#q8-Pj2*l0ivWEtBsR@+#kD{7$J&FeYn2TGxQ%`$G}fQ>u^Btye%VVQGu? zZ8IklD+jcZPxmZ$?kb~mf)7CSL@kM|MA}$0YZ+u>(2El5C*$shCnmdICW5Tw*b|^Y zz<-G}NO~AsNTvZFcz5G#Q_)L}dlY543{hSr4P; z-gBA?+#J<0{*ST91vzieNA6D2z^8ksIsggL&CU{m6U}=kp+z?xC(9-Unl55Jnn-u^ zCVXc4J9#`R5$}=Eh_nTji7XQd!R4nJs2G*TxLb&;&BhF@9j9ht>quN0JB55#p?}bV zGQQu?<8gwdAQKfwH?+?_5_2jlsKI05YP*wD|GYdKr+yjiBb83~Dxd7RMbF_ydJ3eU zxZ=HoBFqy(JNw6%1ypV2rC`e%lu2uV`kGm1r8`s~dWa*bFq=dS z*UhE+Y!@DfkGeyM=1K-mJP!{p;rHp|eiXH+wkDbucG266ES(7KL?k12=u{TiMo3~e zPF$hhDV(+NVt^zJ)HxQ!=|5vcarEE|TYkeHBUEpfTee}f2EpdrCiF!PFdQ2sCe7ky zd{8P$BE2krHQS(O#5#jvgwGe|{Q*yOphqSX%c@(1QGbT=FG8#78T5&lnuB7Y&>dl#W3^m6Ek_8j zr6g<#=4xJim8( z(tMbc#qgLh8Zv1MFEG5GU$r)?Z#GH!&s~gDBN`nnNB&68%v~s$W?an|w@K#i;Xxr4 zU2hkd*}*hWKnx{g?4|XZIy~XClf-<~86C;^n)>}v_g=t^UZCjC($n|7A_uV|JWUey zWX~bUWkuHKY^UBt7p%r1Yffi1q|YgOHcq%=d|jd;!!d$fS|+Q+_T}9eneS$7B0m;< zCSSSRB(#)ecmemNh)bw;~BRjt>MFa8OMhWg`TiL=k@(51-u$bchs}97v;u zb|fnXh%bbO9co~c`B`I6Av>zViV4Qm#vXcI{i-5$mzpX(Qux#M^R?Z5~(M z924z(S~P2?9c;jYI1=UH$c$vN9z-kd)yEs#_O+m$h`Ooj-Y3a`HLq~lOnIz#4~|QoE0FXR`SWu; zgRJCsnZ@b2?k|%5P+=A)Z+uczI@SQQj^fvw{ubG->}VU39UPRU@7{bHVcnW18r_yy zsqaBn45d*kH!&;!`EgiX9blB2T98J##FC}$Ux{EW=0yS+5}A@xhHv&w2x$LCv0po# zu%D~FxvMHirJL?;M_|!OZ!P#n0a$9#c;`p@^s{8u@MeVxmiLdOUZ**r439KkeT=aO zy}~q9`fIo-gDQlO=^v#(o$GhlwtZ&{h2N}pA9A@M0!9zV$tR}~m-%&ceuLHE=ofll z%grz4FVkEqDrOVxJVCz+4JmGRH<5{V>7j_;3J^GK%z&58-?B0%Hf( zlDtZRBTo96j`ky;qH_wgTdQte#O?J(=MF01hEv9ixzO>f+=G?rU|p?c93G95QgK@r zE;S`W+&>6F5e~w@tZFhf<3OtlbHn8HVhs+yA=jNaj*0FA9e_Ky_D1EW-tITeVT}yN z1bFaPcX>9CF%K+i-v979m;leK+Ol|;ylOorZrE+nf-k@-ZmV1}$jtfU$o1BhS`+yh zMh%&J4$M6bM@n7AQut`u%0_Iv4rRh_O0mXz{JN7g@It9(*eqQJuZJBA9kzL;%wz-#zh zK>oA3^HX3l(pM zTxEm79FecD<3=lEf+vjW%}$YxE?@v5C)7LK*pZFl@x;?=q=P4O6j#MK72FOc${N>W zT)@lEUL?}U53*B#d^t@!S-&OcY&D#=Fx|)NaHFEJ?h`k+%A0a=WxhC{G)~3qEeLF% z@3+`uZy_0hy? zh-eN(7L8r@`P*|+s$PBCY~93ty$wZ5eo|w({?LU4wEE|>gB2zPmj@5md#_R7gR7lK z^QpmZjhqCdCBcqzCX_a?-FIDfZKTfT>(~X??4RM<-9HNCFTn4i7cz)+)+L(`uT)OZ zgSQJ;&22eV?9f(<23uU4tgB^Hk5~m)c~SqJVA-u-W4hfIo!BT5C=a?g@CdpTBnaa* zt6*fI(*6inKX#BFq`m2}O*1(t-Ps(uJ=DS`rwC*D^^olY(*ScXCpR8hM-41c&?_U& z;EH9!LU9~*7Sk1T1~(4}l?|o3KlV~>b!at_;0W^oVCvq}j2~zxLy%GODNg#vJcJ7f z{8PmincPA_ii70844u+c#38oR3fAV{WE3F_ocF(3O63h>99r)<7-(4Dg{{+p%NuR~ z%qp%p(RKR7rTmrMz0d}_1roXJ-6v&b@)tc{6|g34|8_riXey+N%5&9-b7~m7=Gonk zZ6=2Bbz1)A<*mc6VO*RbHkU!OKn?m~Wtfdsiy%pN5i6iYka&^jXaZp=!t(Qr-Lv^m zs$@K%uqi@D-v0`u+Hr}8eW|YIq{%*Q^;2Exu4iDo?}3-11VyeGIzP@SUtpZ=f>WKm}IB%W+%*tkWXbeZ&<2xjvTt5A;P>Ei{m;hVza(VjBCddNaqJ6| z%>-0<;BEwcr;^`?+A7my&SIkteTLu$0fejVWO`>ac2=!h_=Cft)3gM{ACm87cei@H8=*rQAsr78NQZ;)u6 zNVED3->sGtNL{ju0@hGYSTN~)Y(40U{=WOIYC}LwK_)%=u`ozMZJzuyzwHfs{rwXn zIn4ZnW0b|QQE4~UG{IyLX79?CzDoZ;+B?grwz{p~mlO$7T!LE*MT5H+E!IMDcbDMq z4#nMzwz#`fpv6jYFTvei-_UcO^WOW8amW37Kip4A_SkFg|C)2{jO;b%{Dp`=+LWKR zc0VnG|M5ugt5POub9W~KI|Ea5bQH$gdf0bnr(hB^I8&#iyEU6shf#I=6*SMVGl&l} zZB&h580YYs*!);`Tzi}gV*c=%syHFn@!M3}*m#(0zXKPI9L!-mBJhq2jU}r?;jzcd{+2QAA*=hZQ zWUmDYSk}$6j}sJU{1LFQtP{PNY|YBW=-2qEscs2N#@Q5}83YPFw=UIqMN1TmG2(<6 zdIFy9vHm6)+I7vM5G{QPF^rx)vt6de7%v&_&?hp@<|gDHzg$^?GOlOyNOa3a;OR9C zlOQ3$Q?StkkYBE{P;nAkW6(}=!55v!bl;Zc^Kko!EYR=5D!VsG5R6{G2AT&CZDyy` z1Zvs$aD3hi|EAdH_w8X0NDhjfBz|gHGs(v|p|{qpCBU(jsfSMmO*exDLZESp0v^C~ zUe}ccv|h29WUueD82jz0#dPF%Sb_P+m7&Y565|3@8K5-8bVEh$<8#MUOxg0`4orxh zaFB`BXEenV-Asyv-CUYFYbtF`-TrJZ4n`_m+X}vYVQ-?qo?cHjT&{u9CKjQn1ZpMO zW%lUVC)+=?rhWsT$tvz!9`s4|{Rq(aBh|QVrI?sF>=S}P_-a9{bFKmePpPcSR66J$ z%z#Uj6xwl4O_P7+rU-enj?CqVal%Zr&_cTFzuE%LXF;#o^2=h0#gKyF2$`nF-B<6e zUPZB~t&s^LD8~zNu`YR_gy_p>)2R`IOxD6FosKe6P2O7_zNGId3MG&d$kSV9A(YdX_NXS{=&dk~fzjEak;=mJ*R{{-No zD!JgK=`?AYpnuY)Bf`Eg!BaKci5(WKD`@Oi{L*)U^x_4j{4)!{>es>|?SWHnUw{U; zILm}h!FU;oI&tE4kkr@Wr1HNhq^g)t(0EpCYG-_Y9f!Qe1RRjl(C^Pw8j4DI6fOE$HbzL!oz)r8IF~(U~Toh>E_G z-3H8M_b1qhRw1vW0)a@a-jH@-o?2V-6|pgy%82Csbz~ZE1@EcgH0U5ENv=qrf0OE< zzR_`t1}9(F(}97bjV-rv+Vy3jR*Jq=MaxPRfLQo`mg>8m@`D2hH2!F0OV5M!N&B7# zzx}@DRDfgZDO$kwd=^<*PuFXsJlc8?x~t1#3Yy+uo~W4vg%V5LIft3)gE0F0;=b`F zFi0J?p37ryW5NRj1R=JoFUl5E{H>%u@5gdwmMirKz!Hv`;SI${eQf!E9Q4S+*YT!X z=N9bwE_d>3M&P+Yo5i|Ud|Bvm>*xo|t+w@`)u&`H|NOe`1UkBEVcTXXy~$HoH?^DD zPo<`&?GJjDQscSe`@;6IAO{qv^!J@dA)%(ndH1kLXN5l{gCglS1AxiZR~dLvwxE8i zNC6z$f8|dkd|Gwe3EUTosOG`s{L@8ggda}hS#4Zu%IW9dlqYJB2tFN~qD5SEK|fm* z^?C0z+m55XdRN&{#LzQ?!Ppf&DQf@gPYk2{CwZN5r*k`FNDjSr2dig^rgDm%Vir^X zPFrn}&*bz>#%0C=9X)-2rIrg-M4j(D#5cM1AC;zD6tbDCwji9qPK`GZG^82SOmm*dsO6dZasADU|jD+h1nw^@Rt&H^_DSRqM-TejcP(DW^d2 zW~i*wPjqJ_%O?BEN$;EX)A+y58rvl~3+tfQ@Qws-$76Y8 z3Pnua+)`3qk4e7KuI(@CoYdeK!N%!UPfe{q*P_GtTB3#{?}4I z+CVCxC80@|UC#)JbT0KU?4BK#WMLT`*4Fb{ijpL_=FPL$(6REtZ)+nWE+w>cjxqc2 z*s(3FUTaIetaHk%`gok+Q8KmA!sn=`EiHXuaXv$5baGI^ft#S!oh>Ke)9-&`?*vP{ z{jQ8Xuaw0Efk>j_sy|+{3AW45yB0{oia`TdAzY`I)=eZsBO?f~zI)&S9=x7j;9U*P zKw)jU{~3+sLVCcxH>-y+y#P-|O&opc(D6fy-ej+BbG=j(8pv7j(DPU`Xdyk5;`8ZO zt?aIY6bnupQ!i(@4*W=fvnH{*V*}#suC@hNH^oqFngowhaS@k#?m*njr#gMHz?#gJ z6b?MPmt}nWSTPzgonfr|3ZsbCeg|beg`c4yj;?}WuHn?Cm18J%k+pSCVuNSSPB9*= z?#;Lu4nPN`~79Z>{>G;0bxkdE-1FaBb&BaEDd@IS0^u9E#+kNrrGOLg3SHFMuMt}}dVp`!~| ze}8}axaS~x%-vYHcH2EaKbbMo3ki-PbbG7<)aY=LKO(-v#9X*X_ot;sE>$=leMV+z zAXGD2S8mcxJs*o!mceQDYqwT|-NbPGpC>2CMQf`{5xT!e!eObZGW9OY^fs*I)F{e) z4s0ZD&X^bV``?&?Q{1=e>b6Ys)$`R=)m6Ix$pf_(d(lZDdJ*Dy%Mf*3&RfP91;sK819yte+lb4C|>F0}JwW z#m#V-=ibRl_EQF4;h&}~r4k}|jsq!c3;9kDd&o>nN?&E`qi|MSq(X#b(@m$|p?PLo zASb1$t&Bk#?`uqum=Z_Czu+~@w=@Y`@>`=QDcWQW^5>@pR;6T+5TPz;^7F|T1$R0s zAwoCEXYwlEbPSSu>&u_V4E+4tjgb{xM$?g5xG=6Ln(K&p?Bv*sN+92RB>aRP=pjWh zE}ZK~bhxVOARBS=Gr8RD;S{wS#KT`b9!Y>*om@s&(g>v#nabo;8BOZ>rNuDaCe1$w z!)}#EE^CzlQSBtkzTmfMjzU!Fye?VX#O)#4K^UPI{oT#3 z&<&$KA|^ebQP2cPzGq{Ru!tjciBjk?P_aYI<&w28i|T43N$!2y&*{eytIa&$%tDQ> zygs`xEhQoN<C~%y2?8vdWZd&dWcA_pr0g<(>(rd$})jj50k+p{*KEOVE%%W9hrMyZbZ7jqvgAaDe9DLlY%d9=zO?A%BuTyTb zD_+B|&nn-1*EQmLXjxh$=*tdVVx6XDxZ}~KlFZ`l)1;pfcUtUVUwUpgbpAwZ)!C_i zLc089-rQ_!^9H@qCGukYDa4Vb=iu+X4WumA-IrfGc5<)FO7vKNQeczp1U zgyV4E-^DnBP-BtcBl-&Wmc3WLdDXKKqd=#9d+R}IB8}~Ccftu(R?+cSvGQRfU6@BM z;6&>d^*^Sld_A9*qMJC)@HR|f1iove(EU>ELT1#aDIq1@;HL~oBHhqc5v*LR!ddTj z6j=Cmf^GAav9jQ;cnFkaTvhVox57cIA$ab$9pwa?6pc&g^<`URmF*uPFW>E4YS;QH z?={HDwOi)sW@Qf2!Tnijd54qI2h1vRI3I3shdmLqRt-tc;bQPjZ!0bJPa}Sf4}K;y z!_}#}_2hJ0Luq_GWTmR!l~IjFsxiKum&_q(3L?5bl+p2~rQNP`HzBh-f~KNYQipUB zO>Jg_i3)a|?8Hv0(0IY##r73^oKIIz4|-#2r^6Ba4sUyOl{xH1NXVL>FnHWgakKUA z^)?6%f{%Mz?ShL_l1kfY=nZ42tT4`xx1@V<#C}IMY=P4v=73bf0Bw?m(THj z$puZvo%zKZhuy`bdj&1VUn^f)YVL2L z`THaOZrz?5V(tnh<~GpTG*EuZat|HoUW3A7otYG*;WEuY`*4U2e|vocW%Ae-rlq?{ zDJx^%c_+m&XaxN`v8CWToC85)S3@lv3b5ny!7gn4uW@t#EIftqls@xbnd}?vT z&=9@c&Te#Rsm4lGz5R!g8J$KdZN9^#sXc8hECYPZ=3-WFv;nU_RwLBu#1ebz#*XEO z>wIOdO(uHRjNtxP$SM;$VRM2;%*Kmn_LY6P;tQxUzcP4wjH&XZm_{wLmk{xIKlIqQ zFx%;{MlKI%ot#9I7I3>Ntok@UxswQxk)^OF+}Ior=f`%S0-2-t7vWWxIffa%L-gW8$2%e@RnA)n0R>py4|7? zAqVp}wZxxTS(p*Q0vEY-OY;-`sZf~}Jw+OorZ(sV9)}h*`~(770-(dX5bYiri*cFp zOlRNXmJocO+Etf7+O|<9+brR58DzG76`0lZQPb$~aCRiC(Xg19S|{?GB)n%(&176VZ%jV_TYd4`eU8Q)r^z@>kc92JZtK37 zm$R~9YUZ)%$Rk`a1>Z`Q2jFGu;7n5}Ie6Xk`po2gXY3KJxt37K@ZrNJYe4ux;h&pzD-;=BE4c~kH||wC zZ7un<_?xpQM(T~-Y=iWkb+F8d;(IP#@$J2X&$(S9^{ErqOEScd$FL^(`3(XCCii$Z z>pm0`AbyI&8hj}YPJ&PBUJUsp=j-fd1UAx&ouesFu%5c-0L={v0h~&c_HiE(iO`7h&{ixeUF}li z+9gQ@#r=H9tG8d?Ix=dXI)dRHun4Tx{iL+n@3?#(I%TB;i6h>nNmXs{gzkrI%lW`P z-i+^o#=yz=x9)2%Bu*J7g2Ij@Dt1HAY|S%};FRjtWdxa!S>VKIFXB<~4+;x^HW z8)9PaZ_VId;|PxPeq24vq@Og$IUb^;6%z@PrEO7naY|bHeuIRNUqF%LkYJkD^WiKe z{N0Df*T>>-5U}PvbH5+~xlfZJcT6)3n;+iy&HF}JYK78|E94CFm)^T|eYeWfK)08Q5+vSSrOg*Z=}a%}5uEGvUv%*c1`aD=1{BO>k63 zGB_E&QP>flTegDX=GvuYghX=*;dw?Mb~82&U=T2Y$Eg_*4!PoEsxtIX-+V1LTl2M( z8Bv3=>1qk|XH!Pc3E#WKYSWeE355t4`A)|dO3$EjhPdEeeYu>srs6gT5K&7AMXp~D zbbUZqY(J-=e~)I0OJA!g6?d<_Xrtj_siD!8V(sV|98A6S!|r{OP)EnxV(9=mZ;z{< zgT`fXQ`~t%pyLgNFu`})0$5kd9PJD-71AxykmL0s19MjRM{21L@{0^fO>LLz@~+WL zNat=rawPb%n8$++P68)WY9Nt4`O$Flu;10Jq$N}3`FHwOF6dmbPkX)VMxN7SqHc$q zH^6$@vS!Dw1#_@-y~@p~=L`oQBQGV;i3!lm5q!Pae{h{f)s@Bm7RxcDsOwj6zB0dx zrq1V$)`@C^Cpfu?nBJE-QdBj>&B1%0SPHArMg7`IVK55Tn|c>@sDrg-BNlUgM?yJ4 zmgTRLzUgec-AoUos;twW3GT%acV{d5AV=o|K4N`2zC;BmWU7n?a!%PU51#xHzQ;r`J7qDulyi`oCg^zR{U}mI z;_QI|pZF=4aV*O^(Hpv}5QkhoI71MBCnd~uRvz8O+xVs+PA?gPnR6r*w1yk?=9x_R z0k`*=O!%hzOSw}Be2UG0L)FzagoFnYpVx}Gdiv!hL_-O1|MNgkkVxck-oFk)`PX5hy?s}H6L)=q3{;(5Vps((2!!~VkWx6P7v_ZwTCsl2FY3h$?JIVn&Dj#P52YYt*BT1)eEK|xcIy~3Qj(v-n`qcg?5|i4|wZC4m06v z()=!HgagqDSrqmb4pbHIWhfd2v+RbZ--i{XQoMkn6uac@d5BZb%=Gmc&t)ERTiq2R zV|9c1;ie6}}o4jtUBWZqP!Xwk^Wf*ZL zqqQ$4s<}u{zana7Yia(a2z--xBq8Ty=c`xaUzC%Bu?lz@i%YafwQzQbQo%B`bTK&C zM1l?1;6Cqt%ji>p(I1jOXME+1h;<&1QnXVe5`TVUf+wfxr+c10N;_d+}UwO6$TF|E}p%`W~-^X%5;;=9PkWIWkuXvJ&6K&@q%`ZTUyP6a9@ zH!L<+LTyhc4)@Nm2j@^Or$M_>I?n)+t9O28(mdzjr$-JSo;gJ>TxN`M0INz9BNa5B zE>`U2)i^Na=a@2?=y)nJ#Ra1g*j z1LLGNU`qd~B`;RU`KWM`925NC^x0fTEEss!@g#W~9TP^Qyx=~|MVQ2v*& z8sGD|{o`#SCw4ku(*M zr=uDd`yU%)yg*pkczI+Q0{oVMv*Yxo!4j=yRFqo(z;R()2G2t5lU1LEn7=PAQ>B|Z{77|NF)U+BR))c@_c6Z&)9&_~B3{yUb>BXMAUsKL?Yfbn>rDZ2k?5!s@E`RD(e z|35irWtw+H8n%G{I!%z&KRul&F)^8rrKzcf;w{AsgkXsuFiPLXMv}BN=!Gyjd15l* z>9)2uCJ9I%P74O29b{lg;!xuwHy6;;Qw!}`#eS!oh29Spazl%YkzkK=QSQ4d8wZ8^R!?}zpXfq8+R1Fw!KpFD#qpz2Y!idzK2#yv zCW*Wfp+qHjOK)T$EN4JkAoBC-(N1@sEXAE zq80MQ_ap1IIuO!?Q?{iRT+-;`)ci zzrJ7mUBpC+*|*JRg97LTUW0tw&P?4r2lfCy}+iA*KW?71YG1LSuQs;u!@_%*q zUXt=BP25Nnj_vJ*H{yH8MWk56nBTb&_;vZ;JX{ViT=#Q0asx4sFUO&Is70_e%E3$` z89}yhg@iLse^HPAz39(dzQkk@K9;6&{L8;GtYNoT&8rWuW&Sl=hgZ=w6^{TZTIZ>sIndnjz}E^D=*;N-;-pUB zQ$eDl2qj*#s`J^?_$auyO48CJL~J0wb-|(#@e?tF4+$xWj77tp#&ExTGqVFvG zJg6Sw}kEY}>HZ?oLfykuj3zcKGEndw+0Ue4{4K&N0d5TeXm?yL;h@uub#S z#T48O5qagoFfB~@J|r*pT5Y6rOv93CJ5gIu`$zHjrkzI1LQ zTowsh-S`j{Vql#y8VvtDT^0Xw+;4$W=w@q1TaT?0wL<9!VAra-lT-H&92hSj@3`^n zr*|2D!-M(kb*fx-1r`qE=l6dP7QiC%e>p+-SeCO686My5 z`)58BVSa|Z(o{jB{~4kvQcVJ;rK0-x^e}<238TjY4gNFX?>HYA2ZqAK{u+F?699ah z9Qaxc^dFrku)E>Jfr{$i7k%MR0rS!SlQR4}qiiL&B%)}$VSmW-LPkPCyh2Pr;J*N4 CS_NkS literal 0 HcmV?d00001 diff --git a/Docs/static/debugger-principle/state-table.png b/Docs/static/debugger-principle/state-table.png new file mode 100644 index 0000000000000000000000000000000000000000..f0cc70c6b2f0e9f07dc6698f61b55e7892ca4338 GIT binary patch literal 53790 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≫cO#Wj@P`uGuCXX{n`WNQ+@R9X<% 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%0A5dYYqx$kC~foc-*$ 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 Date: Tue, 16 Jul 2019 09:42:19 +0800 Subject: [PATCH 048/431] =?UTF-8?q?=E6=9A=82=E6=97=B6=E5=8E=BB=E9=99=A4?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dataProcesser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dataProcesser.ts b/src/dataProcesser.ts index 5c540c0..f1bf33d 100644 --- a/src/dataProcesser.ts +++ b/src/dataProcesser.ts @@ -49,7 +49,7 @@ export class dataProcesser { for (let index = 0; index < dataProcesser.orderList.length; index++) { const element = dataProcesser.orderList[index]; if ( element["timeOut"] && Date.now() > element["timeOut"] ){ - dataProcesser._runtime.showError(element["callbackId"] + " 请求超时! 详细请求信息可在 Adapter/log 中搜索此id查看"); + // dataProcesser._runtime.showError(element["callbackId"] + " 请求超时! 详细请求信息可在 Adapter/log 中搜索此id查看"); let cb = element["callback"]; cb(element["callbackArgs"]); dataProcesser.orderList.splice(index, 1); From 712d4bdd2a534680d7491033e53884b5861a5a74 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Tue, 16 Jul 2019 09:47:23 +0800 Subject: [PATCH 049/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/Manual/debug-on-phone.md | 2 +- Docs/Manual/quick-use.md | 2 +- Docs/Manual/update.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Docs/Manual/debug-on-phone.md b/Docs/Manual/debug-on-phone.md index 028b56f..dcf65a7 100644 --- a/Docs/Manual/debug-on-phone.md +++ b/Docs/Manual/debug-on-phone.md @@ -1,4 +1,4 @@ -## 真机调试 +# 真机调试 [TOC] diff --git a/Docs/Manual/quick-use.md b/Docs/Manual/quick-use.md index 2811928..b30ff2d 100644 --- a/Docs/Manual/quick-use.md +++ b/Docs/Manual/quick-use.md @@ -1,4 +1,4 @@ -## 快速试用 +# 快速试用 注:VSCode的调试插件机制是: 当使用某个插件调试过一种语言时,会导致该语言的其他调试插件无法生效,请先禁用之前的调试插件并重新启动VSCode。 diff --git a/Docs/Manual/update.md b/Docs/Manual/update.md index 077bfea..8c23ff6 100644 --- a/Docs/Manual/update.md +++ b/Docs/Manual/update.md @@ -1,4 +1,4 @@ -#升级说明 +# 升级说明 调试器框架分为三部分 From a44e390ea29a6524463c5a85d9613db192cd063b Mon Sep 17 00:00:00 2001 From: stuartwang Date: Tue, 16 Jul 2019 09:59:30 +0800 Subject: [PATCH 050/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/Manual/access-guidelines.md | 40 ++++++++++++++------------------ Docs/Manual/debug-file.md | 16 ++++++------- Docs/Manual/update.md | 8 ++++--- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/Docs/Manual/access-guidelines.md b/Docs/Manual/access-guidelines.md index e28736f..7423a73 100644 --- a/Docs/Manual/access-guidelines.md +++ b/Docs/Manual/access-guidelines.md @@ -31,17 +31,13 @@ lua调试器依赖于 **luasocket** 和 **规范的路径**,需验证这两点 ![string_path](../static/access_introduction/string_path.png) 下面案例测试不通过,原因是仅输出了文件名,而这些文件其实不在同一个目录下。调试器无法仅根据文件名确定文件位置。 -![filename_path](../static/access_introduction/filename_path.png) - - -更新: lua中允许使用`require("a.b") `引用子目录中的文件,在标准lua库中,lua虚拟机会把路径转化为 a/b 传给调试器。 +![filename_path](../static/access_introduction/filename_path.png) -但是有些开发框架没有做这样的转换,调试器会把收到的a.b当做一个文件处理。结果是导致调试进入require("a.b")的文件时,报找不到文件错误。 -这个问题的解决办法需要用户修改自身框架,保证`require("a.b") `调用文件时传给lua虚拟机的路径是a/b。 -或者参见 [issue #24](https://github.com/Tencent/LuaPanda/issues/24) , 在调试器中强转换路径中的. 为 / +**更新说明**: lua中允许使用`require("a.b") `引用子目录中的文件,在标准lua库中,lua虚拟机会把路径转化为 a/b 传给调试器。但是有些开发框架没有做这样的转换,调试器会把收到的a.b当做一个文件处理。结果是导致调试进入require("a.b")的文件时,报找不到文件错误。 +这个问题的解决办法需要用户修改自身框架,保证`require("a.b") `调用文件时传给lua虚拟机的路径是a/b。或者参见 [issue #24](https://github.com/Tencent/LuaPanda/issues/24) , 在调试器中强转换路径中的. 为 / @@ -94,9 +90,7 @@ launch.json 配置项中要修改的主要是luaFileExtension, 改成lua文件 ![cannot_find_file](../static/access_introduction/cannot_find_file.png) -不要停止调试,在VSCode中找到报错中提到的文件,在其中任意位置打一个断点,之后在调试控制台中输入`LuaPanda.doctor()` - -LuaPanda.doctor() 是一个帮助用户检查错误的命令,可以进行路径分析,给出建议。 +不要停止调试,在VSCode中找到报错中提到的文件,在其中任意位置打一个断点,之后在调试控制台中输入`LuaPanda.doctor()`。这是一个帮助用户检查错误的命令,可以进行路径分析,给出建议。 输出结果 @@ -104,7 +98,7 @@ LuaPanda.doctor() 是一个帮助用户检查错误的命令,可以进行路 format是调试器拼接出的文件路径,filepath是文件真实存在的路径。 -这里其中会告诉用户format路径来源,用户需要对比format和filepath路径,调整launch.json中cwd或者修改VSCode打开文件夹位置,使format和filepath保持一致,即可修复问题。 +说明中会告诉用户format路径来源,用户需要对比format和filepath路径,调整launch.json中cwd或者修改VSCode打开文件夹位置,使format和filepath保持一致,即可修复问题。 @@ -131,9 +125,9 @@ LuaPanda 在PC上调试会默认使用 c hook,它是用c重写了debugger的 ![getinfo](../static/access_introduction/getinfo.png) -如果提示c库未能正确加载,可以使用`LuaPanda.doctor()`命令查看详细信息 ++ 如果提示c库未能正确加载,可以使用`LuaPanda.doctor()`命令查看详细信息 -c hook的源码放置在工程中`Debugger/debugger_lib`中。以供参考 ++ c hook的源码放置在工程中`Debugger/debugger_lib`中。以供参考 @@ -167,7 +161,7 @@ c hook的源码放置在工程中`Debugger/debugger_lib`中。以供参考 打印所有断点信息(已包含在getInfo中) - ![get_breaks_complete](/Users/stuartmac/LuaPanda_out/Docs/static/access_introduction/get_breaks_complete.png) + ![get_breaks_complete](../static/access_introduction/get_breaks_complete.png) @@ -191,24 +185,24 @@ c hook的源码放置在工程中`Debugger/debugger_lib`中。以供参考 "name": "LuaPanda", "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", - "pathCaseSensitivity": true,//路径大小写敏感 - "docPathReplace": [], //路径映射 - "luaFileExtension": "", //lua文件后缀 - "connectionPort": 8818, //连接端口号 - "stopOnEntry": true, //建立连接后自动停止 - "useCHook": true, //使用C调试库 - "logLevel": 1 //日志等级,默认无需修改 + "pathCaseSensitivity": true, //路径大小写敏感 + "docPathReplace": [], //路径映射 + "luaFileExtension": "", //lua文件后缀 + "connectionPort": 8818, //连接端口号 + "stopOnEntry": true, //建立连接后自动停止 + "useCHook": true, //使用C调试库 + "logLevel": 1 //日志等级,默认无需修改 }, { //单文件调试配置 "type": "lua", "request": "launch", "internalConsoleOptions": "neverOpen", - "name": "LuaPanda-DebugFile",//单文件调试,请不要修改 + "name": "LuaPanda-DebugFile", //单文件调试,请不要修改 "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, - "luaPath": "", //lua.exe所在位置 + "luaPath": "", //lua.exe所在位置 "luaFileExtension": "", "connectionPort": 8818, "stopOnEntry": true, diff --git a/Docs/Manual/debug-file.md b/Docs/Manual/debug-file.md index 1dea9fb..0f8012b 100644 --- a/Docs/Manual/debug-file.md +++ b/Docs/Manual/debug-file.md @@ -26,12 +26,12 @@ "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", "pathCaseSensitivity": true,//路径大小写敏感 - "docPathReplace": [], //路径映射 - "luaFileExtension": "", //lua文件后缀 - "connectionPort": 8818, //连接端口号 - "stopOnEntry": true, //建立连接后自动停止 - "useCHook": true, //使用C调试库 - "logLevel": 1 //日志等级,默认无需修改 + "docPathReplace": [], //路径映射 + "luaFileExtension": "", //lua文件后缀 + "connectionPort": 8818, //连接端口号 + "stopOnEntry": true, //建立连接后自动停止 + "useCHook": true, //使用C调试库 + "logLevel": 1 //日志等级,默认无需修改 }, { //单文件调试配置 @@ -42,8 +42,8 @@ "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", "pathCaseSensitivity": true, - "luaPath": "", //lua.exe所在位置 - "packagePath": "", //希望加入package.path的路径 + "luaPath": "", //lua.exe所在位置 + "packagePath": "", //希望加入package.path的路径 "luaFileExtension": "", "connectionPort": 8818, "stopOnEntry": true, diff --git a/Docs/Manual/update.md b/Docs/Manual/update.md index 8c23ff6..646e99d 100644 --- a/Docs/Manual/update.md +++ b/Docs/Manual/update.md @@ -2,11 +2,13 @@ 调试器框架分为三部分 -+ VSCode 扩展 : https://marketplace.visualstudio.com/items?itemName=stuartwang.luapanda ++ VSCode 扩展。 下载地址 : https://marketplace.visualstudio.com/items?itemName=stuartwang.luapanda - 如有更新,VSCode 会有提示。 + 如有更新,VSCode 会主动提示。 -+ lua文件 : LuaPanda.lua,DebugTools.lua ++ lua文件。 下载地址:https://github.com/Tencent/LuaPanda/releases + + LuaPanda.lua,DebugTools.lua 需要用户手动下载最新的文件,替换工程中原有文件。 From b6cec30937700611624aae990c5d128ba3dd73ee Mon Sep 17 00:00:00 2001 From: stuartwang Date: Tue, 16 Jul 2019 10:02:46 +0800 Subject: [PATCH 051/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/Manual/access-guidelines.md | 5 +++-- Docs/Manual/debug-file.md | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Docs/Manual/access-guidelines.md b/Docs/Manual/access-guidelines.md index 7423a73..1b8fa35 100644 --- a/Docs/Manual/access-guidelines.md +++ b/Docs/Manual/access-guidelines.md @@ -37,6 +37,7 @@ lua调试器依赖于 **luasocket** 和 **规范的路径**,需验证这两点 **更新说明**: lua中允许使用`require("a.b") `引用子目录中的文件,在标准lua库中,lua虚拟机会把路径转化为 a/b 传给调试器。但是有些开发框架没有做这样的转换,调试器会把收到的a.b当做一个文件处理。结果是导致调试进入require("a.b")的文件时,报找不到文件错误。 + 这个问题的解决办法需要用户修改自身框架,保证`require("a.b") `调用文件时传给lua虚拟机的路径是a/b。或者参见 [issue #24](https://github.com/Tencent/LuaPanda/issues/24) , 在调试器中强转换路径中的. 为 / @@ -178,7 +179,7 @@ LuaPanda 在PC上调试会默认使用 c hook,它是用c重写了debugger的 "version": "0.2.0", "configurations": [ { - //正常调试配置 + //正常调试配置 "type": "lua", "request": "launch", "internalConsoleOptions": "openOnFirstSessionStart", @@ -194,7 +195,7 @@ LuaPanda 在PC上调试会默认使用 c hook,它是用c重写了debugger的 "logLevel": 1 //日志等级,默认无需修改 }, { - //单文件调试配置 + //单文件调试配置 "type": "lua", "request": "launch", "internalConsoleOptions": "neverOpen", diff --git a/Docs/Manual/debug-file.md b/Docs/Manual/debug-file.md index 0f8012b..15a0a6c 100644 --- a/Docs/Manual/debug-file.md +++ b/Docs/Manual/debug-file.md @@ -18,7 +18,7 @@ "version": "0.2.0", "configurations": [ { - //正常调试配置 + //正常调试配置 "type": "lua", "request": "launch", "internalConsoleOptions": "openOnFirstSessionStart", @@ -34,7 +34,7 @@ "logLevel": 1 //日志等级,默认无需修改 }, { - //单文件调试配置 + //单文件调试配置 "type": "lua", "request": "launch", "internalConsoleOptions": "neverOpen", From 94a3e2d97dfd5e48aaacd19517e2cbb26f4c89f2 Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Tue, 16 Jul 2019 15:25:58 +0800 Subject: [PATCH 052/431] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E6=8E=A7=E5=88=B6=E5=8F=B0=E4=B8=AD=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E8=B5=8B=E5=80=BC=E6=97=B6=E4=B8=8D=E8=BE=93=E5=85=A5=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC=E8=BF=90=E8=A1=8C=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debugger/LuaPanda.lua | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index e377471..b50e046 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -2442,11 +2442,7 @@ function this.processExp(msgTable) expression = expression:sub(3); expression = "return " .. expression; end - if expression:match(" ") == nil then - expression = "return " .. expression; - end - - local f = debugger_loadString(expression); + local f = debugger_loadString(expression) or debugger_loadString("return " .. expression) --判断结果,如果表达式错误会返回nil if type(f) == "function" then if _VERSION == "Lua 5.1" then From 9dc1ae05735f75b086490d9ebdd06dc3e8751bcc Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Wed, 31 Jul 2019 18:01:27 +0800 Subject: [PATCH 053/431] =?UTF-8?q?doc:=20=E4=BF=AE=E6=94=B9issue=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/bug_report.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index dd84ea7..5d41726 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -24,15 +24,11 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] + - OS: [e.g. Windows macOS] + - Visual Studio Version [e.g. 1.36.1 (1.36.1)] + - LuaPanda Version [e.g. 2.2.0] + - Framework [e.g. Slua Slua-unreal Xlua] + - Other information about your environment. **Additional context** Add any other context about the problem here. From c8954a449f6f213dc0b28321821a43c913a68cdd Mon Sep 17 00:00:00 2001 From: stuartwang Date: Tue, 6 Aug 2019 17:30:03 +0800 Subject: [PATCH 054/431] =?UTF-8?q?=E5=8D=95=E6=96=87=E4=BB=B6=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E6=97=B6=EF=BC=8C=E5=9C=A8win=E4=B8=AD=E6=8A=8A?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E8=B7=AF=E5=BE=84=E4=B8=AD=E7=9A=84\?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E4=B8=BA/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/luaDebug.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 3f0ad07..5ad01f3 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -181,11 +181,11 @@ export class LuaDebugSession extends LoggingDebugSession { if (DVerArr.length == AVerArr.length && DVerArr.length == 3 ){ //比较大版本,大版本相差1就提示 if ( parseInt(AVerArr[0]) > parseInt(DVerArr[0]) ){ - this._runtime.showTip("调试器Lua文件较旧, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda "); + this._runtime.showTip("调试器Lua文件版本很低, 建议升级至新版。获取帮助 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); } //比较小版本,小版本相差20就提示 if ( ( parseInt(AVerArr[1]) - parseInt(DVerArr[1]) ) >= 20 ){ - this._runtime.showTip("调试器Lua文件较旧, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda "); + this._runtime.showTip("调试器Lua文件较旧, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); } } } @@ -246,7 +246,8 @@ export class LuaDebugSession extends LoggingDebugSession { let activeWindow = vscode.window.activeTextEditor; if (activeWindow){ //有活动的窗口 - let filePath = activeWindow.document.uri.fsPath; + let pathArray = activeWindow.document.uri.fsPath.split(path.sep); + let filePath = pathArray.join('/'); //直接运行 const terminal = vscode.window.createTerminal({ name: "Run Lua File (LuaPanda)", From 7ea219697e03c2da7453e13872e13cdd2d32ce7a Mon Sep 17 00:00:00 2001 From: stuartwang Date: Wed, 7 Aug 2019 14:14:48 +0800 Subject: [PATCH 055/431] =?UTF-8?q?=E5=8A=A0=E5=BC=BA=E4=BA=86=E5=8D=95?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=B0=83=E8=AF=95=E6=97=B6=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E7=AA=97=E5=8F=A3=E7=9A=84=E5=87=86=E7=A1=AE?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/luaDebug.ts | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 5ad01f3..393584f 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -244,9 +244,31 @@ export class LuaDebugSession extends LoggingDebugSession { //单文件调试模式 if(args.name == 'LuaPanda-DebugFile'){ let activeWindow = vscode.window.activeTextEditor; - if (activeWindow){ - //有活动的窗口 - let pathArray = activeWindow.document.uri.fsPath.split(path.sep); + if (activeWindow){ + let activeFileUri = ''; + // 先判断当前活动窗口的 uri 是否有效 + let activeScheme = activeWindow.document.uri.scheme; + if( activeScheme != "file" ){ + // 当前活动窗口不是file类型,遍历 visibleTextEditors,取出file类型的窗口 + let visableTextEditorArray = vscode.window.visibleTextEditors; + for (const key in visableTextEditorArray) { + const editor = visableTextEditorArray[key]; + let editScheme = editor.document.uri.scheme; + if(editScheme == "file"){ + activeFileUri = editor.document.uri.fsPath; + break; + } + } + }else{ + // 使用 activeWindow + activeFileUri = activeWindow.document.uri.fsPath + } + if(activeFileUri == ''){ + DebugLogger.DebuggerInfo("[Error]: adapter start file debug, but file Uri is empty string"); + return; + } + + let pathArray = activeFileUri.split(path.sep); let filePath = pathArray.join('/'); //直接运行 const terminal = vscode.window.createTerminal({ From dd442c24625222d6a75f83e27313a3af96cad7af Mon Sep 17 00:00:00 2001 From: stuartwang Date: Thu, 8 Aug 2019 10:37:14 +0800 Subject: [PATCH 056/431] =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=8F=90=E4=BA=A4rea?= =?UTF-8?q?dme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 204 +++++++++++++++++++++++++++--------------------------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/readme.md b/readme.md index 1cfd0df..e912cdd 100644 --- a/readme.md +++ b/readme.md @@ -1,102 +1,102 @@ -# LuaPanda - -LuaPanda 是一个基于 VS Code 的 lua 代码调试器。设计目标是简单易用,支持多种开发框架。它由两部分组成: - -- VS Code Extension 调试器 VSCode 插件 -- Lua Debugger 调试器的 debugger 部分 - -Debugger 主体使用 lua 实现,另含一个 C 扩展模块,以保证高速运行。 -LuaPanda 支持 lua5.1- 5.3,运行环境要包含 LuaSocket。 - -LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉`为游戏提供嵌入式跨引擎的运营开发能力,使游戏研发及运营各自独立闭环,在游戏内实现各种营销活动和周边系统,让游戏分工更加专业,团队更加专注,高效产出价值。 -潘多拉为游戏提供的服务包括用户生命周期的精细化运营方案、游戏内直播解决方案、游戏内内容社区解决方案、游戏内商城商业化解决方案等,已经在大量腾讯精品游戏中上线、稳定运营。 - - - -# Tips - -+ 关于VSCode 1.33的兼容 - - 更新 VScode 1.33 之后调试器可能出现断点无法停止的情况,如遇此问题,请从master分支中拉取最新的`LuaPanda.lua`文件,覆盖原有文件即可。 - -+ 关于找不到`libpdebug`模块报错 - - `libpdebug.so(dll)` 是放置在VSCode插件中的调试器C扩展,会在调试器运行时自动加载,作用是加速调试。 - - xlua允许用户重写文件加载函数`CustomLoader`,sluaunreal也提供类似方法`setLoadFileDelegate`。 - - 发生此问题的原因之一是用户重写了加载函数中没有加入对so/dll的处理,加载so/dll时会报找不到文件,但随后执行lua原生loader能够正确加载libpdebug。 - - 查看libpdebug.so是否加载的方式是在控制台输入`LuaPanda.getInfo()`, 返回信息中有 hookLib Ver 说明libpdebug已经加载。此时可以忽略报错或在文件加载函数函数中正确处理.so/dll. - - - -# 近期更新 - -+ v2.2.0 - - 增加了`LuaPanda.doctor()` 命令,可以检查环境中的错误(需更新LuaPanda.lua和DebugTools.lua至2.2.0)。 - - 修复了VSCode请求变量信息但在lua中发生错误,导致调试器卡住的问题。 - - 修复了c库在一些框架下无法正常运行,导致程序自动退出的问题。 - - - -+ v2.1.0 - - 增加真机调试中对替换路径的支持。相关文档 [真机调试说明](./Docs/Manual/debug-on-phone.md) - - 优化了attach造成运行卡顿的问题。 - - 建议把LuaPanda.lua更新到最新版本。 - - - -# 特性 - -+ 支持单步调试,条件断点,协程调试,支持调试时变量赋值。 -+ 支持lua5.1- 5.3, 支持 slua/xlua/slua-unreal 等框架 -+ 在断点处可以监视和运行表达式,返回结果 -+ 可以根据断点密集程度调整 hook 频率, 有较好高的效率 -+ 支持 attach 模式,lua 运行过程中可随时建立连接 -+ 使用 lua / C 双调试引擎。lua 部分可动态下发,避免打包后无法调试。C 部分效率高,适合开发期调试。 - - - -# 接入和开发指引 - -接入和使用文档 - -[项目介绍](./Docs/Manual/feature-introduction.md) | [快速试用指引](./Docs/Manual/quick-use.md) | [接入指引](./Docs/Manual/access-guidelines.md) | [真机调试](./Docs/Manual/debug-on-phone.md) | [单文件调试和运行](./Docs/Manual/debug-file.md) | [升级说明](./Docs/Manual/update.md) | [FAQ](./Docs/Manual/FAQ.md) - -调试器开发文档 - -[工程说明](./Docs/Development-instructions/project-description.md) | [调试器开发指引](./Docs/Development-instructions/how_to_join.md) | [特性简述](./Docs/Development-instructions/debugger-principle.md) - - - -# 依赖和适用性 - -调试器依赖 LuaSocket , 可运行于 slua,slua-unreal ,xlua 等已集成 LuaSocket 的 lua 环境,也可以在 console 中调试。lua 版本支持 5.1- 5.3。 - - - -# 参与贡献 - -我们非常期待您的贡献,无论是完善文档,提出、修复 Bug 或是增加新特性。 -如果您在使用过程中发现文档不够完善,欢迎记录下来并提交。 -如果发现 Bug,请通过 [issues](https://github.com/Tencent/LuaPanda/issues) 来提交并描述相关的问题,您也可以在这里查看其它的 issue,通过解决这些 issue 来贡献代码。 - -请将pull request提交在 `dev` 分支上,经过测试后会在下一版本合并到 `master` 分支。更多规范请看[CONTRIBUTING](./CONTRIBUTING.md) - -[腾讯开源激励计划](https://opensource.tencent.com/contribution) 鼓励开发者的参与和贡献,期待你的加入。 - - - -# 技术支持 - -如有问题先参阅 [FAQ](./Docs/Manual/FAQ.md) ,如有问题建议使用 [issues](https://github.com/Tencent/LuaPanda/issues) ,我们会关注和回复。 - -QQ群:974257225 - +# LuaPanda + +LuaPanda 是一个基于 VS Code 的 lua 代码调试器。设计目标是简单易用,支持多种开发框架。它由两部分组成: + +- VS Code Extension 调试器 VSCode 插件 +- Lua Debugger 调试器的 debugger 部分 + +Debugger 主体使用 lua 实现,另含一个 C 扩展模块,以保证高速运行。 +LuaPanda 支持 lua5.1- 5.3,运行环境要包含 LuaSocket。 + +LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉`为游戏提供嵌入式跨引擎的运营开发能力,使游戏研发及运营各自独立闭环,在游戏内实现各种营销活动和周边系统,让游戏分工更加专业,团队更加专注,高效产出价值。 +潘多拉为游戏提供的服务包括用户生命周期的精细化运营方案、游戏内直播解决方案、游戏内内容社区解决方案、游戏内商城商业化解决方案等,已经在大量腾讯精品游戏中上线、稳定运营。 + + + +# Tips + ++ 关于VSCode 1.33的兼容 + + 更新 VScode 1.33 之后调试器可能出现断点无法停止的情况,如遇此问题,请从master分支中拉取最新的`LuaPanda.lua`文件,覆盖原有文件即可。 + ++ 关于找不到`libpdebug`模块报错 + + `libpdebug.so(dll)` 是放置在VSCode插件中的调试器C扩展,会在调试器运行时自动加载,作用是加速调试。 + + xlua允许用户重写文件加载函数`CustomLoader`,sluaunreal也提供类似方法`setLoadFileDelegate`。 + + 发生此问题的原因之一是用户重写了加载函数中没有加入对so/dll的处理,加载so/dll时会报找不到文件,但随后执行lua原生loader能够正确加载libpdebug。 + + 查看libpdebug.so是否加载的方式是在控制台输入`LuaPanda.getInfo()`, 返回信息中有 hookLib Ver 说明libpdebug已经加载。此时可以忽略报错或在文件加载函数函数中正确处理.so/dll. + + + +# 近期更新 + ++ v2.2.0 + + 增加了`LuaPanda.doctor()` 命令,可以检查环境中的错误(需更新LuaPanda.lua和DebugTools.lua至2.2.0)。 + + 修复了VSCode请求变量信息但在lua中发生错误,导致调试器卡住的问题。 + + 修复了c库在一些框架下无法正常运行,导致程序自动退出的问题。 + + + ++ v2.1.0 + + 增加真机调试中对替换路径的支持。相关文档 [真机调试说明](./Docs/Manual/debug-on-phone.md) + + 优化了attach造成运行卡顿的问题。 + + 建议把LuaPanda.lua更新到最新版本。 + + + +# 特性 + ++ 支持单步调试,条件断点,协程调试,支持调试时变量赋值。 ++ 支持lua5.1- 5.3, 支持 slua/xlua/slua-unreal 等框架 ++ 在断点处可以监视和运行表达式,返回结果 ++ 可以根据断点密集程度调整 hook 频率, 有较好高的效率 ++ 支持 attach 模式,lua 运行过程中可随时建立连接 ++ 使用 lua / C 双调试引擎。lua 部分可动态下发,避免打包后无法调试。C 部分效率高,适合开发期调试。 + + + +# 接入和开发指引 + +接入和使用文档 + +[项目介绍](./Docs/Manual/feature-introduction.md) | [快速试用指引](./Docs/Manual/quick-use.md) | [接入指引](./Docs/Manual/access-guidelines.md) | [真机调试](./Docs/Manual/debug-on-phone.md) | [单文件调试和运行](./Docs/Manual/debug-file.md) | [升级说明](./Docs/Manual/update.md) | [FAQ](./Docs/Manual/FAQ.md) + +调试器开发文档 + +[工程说明](./Docs/Development-instructions/project-description.md) | [调试器开发指引](./Docs/Development-instructions/how_to_join.md) | [特性简述](./Docs/Development-instructions/debugger-principle.md) + + + +# 依赖和适用性 + +调试器依赖 LuaSocket , 可运行于 slua,slua-unreal ,xlua 等已集成 LuaSocket 的 lua 环境,也可以在 console 中调试。lua 版本支持 5.1- 5.3。 + + + +# 参与贡献 + +我们非常期待您的贡献,无论是完善文档,提出、修复 Bug 或是增加新特性。 +如果您在使用过程中发现文档不够完善,欢迎记录下来并提交。 +如果发现 Bug,请通过 [issues](https://github.com/Tencent/LuaPanda/issues) 来提交并描述相关的问题,您也可以在这里查看其它的 issue,通过解决这些 issue 来贡献代码。 + +请将pull request提交在 `dev` 分支上,经过测试后会在下一版本合并到 `master` 分支。更多规范请看[CONTRIBUTING](./CONTRIBUTING.md) + +[腾讯开源激励计划](https://opensource.tencent.com/contribution) 鼓励开发者的参与和贡献,期待你的加入。 + + + +# 技术支持 + +如有问题先参阅 [FAQ](./Docs/Manual/FAQ.md) ,如有问题建议使用 [issues](https://github.com/Tencent/LuaPanda/issues) ,我们会关注和回复。 + +QQ群:974257225 + From 0abcea33d8ca8152905728fd4e36491d73721d16 Mon Sep 17 00:00:00 2001 From: stuartwang Date: Thu, 8 Aug 2019 10:38:42 +0800 Subject: [PATCH 057/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E5=92=8C=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 7 +++++++ readme.md | 17 +++++++++++++++-- src/luaDebug.ts | 6 +++--- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c9817b..754ce14 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 2.2.1 + ++ 修复了单文件调试 文件路径中的 \ 被当做转义符的问题 ++ 修复了单文件调试 首次运行窗口报错的问题 + + + ## 2.2.0 + 修复了VSCode请求变量但没有获取返回时卡住的问题。 diff --git a/readme.md b/readme.md index e912cdd..b3f1d68 100644 --- a/readme.md +++ b/readme.md @@ -15,9 +15,13 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` # Tips -+ 关于VSCode 1.33的兼容 ++ 升级建议 - 更新 VScode 1.33 之后调试器可能出现断点无法停止的情况,如遇此问题,请从master分支中拉取最新的`LuaPanda.lua`文件,覆盖原有文件即可。 + 因 VSCode1.33 升级,LuaPanda 2.0.5 前版本无法在 VScode1.33 及更高版本中使用。建议大家在使用中如果遇到问题,把调试器的`LuaPanda.lua,DebugTools.lua`文件更新到最新。`LuaPanda.lua` 的版本可以在此文件头部查看。 + + 下载地址:https://github.com/Tencent/LuaPanda/releases + + + 关于找不到`libpdebug`模块报错 @@ -33,6 +37,15 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` # 近期更新 ++ v2.2.1 + + 小幅更新,优化了单文件调试。 + + - 修复单文件调试 文件路径中的 \ 被当做转义符的问题 + - 修复单文件调试 首次运行窗口报错的问题 + + + + v2.2.0 增加了`LuaPanda.doctor()` 命令,可以检查环境中的错误(需更新LuaPanda.lua和DebugTools.lua至2.2.0)。 diff --git a/src/luaDebug.ts b/src/luaDebug.ts index 393584f..84a6b7f 100755 --- a/src/luaDebug.ts +++ b/src/luaDebug.ts @@ -181,11 +181,11 @@ export class LuaDebugSession extends LoggingDebugSession { if (DVerArr.length == AVerArr.length && DVerArr.length == 3 ){ //比较大版本,大版本相差1就提示 if ( parseInt(AVerArr[0]) > parseInt(DVerArr[0]) ){ - this._runtime.showTip("调试器Lua文件版本很低, 建议升级至新版。获取帮助 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); + this._runtime.showTip("调试器Lua文件版本过低, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); } //比较小版本,小版本相差20就提示 - if ( ( parseInt(AVerArr[1]) - parseInt(DVerArr[1]) ) >= 20 ){ - this._runtime.showTip("调试器Lua文件较旧, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); + if ( ( parseInt(AVerArr[1]) - parseInt(DVerArr[1]) ) >= 3 ){ + this._runtime.showTip("调试器Lua文件版本较低, 建议升级至最新版本。获取帮助 https://github.com/Tencent/LuaPanda/blob/master/Docs/Manual/update.md "); } } } From f8302f2f5371ace6aef22ebc675cf25b56640fae Mon Sep 17 00:00:00 2001 From: stuartwang Date: Thu, 8 Aug 2019 11:53:35 +0800 Subject: [PATCH 058/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=92=8C=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + Debugger/LuaPanda.lua | 11 ++++++----- package.json | 2 +- readme.md | 9 +++++---- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 754ce14..e6d5003 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ + 修复了单文件调试 文件路径中的 \ 被当做转义符的问题 + 修复了单文件调试 首次运行窗口报错的问题 ++ 优化调试控制台 diff --git a/Debugger/LuaPanda.lua b/Debugger/LuaPanda.lua index b50e046..da4a7d7 100644 --- a/Debugger/LuaPanda.lua +++ b/Debugger/LuaPanda.lua @@ -46,7 +46,7 @@ local consoleLogLevel = 2; --打印在控制台(print)的日志等级 local connectTimeoutSec = 0.005; --等待连接超时时间, 单位s. 时间过长等待attach时会造成卡顿,时间过短可能无法连接。建议值0.005 - 0.05 --用户设置项END -local debuggerVer = "2.2.0"; --debugger版本号 +local debuggerVer = "2.2.1"; --debugger版本号 LuaPanda = {}; local this = LuaPanda; local tools = require("DebugTools"); --引用的开源工具,包括json解析和table展开工具等 @@ -2437,12 +2437,13 @@ function this.processExp(msgTable) local expression = this.trim(tostring(msgTable.Expression)); local isCmd = false; if isCmd == false then - --如果输入的是一个变量,加上return + --兼容旧版p 命令 if expression:find("p ", 1, true) == 1 then expression = expression:sub(3); - expression = "return " .. expression; end - local f = debugger_loadString(expression) or debugger_loadString("return " .. expression) + + local expressionWithReturn = "return " .. expression; + local f = debugger_loadString(expressionWithReturn) or debugger_loadString(expression); --判断结果,如果表达式错误会返回nil if type(f) == "function" then if _VERSION == "Lua 5.1" then @@ -2453,7 +2454,7 @@ function this.processExp(msgTable) --表达式要有错误处理 xpcall(function() retString = f() end , function() retString = "输入错误指令。\n + 请检查指令是否正确\n + 指令仅能在[暂停在断点时]输入, 请不要在程序持续运行时输入"; var.isSuccess = false; end) else - retString = "指令执行错误。\n + 请检查指令是否正确\n + 如果希望观察[变量的值]或[表达式的返回结果],请在表达式前前面加\"p \"\n + 如果仅希望执行一段lua代码,不观察返回值,直接输入即可"; + retString = "指令执行错误。\n + 请检查指令是否正确\n + 可以直接输入表达式,执行函数或变量名,并观察执行结果"; var.isSuccess = false; end end diff --git a/package.json b/package.json index e3e40dd..b75198e 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "luapanda", "displayName": "LuaPanda", - "version": "2.2.0", + "version": "2.2.1", "publisher": "stuartwang", "description": "lua debug adapters for VS Code.", "author": { diff --git a/readme.md b/readme.md index b3f1d68..74d8788 100644 --- a/readme.md +++ b/readme.md @@ -39,13 +39,14 @@ LuaPanda 的立项源于潘多拉项目中大量的lua调试需求。`潘多拉` + v2.2.1 - 小幅更新,优化了单文件调试。 - - - 修复单文件调试 文件路径中的 \ 被当做转义符的问题 - - 修复单文件调试 首次运行窗口报错的问题 + 小幅更新,优化了单文件调试和调试控制台。 + - 修复单文件调试 文件路径中的 \ 被当做转义符的问题。 + - 修复单文件调试 首次运行窗口报错的问题。 + - 优化调试控制台的使用,动态执行表达式不必再加p 。 + + v2.2.0 增加了`LuaPanda.doctor()` 命令,可以检查环境中的错误(需更新LuaPanda.lua和DebugTools.lua至2.2.0)。 From fc24bcdd60b9bdacb47b8906045881ae6d0bf26f Mon Sep 17 00:00:00 2001 From: stuartwang Date: Thu, 8 Aug 2019 13:55:03 +0800 Subject: [PATCH 059/431] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/Manual/feature-introduction.md | 4 ++-- .../feature-introduction/debug-console.png | Bin 31874 -> 27937 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Docs/Manual/feature-introduction.md b/Docs/Manual/feature-introduction.md index f7352d5..be1ba4b 100644 --- a/Docs/Manual/feature-introduction.md +++ b/Docs/Manual/feature-introduction.md @@ -65,11 +65,11 @@ Win slua-unreal + lua5.3 ![REPL-watch](../static/feature-introduction/REPL-watch.png) -调试控制台,可以在断点处输入表达式 +调试控制台,可以在断点处输入表达式,执行函数,或者输入变量名观察它的值 ![debug-console](../static/feature-introduction/debug-console.png) -在需要查看的变量或者是表达式前加p , 即可返回输出结果,如上图。 + ### 支持attach模式 diff --git a/Docs/static/feature-introduction/debug-console.png b/Docs/static/feature-introduction/debug-console.png index f6265ea70e92c543e7e4e490ba4849f79836a984..4f5dbc20605386d281dc787c3e098a3e2bbb5515 100644 GIT binary patch literal 27937 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 Y(KGDK0JV%vUp||psGLaUPXoXI1BV=YQvd(} literal 31874 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/G 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