diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2014-09-07 20:40:07 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-09-12 13:25:28 -0300 |
commit | 2f566c83d9eee4a8097c9a18eb58dcef6adf894e (patch) | |
tree | a2e5ce0f973daab14237b66e8c023fe381a34e10 | |
parent | d5a60d17fbca33ca96124288e69937a276d3abda (diff) | |
download | rneovim-2f566c83d9eee4a8097c9a18eb58dcef6adf894e.tar.gz rneovim-2f566c83d9eee4a8097c9a18eb58dcef6adf894e.tar.bz2 rneovim-2f566c83d9eee4a8097c9a18eb58dcef6adf894e.zip |
api/msgpack-rpc: Parse type information from api/private/defs.h
Enhance msgpack-gen.lua to extract custom api type codes from the ObjectType
enum in api/private/defs.h. The type information is made available from the api
metadata and clients can use to correctly serialize/deserialize these types
using msgpack EXT type.
-rw-r--r-- | scripts/msgpack-gen.lua | 25 | ||||
-rw-r--r-- | src/nvim/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/nvim/api/private/defs.h | 20 |
3 files changed, 37 insertions, 12 deletions
diff --git a/scripts/msgpack-gen.lua b/scripts/msgpack-gen.lua index 36fe07896b..7da52432d6 100644 --- a/scripts/msgpack-gen.lua +++ b/scripts/msgpack-gen.lua @@ -38,9 +38,28 @@ assert(#arg >= 1) -- api metadata api = { functions = {}, - -- Helpers for object-oriented languages - classes = {'Buffer', 'Window', 'Tabpage'} + types = {} } + +-- Extract type codes from api/private/defs.h. The codes are values between +-- comment markers in the ObjectType enum +local typedefs_header = arg[1] +local input = io.open(typedefs_header, 'rb') +local reading_types = false +while true do + local line = input:read('*l'):gsub("^%s*(.-)%s*$", "%1") + if reading_types then + if line == '// end custom types' then + break + end + local type_name = line:gsub("^kObjectType(.-),$", "%1") + api.types[#api.types + 1] = type_name + else + reading_types = line == '// start custom types' + end +end +input:close() + -- names of all headers relative to the source root(for inclusion in the -- generated file) headers = {} @@ -48,7 +67,7 @@ headers = {} outputf = arg[#arg] -- read each input file, parse and append to the api metadata -for i = 1, #arg - 1 do +for i = 2, #arg - 1 do local full_path = arg[i] local parts = {} for part in string.gmatch(full_path, '[^/]+') do diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 83de3347bd..405cd20486 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -3,6 +3,7 @@ include(CheckLibraryExists) set(GENERATED_DIR ${PROJECT_BINARY_DIR}/src/nvim/auto) set(DISPATCH_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/msgpack-gen.lua) file(GLOB API_HEADERS api/*.h) +file(GLOB API_DEFS api/private/defs.h) set(MSGPACK_RPC_HEADER ${PROJECT_SOURCE_DIR}/src/nvim/os/msgpack_rpc.h) set(MSGPACK_DISPATCH ${GENERATED_DIR}/msgpack_dispatch.c) set(HEADER_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/gendeclarations.lua) @@ -123,9 +124,10 @@ foreach(sfile ${NEOVIM_SOURCES} endforeach() add_custom_command(OUTPUT ${MSGPACK_DISPATCH} - COMMAND ${LUA_PRG} ${DISPATCH_GENERATOR} ${API_HEADERS} ${MSGPACK_DISPATCH} + COMMAND ${LUA_PRG} ${DISPATCH_GENERATOR} ${API_DEFS} ${API_HEADERS} ${MSGPACK_DISPATCH} DEPENDS ${API_HEADERS} + ${API_DEFS} ${MSGPACK_RPC_HEADER} ${DISPATCH_GENERATOR} ) diff --git a/src/nvim/api/private/defs.h b/src/nvim/api/private/defs.h index 071563a628..689594f231 100644 --- a/src/nvim/api/private/defs.h +++ b/src/nvim/api/private/defs.h @@ -49,32 +49,36 @@ typedef struct { } Dictionary; typedef enum { +// The following comments are markers that msgpack-gen.lua uses to extract +// types, don't remove! +// start custom types + kObjectTypePosition, + kObjectTypeBuffer, + kObjectTypeWindow, + kObjectTypeTabpage, +// end custom types kObjectTypeNil, kObjectTypeBoolean, kObjectTypeInteger, kObjectTypeFloat, kObjectTypeString, - kObjectTypeBuffer, - kObjectTypeWindow, - kObjectTypeTabpage, kObjectTypeArray, kObjectTypeDictionary, - kObjectTypePosition, } ObjectType; struct object { ObjectType type; union { + Position position; + Buffer buffer; + Window window; + Tabpage tabpage; Boolean boolean; Integer integer; Float floating; String string; - Buffer buffer; - Window window; - Tabpage tabpage; Array array; Dictionary dictionary; - Position position; } data; }; |