Skip to content

Commit

Permalink
Merge pull request #12850 from bfredl/oopsie
Browse files Browse the repository at this point in the history
API: be less breaking in the decorations
  • Loading branch information
bfredl committed Sep 4, 2020
2 parents 1e14dac + 866308c commit 3853276
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 36 deletions.
42 changes: 37 additions & 5 deletions src/nvim/api/buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1161,11 +1161,13 @@ static Array extmark_to_array(ExtmarkInfo extmark, bool id, bool add_dict)
/// @param buffer Buffer handle, or 0 for current buffer
/// @param ns_id Namespace id from |nvim_create_namespace()|
/// @param id Extmark id
/// @param details Wether to include the details dict
/// @param opts Optional parameters. Keys:
/// - limit: Maximum number of marks to return
/// - details Whether to include the details dict
/// @param[out] err Error details, if any
/// @return (row, col) tuple or empty list () if extmark id was absent
ArrayOf(Integer) nvim_buf_get_extmark_by_id(Buffer buffer, Integer ns_id,
Integer id, Boolean details,
Integer id, Dictionary opts,
Error *err)
FUNC_API_SINCE(7)
{
Expand All @@ -1182,6 +1184,26 @@ ArrayOf(Integer) nvim_buf_get_extmark_by_id(Buffer buffer, Integer ns_id,
return rv;
}

bool details = false;
for (size_t i = 0; i < opts.size; i++) {
String k = opts.items[i].key;
Object *v = &opts.items[i].value;
if (strequal("details", k.data)) {
if (v->type == kObjectTypeBoolean) {
details = v->data.boolean;
} else if (v->type == kObjectTypeInteger) {
details = v->data.integer;
} else {
api_set_error(err, kErrorTypeValidation, "details is not an boolean");
return rv;
}
} else {
api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data);
return rv;
}
}


ExtmarkInfo extmark = extmark_from_id(buf, (uint64_t)ns_id, (uint64_t)id);
if (extmark.row < 0) {
return rv;
Expand Down Expand Up @@ -1229,13 +1251,12 @@ ArrayOf(Integer) nvim_buf_get_extmark_by_id(Buffer buffer, Integer ns_id,
/// (whose position defines the bound)
/// @param opts Optional parameters. Keys:
/// - limit: Maximum number of marks to return
/// @param details Wether to include the details dict
/// - details Whether to include the details dict
/// @param[out] err Error details, if any
/// @return List of [extmark_id, row, col] tuples in "traversal order".
Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id,
Object start, Object end,
Dictionary opts, Boolean details,
Error *err)
Dictionary opts, Error *err)
FUNC_API_SINCE(7)
{
Array rv = ARRAY_DICT_INIT;
Expand All @@ -1249,7 +1270,9 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id,
api_set_error(err, kErrorTypeValidation, "Invalid ns_id");
return rv;
}

Integer limit = -1;
bool details = false;

for (size_t i = 0; i < opts.size; i++) {
String k = opts.items[i].key;
Expand All @@ -1260,6 +1283,15 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id,
return rv;
}
limit = v->data.integer;
} else if (strequal("details", k.data)) {
if (v->type == kObjectTypeBoolean) {
details = v->data.boolean;
} else if (v->type == kObjectTypeInteger) {
details = v->data.integer;
} else {
api_set_error(err, kErrorTypeValidation, "details is not an boolean");
return rv;
}
} else {
api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data);
return rv;
Expand Down
63 changes: 35 additions & 28 deletions test/functional/api/extmark_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,6 @@ local function expect(contents)
return eq(contents, helpers.curbuf_contents())
end

local function check_undo_redo(ns, mark, sr, sc, er, ec) --s = start, e = end
local rv = curbufmeths.get_extmark_by_id(ns, mark, false)
eq({er, ec}, rv)
feed("u")
rv = curbufmeths.get_extmark_by_id(ns, mark, false)
eq({sr, sc}, rv)
feed("<c-r>")
rv = curbufmeths.get_extmark_by_id(ns, mark, false)
eq({er, ec}, rv)
end

local function set_extmark(ns_id, id, line, col, opts)
if opts == nil then
opts = {}
Expand All @@ -42,7 +31,25 @@ local function get_extmarks(ns_id, start, end_, opts)
if opts == nil then
opts = {}
end
return curbufmeths.get_extmarks(ns_id, start, end_, opts, false)
return curbufmeths.get_extmarks(ns_id, start, end_, opts)
end

