mirror of
https://github.com/neovim/neovim.git
synced 2025-12-01 22:43:03 +00:00
Merge branch 'master' into luaviml'/lua
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
// This is an open source non-commercial project. Dear PVS-Studio, please check
|
||||
// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <inttypes.h>
|
||||
@@ -24,6 +27,7 @@
|
||||
#include "nvim/eval.h"
|
||||
#include "nvim/eval/typval.h"
|
||||
#include "nvim/option.h"
|
||||
#include "nvim/state.h"
|
||||
#include "nvim/syntax.h"
|
||||
#include "nvim/getchar.h"
|
||||
#include "nvim/os/input.h"
|
||||
@@ -162,8 +166,8 @@ String nvim_command_output(String str, Error *err)
|
||||
nvim_command(str, err);
|
||||
do_cmdline_cmd("redir END");
|
||||
|
||||
if (err->set) {
|
||||
return (String) STRING_INIT;
|
||||
if (ERROR_SET(err)) {
|
||||
return (String)STRING_INIT;
|
||||
}
|
||||
|
||||
return cstr_to_string((char *)get_vim_var_str(VV_COMMAND_OUTPUT));
|
||||
@@ -185,7 +189,7 @@ Object nvim_eval(String expr, Error *err)
|
||||
|
||||
typval_T rettv;
|
||||
if (eval0((char_u *)expr.data, &rettv, NULL, true) == FAIL) {
|
||||
api_set_error(err, Exception, "Failed to evaluate expression");
|
||||
api_set_error(err, kErrorTypeException, "Failed to evaluate expression");
|
||||
}
|
||||
|
||||
if (!try_end(err)) {
|
||||
@@ -212,8 +216,8 @@ Object nvim_call_function(String fname, Array args, Error *err)
|
||||
{
|
||||
Object rv = OBJECT_INIT;
|
||||
if (args.size > MAX_FUNC_ARGS) {
|
||||
api_set_error(err, Validation,
|
||||
_("Function called with too many arguments."));
|
||||
api_set_error(err, kErrorTypeValidation,
|
||||
"Function called with too many arguments.");
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -235,7 +239,7 @@ Object nvim_call_function(String fname, Array args, Error *err)
|
||||
curwin->w_cursor.lnum, curwin->w_cursor.lnum, &dummy,
|
||||
true, NULL, NULL);
|
||||
if (r == FAIL) {
|
||||
api_set_error(err, Exception, _("Error calling function."));
|
||||
api_set_error(err, kErrorTypeException, "Error calling function.");
|
||||
}
|
||||
if (!try_end(err)) {
|
||||
rv = vim_to_object(&rettv);
|
||||
@@ -260,7 +264,7 @@ Integer nvim_strwidth(String str, Error *err)
|
||||
FUNC_API_SINCE(1)
|
||||
{
|
||||
if (str.size > INT_MAX) {
|
||||
api_set_error(err, Validation, _("String length is too high"));
|
||||
api_set_error(err, kErrorTypeValidation, "String length is too high");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -316,7 +320,7 @@ void nvim_set_current_dir(String dir, Error *err)
|
||||
FUNC_API_SINCE(1)
|
||||
{
|
||||
if (dir.size >= MAXPATHL) {
|
||||
api_set_error(err, Validation, _("Directory string is too long"));
|
||||
api_set_error(err, kErrorTypeValidation, "Directory string is too long");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -328,7 +332,7 @@ void nvim_set_current_dir(String dir, Error *err)
|
||||
|
||||
if (vim_chdir((char_u *)string, kCdScopeGlobal)) {
|
||||
if (!try_end(err)) {
|
||||
api_set_error(err, Exception, _("Failed to change directory"));
|
||||
api_set_error(err, kErrorTypeException, "Failed to change directory");
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -537,8 +541,8 @@ void nvim_set_current_buf(Buffer buffer, Error *err)
|
||||
int result = do_buffer(DOBUF_GOTO, DOBUF_FIRST, FORWARD, buf->b_fnum, 0);
|
||||
if (!try_end(err) && result == FAIL) {
|
||||
api_set_error(err,
|
||||
Exception,
|
||||
_("Failed to switch to buffer %d"),
|
||||
kErrorTypeException,
|
||||
"Failed to switch to buffer %d",
|
||||
buffer);
|
||||
}
|
||||
}
|
||||
@@ -590,8 +594,8 @@ void nvim_set_current_win(Window window, Error *err)
|
||||
goto_tabpage_win(win_find_tabpage(win), win);
|
||||
if (!try_end(err) && win != curwin) {
|
||||
api_set_error(err,
|
||||
Exception,
|
||||
_("Failed to switch to window %d"),
|
||||
kErrorTypeException,
|
||||
"Failed to switch to window %d",
|
||||
window);
|
||||
}
|
||||
}
|
||||
@@ -644,8 +648,8 @@ void nvim_set_current_tabpage(Tabpage tabpage, Error *err)
|
||||
goto_tabpage_tp(tp, true, true);
|
||||
if (!try_end(err) && tp != curtab) {
|
||||
api_set_error(err,
|
||||
Exception,
|
||||
_("Failed to switch to tabpage %d"),
|
||||
kErrorTypeException,
|
||||
"Failed to switch to tabpage %d",
|
||||
tabpage);
|
||||
}
|
||||
}
|
||||
@@ -699,6 +703,24 @@ Dictionary nvim_get_color_map(void)
|
||||
}
|
||||
|
||||
|
||||
/// Gets the current mode.
|
||||
/// mode: Mode string. |mode()|
|
||||
/// blocking: true if Nvim is waiting for input.
|
||||
///
|
||||
/// @returns Dictionary { "mode": String, "blocking": Boolean }
|
||||
Dictionary nvim_get_mode(void)
|
||||
FUNC_API_SINCE(2) FUNC_API_ASYNC
|
||||
{
|
||||
Dictionary rv = ARRAY_DICT_INIT;
|
||||
char *modestr = get_mode();
|
||||
bool blocked = input_blocking();
|
||||
|
||||
PUT(rv, "mode", STRING_OBJ(cstr_as_string(modestr)));
|
||||
PUT(rv, "blocking", BOOLEAN_OBJ(blocked));
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
Array nvim_get_api_info(uint64_t channel_id)
|
||||
FUNC_API_SINCE(1) FUNC_API_ASYNC FUNC_API_NOEVAL
|
||||
{
|
||||
@@ -743,30 +765,30 @@ Array nvim_call_atomic(uint64_t channel_id, Array calls, Error *err)
|
||||
for (i = 0; i < calls.size; i++) {
|
||||
if (calls.items[i].type != kObjectTypeArray) {
|
||||
api_set_error(err,
|
||||
Validation,
|
||||
_("All items in calls array must be arrays"));
|
||||
kErrorTypeValidation,
|
||||
"All items in calls array must be arrays");
|
||||
goto validation_error;
|
||||
}
|
||||
Array call = calls.items[i].data.array;
|
||||
if (call.size != 2) {
|
||||
api_set_error(err,
|
||||
Validation,
|
||||
_("All items in calls array must be arrays of size 2"));
|
||||
kErrorTypeValidation,
|
||||
"All items in calls array must be arrays of size 2");
|
||||
goto validation_error;
|
||||
}
|
||||
|
||||
if (call.items[0].type != kObjectTypeString) {
|
||||
api_set_error(err,
|
||||
Validation,
|
||||
_("name must be String"));
|
||||
kErrorTypeValidation,
|
||||
"Name must be String");
|
||||
goto validation_error;
|
||||
}
|
||||
String name = call.items[0].data.string;
|
||||
|
||||
if (call.items[1].type != kObjectTypeArray) {
|
||||
api_set_error(err,
|
||||
Validation,
|
||||
_("args must be Array"));
|
||||
kErrorTypeValidation,
|
||||
"Args must be Array");
|
||||
goto validation_error;
|
||||
}
|
||||
Array args = call.items[1].data.array;
|
||||
@@ -774,7 +796,7 @@ Array nvim_call_atomic(uint64_t channel_id, Array calls, Error *err)
|
||||
MsgpackRpcRequestHandler handler = msgpack_rpc_get_handler_for(name.data,
|
||||
name.size);
|
||||
Object result = handler.fn(channel_id, args, &nested_error);
|
||||
if (nested_error.set) {
|
||||
if (ERROR_SET(&nested_error)) {
|
||||
// error handled after loop
|
||||
break;
|
||||
}
|
||||
@@ -783,7 +805,7 @@ Array nvim_call_atomic(uint64_t channel_id, Array calls, Error *err)
|
||||
}
|
||||
|
||||
ADD(rv, ARRAY_OBJ(results));
|
||||
if (nested_error.set) {
|
||||
if (ERROR_SET(&nested_error)) {
|
||||
Array errval = ARRAY_DICT_INIT;
|
||||
ADD(errval, INTEGER_OBJ((Integer)i));
|
||||
ADD(errval, INTEGER_OBJ(nested_error.type));
|
||||
@@ -792,10 +814,12 @@ Array nvim_call_atomic(uint64_t channel_id, Array calls, Error *err)
|
||||
} else {
|
||||
ADD(rv, NIL);
|
||||
}
|
||||
return rv;
|
||||
goto theend;
|
||||
|
||||
validation_error:
|
||||
api_free_array(results);
|
||||
theend:
|
||||
api_clear_error(&nested_error);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user