Make current line number available in all error events

Fri, 28 Dec 2018 16:00:01 -0500

author
Waqas Hussain <waqas20@gmail.com>
date
Fri, 28 Dec 2018 16:00:01 -0500
changeset 162
f888f236321f
parent 161
fadae5511044
child 163
0e2150680a25

Make current line number available in all error events

main.lua file | annotate | diff | comparison | revisions
scansion/parser.lua file | annotate | diff | comparison | revisions
scansion/serve.lua file | annotate | diff | comparison | revisions
--- a/main.lua	Fri Dec 28 11:38:56 2018 +0000
+++ b/main.lua	Fri Dec 28 16:00:01 2018 -0500
@@ -140,9 +140,10 @@
 	return assert(parser.parse(data));
 end
 
-local function initialize_script(script)
+local function initialize_script(script, context)
 	local c = 0;
 	for name, object in pairs(script.objects) do --luacheck: ignore name
+		context.line = object.defined_line
 		local o = require("scansion.objects."..object.type);
 		object.handler = o;
 		object.script = script;
@@ -181,11 +182,13 @@
 	return verse;
 end
 
-local function main(log_data, script)
+local function main(log_data, script, context)
 
 	local ok, err = true;
 
-	initialize_script(script);
+	initialize_script(script, context);
+
+	context.line = nil;
 
 	if server_log_reader then
 		if skip_server_startup_log then
@@ -200,8 +203,21 @@
 
 	local runner = async.runner(function ()
 		for i, action in ipairs(script.actions) do
+			context.line = action.line_start;
+
 			local object = script.objects[action.object_name];
 			local handler = object.handler;
+
+			log_data("action", {
+				action = action.action;
+				object = object.name;
+				object_type = object.type;
+				extra = action.extra;
+				annotation = action.annotation;
+				line_start = action.line_start;
+				line_end = action.line_end;
+			});
+
 			if not handler[action.action] then
 				local e = new_error("unsupported-action", {
 					text = "Objects of type '"..object.type.."' do not support action '"..action.action.."'";
@@ -211,15 +227,6 @@
 			if server_log_reader then
 				log_data("server", { lines = server_log_reader() });
 			end
-			log_data("action", {
-				action = action.action;
-				object = object.name;
-				object_type = object.type;
-				extra = action.extra;
-				annotation = action.annotation;
-				line_start = action.line_start;
-				line_end = action.line_end;
-			});
 
 			if action_timeout and action_timeout > 0 then
 				local action_number = i;
@@ -237,11 +244,12 @@
 					log_data("server", { lines = server_log_reader() });
 				end
 				if not ok then
-					log_data("error", { message = err });
+					log_data("error", { message = err, line = context.line });
 					error(err);
 				end
 			end
 		end
+		context.line = nil;
 		script.finished = true;
 		verse.log("info", "Completed script!");
 		verse.quit();
@@ -328,7 +336,8 @@
 
 	log_data("script", script_data);
 
-	local ok, result, err = pcall(main, log_data, script);
+	local context = { line = nil };
+	local ok, result, err = pcall(main, log_data, script, context);
 
 	local event, status, reason;
 	if not ok then
@@ -339,7 +348,7 @@
 		event, status, reason = "test-passed", "ok", nil;
 	end
 
-	local result_data = { name = script.title or script_name, status = status, reason = reason };
+	local result_data = { name = script.title or script_name, status = status, reason = reason, line = context.line };
 
 	log_data(event, result_data);
 
--- a/scansion/parser.lua	Fri Dec 28 11:38:56 2018 +0000
+++ b/scansion/parser.lua	Fri Dec 28 16:00:01 2018 -0500
@@ -9,13 +9,17 @@
 	local last_object;
 	local annotation;
 
+	local function parse_error(text)
+		return nil, text .. " (line " .. line_number .. ")";
+	end
+
 	for line in data:gmatch("([^\r\n]*)\r?\n") do
 		line_number = line_number + 1;
 		if line:sub(1,1) == "[" then
 			local obj_type, name = line:match("^%[(%a+)%] (.+)$");
 			
 			if parsed.objects[name] then
-				return nil, "Duplicate definition of "..name.." on line "..line_number;
+				return parse_error("Duplicate definition of '"..name.."'");
 			end
 			parsed.objects[name] = {
 				type = obj_type:lower();
@@ -25,7 +29,7 @@
 			last_object = parsed.objects[name];
 		elseif line:match("^%s+[%a_]+:.+$") then
 			if not last_object then
-				return nil, "Line "..line_number.. "unexpected outside of an object definition";
+				return parse_error("Unexpected outside of an object definition");
 			end
 			local k, v = line:match("^%s+([%a_]+):%s*(.+)$")
 			last_object[k] = v;
@@ -69,10 +73,10 @@
 			last_object = nil;
 			local name, action, extra = line:match("^([^:]+) (%a+):?%s?(.*)$");
 			if not name then
-				return nil, "Unable to parse action on line "..line_number;
+				return parse_error("Unable to parse action");
 			end
 			if not parsed.objects[name] then
-				return nil, "The object '"..name.."' used on line "..line_number.." was not declared";
+				return parse_error("The object '"..name.."' was not declared");
 			end
 			table.insert(parsed.actions, {
 				object_name = name;
--- a/scansion/serve.lua	Fri Dec 28 11:38:56 2018 +0000
+++ b/scansion/serve.lua	Fri Dec 28 16:00:01 2018 -0500
@@ -48,7 +48,11 @@
 		local ok, ret = pcall(run_script, "web", event.request.body, log);
 	
 		if not ok then
-			log("error", ret);
+			local line = nil;
+			if type(ret) == "string" then
+				line = tonumber(ret:match("%(line (%d+)%)$"));
+			end
+			log("error", { message = ret, line = line });
 		end
 
 		response.conn:write("0\r\n\r\n");

mercurial