show_line_position

This commit is contained in:
leaf corcoran 2016-09-25 12:53:05 -07:00
parent bf437b2cd2
commit f2363f53cd
2 changed files with 103 additions and 6 deletions

View File

@ -41,6 +41,58 @@ extract_line = function(str, start_pos)
end
return str:match("^.-$")
end
local show_line_position
show_line_position = function(str, pos, context)
if context == nil then
context = true
end
local lines = {
{ }
}
for c in str:gmatch(".") do
lines[#lines] = lines[#lines] or { }
table.insert(lines[#lines], c)
if c == "\n" then
lines[#lines + 1] = { }
end
end
for i, line in ipairs(lines) do
lines[i] = table.concat(line)
end
local out
local remaining = pos - 1
for k, line in ipairs(lines) do
if remaining < #line then
local left = line:sub(1, remaining)
local right = line:sub(remaining + 1)
out = {
tostring(left) .. "" .. tostring(right)
}
if context then
do
local before = lines[k - 1]
if before then
table.insert(out, 1, before)
end
end
do
local after = lines[k + 1]
if after then
table.insert(out, after)
end
end
end
break
else
remaining = remaining - #line
end
end
if not (out) then
return "-"
end
out = table.concat(out)
return (out:gsub("\n*$", ""))
end
local mark
mark = function(name)
return function(...)
@ -60,9 +112,12 @@ pos = function(patt)
end
end
local got
got = function(what)
got = function(what, context)
if context == nil then
context = true
end
return Cmt("", function(str, pos)
print("++ got " .. tostring(what), "[" .. tostring(extract_line(str, pos)) .. "]")
print("++ got " .. tostring(what), "[" .. tostring(show_line_position(str, pos, context)) .. "]")
return true
end)
end
@ -245,5 +300,7 @@ return {
join_chain = join_chain,
wrap_decorator = wrap_decorator,
check_lua_string = check_lua_string,
self_assign = self_assign
self_assign = self_assign,
got = got,
show_line_position = show_line_position
}

View File

@ -31,6 +31,46 @@ extract_line = (str, start_pos) ->
str\match "^.-$"
-- print the line with a token showing the position
show_line_position = (str, pos, context=true) ->
lines = { {} }
for c in str\gmatch "."
lines[#lines] or= {}
table.insert lines[#lines], c
if c == "\n"
lines[#lines + 1] = {}
for i, line in ipairs lines
lines[i] = table.concat line
local out
remaining = pos - 1
for k, line in ipairs lines
if remaining < #line
left = line\sub 1, remaining
right = line\sub remaining + 1
out = {
"#{left}◉#{right}"
}
if context
if before = lines[k - 1]
table.insert out, 1, before
if after = lines[k + 1]
table.insert out, after
break
else
remaining -= #line
return "-" unless out
out = table.concat out
(out\gsub "\n*$", "")
-- used to identify a capture with a label
mark = (name) ->
(...) -> {name, ...}
@ -46,9 +86,9 @@ pos = (patt) ->
-- generates a debug pattern that always succeeds and prints out where we are
-- in the buffer with a label
got = (what) ->
got = (what, context=true) ->
Cmt "", (str, pos) ->
print "++ got #{what}", "[#{extract_line str, pos}]"
print "++ got #{what}", "[#{show_line_position str, pos, context}]"
true
-- converts 1 element array to its value, otherwise marks it
@ -154,4 +194,4 @@ self_assign = (name, pos) ->
{ :Indent, :Cut, :ensure, :extract_line, :mark, :pos, :flatten_or_mark,
:is_assignable, :check_assignable, :format_assign, :format_single_assign,
:sym, :symx, :simple_string, :wrap_func_arg, :join_chain, :wrap_decorator,
:check_lua_string, :self_assign }
:check_lua_string, :self_assign, :got, :show_line_position }