local function get_extmark_by_id(ns_id, id, opts)
if opts == nil then
opts = {}
end
return curbufmeths.get_extmark_by_id(ns_id, id, opts)
end

local function check_undo_redo(ns, mark, sr, sc, er, ec) --s = start, e = end
local rv = get_extmark_by_id(ns, mark)
eq({er, ec}, rv)
feed("u")
rv = get_extmark_by_id(ns, mark)
eq({sr, sc}, rv)
feed("<c-r>")
rv = get_extmark_by_id(ns, mark)
eq({er, ec}, rv)
end

local function batch_set(ns_id, positions)
Expand Down Expand Up @@ -96,7 +103,7 @@ describe('API/extmarks', function()
it('adds, updates and deletes marks', function()
local rv = set_extmark(ns, marks[1], positions[1][1], positions[1][2])
eq(marks[1], rv)
rv = curbufmeths.get_extmark_by_id(ns, marks[1], false)
rv = get_extmark_by_id(ns, marks[1])
eq({positions[1][1], positions[1][2]}, rv)
-- Test adding a second mark on same row works
rv = set_extmark(ns, marks[2], positions[2][1], positions[2][2])
Expand All @@ -105,14 +112,14 @@ describe('API/extmarks', function()
-- Test an update, (same pos)
rv = set_extmark(ns, marks[1], positions[1][1], positions[1][2])
eq(marks[1], rv)
rv = curbufmeths.get_extmark_by_id(ns, marks[2], false)
rv = get_extmark_by_id(ns, marks[2])
eq({positions[2][1], positions[2][2]}, rv)
-- Test an update, (new pos)
row = positions[1][1]
col = positions[1][2] + 1
rv = set_extmark(ns, marks[1], row, col)
eq(marks[1], rv)
rv = curbufmeths.get_extmark_by_id(ns, marks[1], false)
rv = get_extmark_by_id(ns, marks[1])
eq({row, col}, rv)

-- remove the test marks
Expand Down Expand Up @@ -435,7 +442,7 @@ describe('API/extmarks', function()
~ |
|
]])
local rv = curbufmeths.get_extmark_by_id(ns, marks[1], false)
local rv = get_extmark_by_id(ns, marks[1])
eq({0, 6}, rv)
check_undo_redo(ns, marks[1], 0, 3, 0, 6)
end)
Expand Down Expand Up @@ -909,9 +916,9 @@ describe('API/extmarks', function()
-- Set the mark before the cursor, should stay there
set_extmark(ns, marks[2], 0, 10)
feed("i<cr><esc>")
local rv = curbufmeths.get_extmark_by_id(ns, marks[1], false)
local rv = get_extmark_by_id(ns, marks[1])
eq({1, 3}, rv)
rv = curbufmeths.get_extmark_by_id(ns, marks[2], false)
rv = get_extmark_by_id(ns, marks[2])
eq({0, 10}, rv)
check_undo_redo(ns, marks[1], 0, 12, 1, 3)
end)
Expand All @@ -924,12 +931,12 @@ describe('API/extmarks', function()
feed("0iint <esc>A {<cr><esc>0i1M1<esc>")
set_extmark(ns, marks[1], 1, 1)
feed("0i<c-f><esc>")
local rv = curbufmeths.get_extmark_by_id(ns, marks[1], false)
local rv = get_extmark_by_id(ns, marks[1])
eq({1, 3}, rv)
check_undo_redo(ns, marks[1], 1, 1, 1, 3)
-- now check when cursor at eol
feed("uA<c-f><esc>")
rv = curbufmeths.get_extmark_by_id(ns, marks[1], false)
rv = get_extmark_by_id(ns, marks[1])
eq({1, 3}, rv)
end)

Expand All @@ -940,12 +947,12 @@ describe('API/extmarks', function()
feed("0i<tab><esc>")
set_extmark(ns, marks[1], 0, 3)
feed("bi<c-d><esc>")
local rv = curbufmeths.get_extmark_by_id(ns, marks[1], false)
local rv = get_extmark_by_id(ns, marks[1])
eq({0, 1}, rv)
check_undo_redo(ns, marks[1], 0, 3, 0, 1)
-- check when cursor at eol
feed("uA<c-d><esc>")
rv = curbufmeths.get_extmark_by_id(ns, marks[1], false)
rv = get_extmark_by_id(ns, marks[1])
eq({0, 1}, rv)
end)

