From e9493c6aa4942da7e3a62c118195ea07df815dc2 Mon Sep 17 00:00:00 2001 From: Scott McKendry <39483124+scottmckendry@users.noreply.github.com> Date: Sat, 12 Oct 2024 04:06:27 +1300 Subject: [PATCH] fix(ffi): handle cargo library naming conventions for windows binaries (#74) * fix(ffi): handle cargo library naming conventions for windows binaries * fix(ffi): check for built binary both with and without lib prefix * fix: more reliable path substitution for windows binary * fix(ffi): sed command in build script --- build-ffi-bindings.sh | 2 +- lua/blink/cmp/fuzzy/download.lua | 9 ++- lua/blink/cmp/fuzzy/ffi.lua | 129 ++++++++++++++++--------------- 3 files changed, 75 insertions(+), 65 deletions(-) diff --git a/build-ffi-bindings.sh b/build-ffi-bindings.sh index ad8b00b5..cbaa412b 100755 --- a/build-ffi-bindings.sh +++ b/build-ffi-bindings.sh @@ -44,4 +44,4 @@ end $(cat "$(pwd)/lua/blink/cmp/fuzzy/ffi.lua") " > "$(pwd)/lua/blink/cmp/fuzzy/ffi.lua" -sed -i "s/ffi\.load.'blink-cmp-fuzzy'./ffi.load(debug.getinfo(1).source:match('@?(.*\/)') .. '..\/..\/..\/..\/target\/release\/libblink_cmp_fuzzy\' .. get_shared_lib_extension())/" "$(pwd)/lua/blink/cmp/fuzzy/ffi.lua" +sed -i "s|local rust = ffi\.load('blink-cmp-fuzzy')|local ok, rust = pcall(function() return ffi.load(debug.getinfo(1).source:match('@?(.*/)') .. '../../../../target/release/libblink_cmp_fuzzy' .. get_shared_lib_extension()) end)\nif not ok then\n rust = ffi.load(debug.getinfo(1).source:match('@?(.*/)') .. '../../../../target/release/blink_cmp_fuzzy' .. get_shared_lib_extension())\nend|" "$(pwd)/lua/blink/cmp/fuzzy/ffi.lua" diff --git a/lua/blink/cmp/fuzzy/download.lua b/lua/blink/cmp/fuzzy/download.lua index d310a70e..7a3a31a9 100644 --- a/lua/blink/cmp/fuzzy/download.lua +++ b/lua/blink/cmp/fuzzy/download.lua @@ -58,7 +58,14 @@ end --- @param cb fun(downloaded: boolean) function download.is_downloaded(cb) - return vim.uv.fs_stat(lib_path, function(err) cb(not err) end) + vim.uv.fs_stat(lib_path, function(err) + if not err then + cb(true) + else + -- If not found, check without 'lib' prefix + vim.uv.fs_stat(string.gsub(lib_path, 'libblink_cmp_fuzzy', 'blink_cmp_fuzzy'), function(error) cb(not error) end) + end + end) end --- @param cb fun(err: string | nil, tag: string | nil) diff --git a/lua/blink/cmp/fuzzy/ffi.lua b/lua/blink/cmp/fuzzy/ffi.lua index b424d715..bcc1c5a5 100644 --- a/lua/blink/cmp/fuzzy/ffi.lua +++ b/lua/blink/cmp/fuzzy/ffi.lua @@ -19,40 +19,24 @@ end + typedef struct { - const char * *ptr; - size_t len; - size_t capacity; -} blink_cmp_fuzzy__Vec___string_ptr; + const int32_t *ptr; +} blink_cmp_fuzzy__Option_int32_t; typedef struct { const int32_t *ptr; size_t len; size_t capacity; } blink_cmp_fuzzy__Vec_int32_t; + typedef struct { - const int32_t *ptr; -} blink_cmp_fuzzy__Option_int32_t; -typedef struct { - const uint32_t *ptr; + const char * *ptr; size_t len; size_t capacity; -} blink_cmp_fuzzy__Vec_uint32_t; - - - +} blink_cmp_fuzzy__Vec___string_ptr; typedef struct { const char * *ptr; } blink_cmp_fuzzy__Option___string_ptr; - - typedef struct { - const char * label; - const blink_cmp_fuzzy__Option___string_ptr sort_text; - const blink_cmp_fuzzy__Option___string_ptr filter_text; - const uint32_t kind; - const blink_cmp_fuzzy__Option_int32_t score_offset; - const char * source; - } blink_cmp_fuzzy__LspItem; - typedef struct { const blink_cmp_fuzzy__Vec___string_ptr *ptr; } blink_cmp_fuzzy__Option_Vec___string_ptr; @@ -65,6 +49,22 @@ typedef struct { const blink_cmp_fuzzy__Vec___string_ptr sorts; } blink_cmp_fuzzy__FuzzyOptions; + + + typedef struct { + const char * label; + const blink_cmp_fuzzy__Option___string_ptr sort_text; + const blink_cmp_fuzzy__Option___string_ptr filter_text; + const uint32_t kind; + const blink_cmp_fuzzy__Option_int32_t score_offset; + const char * source; + } blink_cmp_fuzzy__LspItem; + +typedef struct { + const uint32_t *ptr; + size_t len; + size_t capacity; +} blink_cmp_fuzzy__Vec_uint32_t; int32_t init_db( const char *, int8_t*); @@ -97,37 +97,33 @@ int32_t __gc_get_words( ]] - local rust = ffi.load(debug.getinfo(1).source:match('@?(.*/)') .. '../../../../target/release/libblink_cmp_fuzzy' .. get_shared_lib_extension()) + local ok, rust = pcall(function() return ffi.load(debug.getinfo(1).source:match('@?(.*/)') .. '../../../../target/release/libblink_cmp_fuzzy' .. get_shared_lib_extension()) end) +if not ok then + rust = ffi.load(debug.getinfo(1).source:match('@?(.*/)') .. '../../../../target/release/blink_cmp_fuzzy' .. get_shared_lib_extension()) +end local M = {} -local __const_c_typename_int32_t = ffi.typeof("const int32_t[?]") -local __c_function_argument_int32_t = ffi.typeof("int32_t[?]") -local __c_mut_function_argument_int32_t = ffi.typeof("int32_t[?]") - - -local __const_c_typename___string_ptr = ffi.typeof("const char *[?]") -local __c_function_argument___string_ptr = ffi.typeof("const char *[?]") -local __c_mut_function_argument___string_ptr = ffi.typeof("char *[?]") +local __const_c_typename_bool = ffi.typeof("const int8_t[?]") +local __c_function_argument_bool = ffi.typeof("int8_t[?]") +local __c_mut_function_argument_bool = ffi.typeof("int8_t[?]") -local __const_c_typename_uint32_t = ffi.typeof("const uint32_t[?]") -local __c_function_argument_uint32_t = ffi.typeof("uint32_t[?]") -local __c_mut_function_argument_uint32_t = ffi.typeof("uint32_t[?]") +local __const_c_typename_size_t = ffi.typeof("const size_t[?]") +local __c_function_argument_size_t = ffi.typeof("size_t[?]") +local __c_mut_function_argument_size_t = ffi.typeof("size_t[?]") -local __typename_Vec___string_ptr = ffi.metatype("blink_cmp_fuzzy__Vec___string_ptr", {}) -local __const_c_typename_Vec___string_ptr = ffi.typeof("const blink_cmp_fuzzy__Vec___string_ptr[?]") -local __c_function_argument_Vec___string_ptr = ffi.typeof("const blink_cmp_fuzzy__Vec___string_ptr*[?]") -local __c_mut_function_argument_Vec___string_ptr = ffi.typeof("blink_cmp_fuzzy__Vec___string_ptr*[?]") +local __const_c_typename_uint16_t = ffi.typeof("const uint16_t[?]") +local __c_function_argument_uint16_t = ffi.typeof("uint16_t[?]") +local __c_mut_function_argument_uint16_t = ffi.typeof("uint16_t[?]") -local __typename_Vec_int32_t = ffi.metatype("blink_cmp_fuzzy__Vec_int32_t", {}) -local __const_c_typename_Vec_int32_t = ffi.typeof("const blink_cmp_fuzzy__Vec_int32_t[?]") -local __c_function_argument_Vec_int32_t = ffi.typeof("const blink_cmp_fuzzy__Vec_int32_t*[?]") -local __c_mut_function_argument_Vec_int32_t = ffi.typeof("blink_cmp_fuzzy__Vec_int32_t*[?]") +local __const_c_typename_int32_t = ffi.typeof("const int32_t[?]") +local __c_function_argument_int32_t = ffi.typeof("int32_t[?]") +local __c_mut_function_argument_int32_t = ffi.typeof("int32_t[?]") local __typename_Option_int32_t = ffi.metatype("blink_cmp_fuzzy__Option_int32_t", {}) @@ -136,25 +132,21 @@ local __c_function_argument_Option_int32_t = ffi.typeof("const blink_cmp_fuzzy__ local __c_mut_function_argument_Option_int32_t = ffi.typeof("blink_cmp_fuzzy__Option_int32_t*[?]") -local __typename_Vec_uint32_t = ffi.metatype("blink_cmp_fuzzy__Vec_uint32_t", {}) -local __const_c_typename_Vec_uint32_t = ffi.typeof("const blink_cmp_fuzzy__Vec_uint32_t[?]") -local __c_function_argument_Vec_uint32_t = ffi.typeof("const blink_cmp_fuzzy__Vec_uint32_t*[?]") -local __c_mut_function_argument_Vec_uint32_t = ffi.typeof("blink_cmp_fuzzy__Vec_uint32_t*[?]") - - -local __const_c_typename_size_t = ffi.typeof("const size_t[?]") -local __c_function_argument_size_t = ffi.typeof("size_t[?]") -local __c_mut_function_argument_size_t = ffi.typeof("size_t[?]") +local __typename_Vec_int32_t = ffi.metatype("blink_cmp_fuzzy__Vec_int32_t", {}) +local __const_c_typename_Vec_int32_t = ffi.typeof("const blink_cmp_fuzzy__Vec_int32_t[?]") +local __c_function_argument_Vec_int32_t = ffi.typeof("const blink_cmp_fuzzy__Vec_int32_t*[?]") +local __c_mut_function_argument_Vec_int32_t = ffi.typeof("blink_cmp_fuzzy__Vec_int32_t*[?]") -local __const_c_typename_bool = ffi.typeof("const int8_t[?]") -local __c_function_argument_bool = ffi.typeof("int8_t[?]") -local __c_mut_function_argument_bool = ffi.typeof("int8_t[?]") +local __const_c_typename___string_ptr = ffi.typeof("const char *[?]") +local __c_function_argument___string_ptr = ffi.typeof("const char *[?]") +local __c_mut_function_argument___string_ptr = ffi.typeof("char *[?]") -local __const_c_typename_uint16_t = ffi.typeof("const uint16_t[?]") -local __c_function_argument_uint16_t = ffi.typeof("uint16_t[?]") -local __c_mut_function_argument_uint16_t = ffi.typeof("uint16_t[?]") +local __typename_Vec___string_ptr = ffi.metatype("blink_cmp_fuzzy__Vec___string_ptr", {}) +local __const_c_typename_Vec___string_ptr = ffi.typeof("const blink_cmp_fuzzy__Vec___string_ptr[?]") +local __c_function_argument_Vec___string_ptr = ffi.typeof("const blink_cmp_fuzzy__Vec___string_ptr*[?]") +local __c_mut_function_argument_Vec___string_ptr = ffi.typeof("blink_cmp_fuzzy__Vec___string_ptr*[?]") local __typename_Option___string_ptr = ffi.metatype("blink_cmp_fuzzy__Option___string_ptr", {}) @@ -163,12 +155,6 @@ local __c_function_argument_Option___string_ptr = ffi.typeof("const blink_cmp_fu local __c_mut_function_argument_Option___string_ptr = ffi.typeof("blink_cmp_fuzzy__Option___string_ptr*[?]") -local __typename_LspItem = ffi.metatype("blink_cmp_fuzzy__LspItem", {}) -local __const_c_typename_LspItem = ffi.typeof("const blink_cmp_fuzzy__LspItem[?]") -local __c_function_argument_LspItem = ffi.typeof("const blink_cmp_fuzzy__LspItem*[?]") -local __c_mut_function_argument_LspItem = ffi.typeof("blink_cmp_fuzzy__LspItem*[?]") - - local __typename_Option_Vec___string_ptr = ffi.metatype("blink_cmp_fuzzy__Option_Vec___string_ptr", {}) local __const_c_typename_Option_Vec___string_ptr = ffi.typeof("const blink_cmp_fuzzy__Option_Vec___string_ptr[?]") local __c_function_argument_Option_Vec___string_ptr = ffi.typeof("const blink_cmp_fuzzy__Option_Vec___string_ptr*[?]") @@ -180,6 +166,23 @@ local __const_c_typename_FuzzyOptions = ffi.typeof("const blink_cmp_fuzzy__Fuzzy local __c_function_argument_FuzzyOptions = ffi.typeof("const blink_cmp_fuzzy__FuzzyOptions*[?]") local __c_mut_function_argument_FuzzyOptions = ffi.typeof("blink_cmp_fuzzy__FuzzyOptions*[?]") + +local __const_c_typename_uint32_t = ffi.typeof("const uint32_t[?]") +local __c_function_argument_uint32_t = ffi.typeof("uint32_t[?]") +local __c_mut_function_argument_uint32_t = ffi.typeof("uint32_t[?]") + + +local __typename_LspItem = ffi.metatype("blink_cmp_fuzzy__LspItem", {}) +local __const_c_typename_LspItem = ffi.typeof("const blink_cmp_fuzzy__LspItem[?]") +local __c_function_argument_LspItem = ffi.typeof("const blink_cmp_fuzzy__LspItem*[?]") +local __c_mut_function_argument_LspItem = ffi.typeof("blink_cmp_fuzzy__LspItem*[?]") + + +local __typename_Vec_uint32_t = ffi.metatype("blink_cmp_fuzzy__Vec_uint32_t", {}) +local __const_c_typename_Vec_uint32_t = ffi.typeof("const blink_cmp_fuzzy__Vec_uint32_t[?]") +local __c_function_argument_Vec_uint32_t = ffi.typeof("const blink_cmp_fuzzy__Vec_uint32_t*[?]") +local __c_mut_function_argument_Vec_uint32_t = ffi.typeof("blink_cmp_fuzzy__Vec_uint32_t*[?]") + function M.init_db( db_path) local __typeof = __c_mut_function_argument_bool