From 5bc0ecf72fd0af3f4269c012f9346359c337b8d7 Mon Sep 17 00:00:00 2001 From: Georgi Kirilov <> Date: Sat, 31 Oct 2020 11:50:51 +0200 Subject: [PATCH] improve line comment joining and splicing - the last empty comment is now spliced, not joined - indented comments cannot be joined with margin comments anymore --- edit.lua | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/edit.lua b/edit.lua index a889847..1b826f9 100644 --- a/edit.lua +++ b/edit.lua @@ -308,7 +308,7 @@ function M.new(parser, walker, fmt, write, delete) return refmt_at(scope, range) or range.start end - local function splice_sexp(range, _) + local function splice_sexp(range, _, no_refmt) local _, parent = walker.sexp_at(range) if not parent or not parent.d then return end local opening = (parent.p or '')..parent.d @@ -323,7 +323,7 @@ function M.new(parser, walker, fmt, write, delete) range.start = range.start - #opening range.finish = range.start local _, parentng = walker.sexp_at(range, true) - return refmt_at(parentng, range) or range.start + return not no_refmt and refmt_at(parentng, range) or range.start end local function rewrap(parent, kind) @@ -379,7 +379,7 @@ function M.new(parser, walker, fmt, write, delete) local node, parent = walker.sexp_at(range, true) local first = node and node.finish + 1 == range.start and node or parent.before(range.start, finishof) local second = first ~= node and node or parent.after(range.start, startof) - if not (first and second and first.d and + if not (first and second and first.d and first.indent and second.indent and (first.d == second.d or -- join line comments even when their delimiters differ slightly -- (different number of semicolons, existence/lack of a space after them) @@ -490,10 +490,13 @@ function M.new(parser, walker, fmt, write, delete) end end - local function _join_or_splice(sexp, range, pos) - local newpos = join_sexps(range) + local function _join_or_splice(parent, n, range, pos) + local sexp = parent[n] + local nxt = parent[n + 1] + local is_last = not nxt or parser.opposite[nxt.d] ~= "\n" + local newpos = not (is_last and sexp.is_empty) and join_sexps(range) if not newpos and sexp.is_empty then - newpos = splice_sexp({start = pos, finish = pos}) + newpos = splice_sexp({start = pos, finish = pos}, nil, true) end return newpos or pos end @@ -509,12 +512,12 @@ function M.new(parser, walker, fmt, write, delete) if ndeleted == 0 then local closing = parser.opposite[opening] if closing == "\n" then - local sexp = walker.sexp_at(range) + local sexp, parent, n = walker.sexp_at(range) if pos == sexp.start + #sexp.d and backwards then - return _join_or_splice(sexp, range, pos) + return _join_or_splice(parent, n, range, pos) elseif pos == sexp.finish then local r = {start = pos + #closing, finish = pos + #closing} - return _join_or_splice(sexp, r, pos) + return _join_or_splice(parent, n, r, pos) end end end -- 2.11.4.GIT