Expand Down Expand Up @@ -1075,7 +1082,7 @@ describe('API/extmarks', function()
check_undo_redo(ns, marks[5], 2, 0, 3, 0)
feed('u')
feed([[:1,2s:3:\rxx<cr>]])
eq({1, 3}, curbufmeths.get_extmark_by_id(ns, marks[3], false))
eq({1, 3}, get_extmark_by_id(ns, marks[3]))
end)

it('substitions over multiple lines with replace in substition', function()
Expand Down Expand Up @@ -1314,16 +1321,16 @@ describe('API/extmarks', function()
eq("Invalid ns_id", pcall_err(set_extmark, ns_invalid, marks[1], positions[1][1], positions[1][2]))
eq("Invalid ns_id", pcall_err(curbufmeths.del_extmark, ns_invalid, marks[1]))
eq("Invalid ns_id", pcall_err(get_extmarks, ns_invalid, positions[1], positions[2]))
eq("Invalid ns_id", pcall_err(curbufmeths.get_extmark_by_id, ns_invalid, marks[1], false))
eq("Invalid ns_id", pcall_err(get_extmark_by_id, ns_invalid, marks[1]))
end)

it('when col = line-length, set the mark on eol', function()
set_extmark(ns, marks[1], 0, -1)
local rv = curbufmeths.get_extmark_by_id(ns, marks[1], false)
local rv = get_extmark_by_id(ns, marks[1])
eq({0, init_text:len()}, rv)
-- Test another
set_extmark(ns, marks[1], 0, -1)
rv = curbufmeths.get_extmark_by_id(ns, marks[1], false)
rv = get_extmark_by_id(ns, marks[1])
eq({0, init_text:len()}, rv)
end)

Expand All @@ -1336,7 +1343,7 @@ describe('API/extmarks', function()
local invalid_col = init_text:len() + 1
local invalid_lnum = 3
eq('line value outside range', pcall_err(set_extmark, ns, marks[1], invalid_lnum, invalid_col))
eq({}, curbufmeths.get_extmark_by_id(ns, marks[1], false))
eq({}, get_extmark_by_id(ns, marks[1]))
end)

it('bug from check_col in extmark_set', function()
Expand All @@ -1361,7 +1368,7 @@ describe('API/extmarks', function()
local buf = request('nvim_create_buf', 0, 1)
request('nvim_buf_set_lines', buf, 0, -1, 1, {"", ""})
local id = bufmeths.set_extmark(buf, ns, 1, 0, {})
eq({{id, 1, 0}}, bufmeths.get_extmarks(buf, ns, 0, -1, {}, false))
eq({{id, 1, 0}}, bufmeths.get_extmarks(buf, ns, 0, -1, {}))
end)

it('does not crash with append/delete/undo seqence', function()
Expand Down
6 changes: 3 additions & 3 deletions test/functional/ui/bufhl_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -699,14 +699,14 @@ describe('Buffer highlighting', function()
-- TODO: only a virtual text from the same ns curretly overrides
-- an existing virtual text. We might add a prioritation system.
set_virtual_text(id1, 0, s1, {})
eq({{1, 0, 0, {virt_text = s1}}}, get_extmarks(id1, {0,0}, {0, -1}, {}, true))
eq({{1, 0, 0, {virt_text = s1}}}, get_extmarks(id1, {0,0}, {0, -1}, {details=true}))

-- TODO: is this really valid? shouldn't the max be line_count()-1?
local lastline = line_count()
set_virtual_text(id1, line_count(), s2, {})
eq({{3, lastline, 0, {virt_text = s2}}}, get_extmarks(id1, {lastline,0}, {lastline, -1}, {}, true))
eq({{3, lastline, 0, {virt_text = s2}}}, get_extmarks(id1, {lastline,0}, {lastline, -1}, {details=true}))

eq({}, get_extmarks(id1, {lastline+9000,0}, {lastline+9000, -1}, {}, false))
eq({}, get_extmarks(id1, {lastline+9000,0}, {lastline+9000, -1}, {}))
end)

it('is not highlighted by visual selection', function()
Expand Down

0 comments on commit 3853276

Please sign in to comment.