Closed kat0h closed 2 years ago
funcref/functionで参照をとった場合についても同様のようです。
基本的にVim scriptでは関数名が小文字から始まることは許されないのですが
についてですが、autoload関数であれば小文字もできますね。
参照が取れるか、はまた別かもですが。
autload関数 確かにそうでした。ご指摘ありがとうございます。 autoload関数についても確認してみます。
autoload関数は問題なく読み込めるようでした
vim9script
var ref = funcref(test9#func)
var ref2 = funcref('test9#func')
var ref3 = test9#func
ref()
ref2()
ref3()
echo rand()
function! s:func()
echo "s:func() was called"
endfunction
def! s:C1()
s:func()
enddef
def! s:C2()
var Ref2 = function('s:func')
Ref2()
enddef
def! s:C3()
var Ref3 = function(s:func)
Ref3()
enddef
def! s:C4()
var Ref1 = s:func
Ref1()
enddef
call s:C1()
call s:C2()
call s:C3()
call s:C4()
こちらのコードが通るようにしてみようかなと考えています
diff --git a/src/vim9expr.c b/src/vim9expr.c
index b2bb405f6..5acc09c5a 100644
--- a/src/vim9expr.c
+++ b/src/vim9expr.c
@@ -451,8 +451,7 @@ compile_load(
vim_free(name);
return FAIL;
}
- if (is_expr && ASCII_ISUPPER(*name)
- && find_func(name, FALSE) != NULL)
+ if (is_expr && find_func(name, FALSE) != NULL)
res = generate_funcref(cctx, name, FALSE);
else
res = compile_load_scriptvar(cctx, name,
これでs:funcが読めない問題は解決されるはず? (ASCII_ISUPPERがわざわざ入っているのでもしかしたら仕様かもしれないし、仕様でないかもしれない)
diff --git a/src/userfunc.c b/src/userfunc.c
index ae3e20202..6c69c3ec7 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -3791,6 +3791,7 @@ trans_function_name(
int prefix_g = FALSE;
lval_T lv;
int vim9script = in_vim9script();
+ int script_is_vim9 = current_script_is_vim9();
int vim9_local;
if (fdp != NULL)
@@ -3995,7 +3996,8 @@ trans_function_name(
{
if (!vim9_local)
{
- if (vim9script && lead == 2 && !ASCII_ISUPPER(*lv.ll_name))
+ if (vim9script && lead == 2 && !ASCII_ISUPPER(*lv.ll_name)
+ && script_is_vim9)
{
semsg(_(e_function_name_must_start_with_capital_str), start);
goto theend;
diff --git a/src/vim9expr.c b/src/vim9expr.c
index b2bb405f6..5acc09c5a 100644
--- a/src/vim9expr.c
+++ b/src/vim9expr.c
@@ -451,8 +451,7 @@ compile_load(
vim_free(name);
return FAIL;
}
- if (is_expr && ASCII_ISUPPER(*name)
- && find_func(name, FALSE) != NULL)
+ if (is_expr && find_func(name, FALSE) != NULL)
res = generate_funcref(cctx, name, FALSE);
else
res = compile_load_scriptvar(cctx, name,
多分両方の問題が解決しました
https://github.com/vim-jp/issues/issues/1391#issuecomment-1214299081 ひとまずこちらのコードが通るようになりました
パッチが取り込まれましたのでこのissueはcloseします ご協力ありがとうございました! https://github.com/vim/vim/commit/948a3894d98f5e2a6e7fc57189fe9c2a5919eebf
不具合の内容
例1
関数名が小文字の場合
関数名が大文字の場合
スクリプトローカルの関数名が小文字から始まる場合と大文字から始まる場合で挙動が変わる。
例2
関数名が小文字の場合
関数名が小文字の場合
期待動作
上記コードの関数名が大文字の場合と同じ動作
Vimのバージョン
9.0 patch 1-176
OSの種類/ディストリ/バージョン
その他
おそらく、Vim9 scriptのコンパイラが変数名を解決するロジックに誤りがあるのではないかと考えています。 例2のs:Hogeの場合は関数としてRefに関数として代入している一方、s:hogeの場合は変数として代入しています。
基本的にVim scriptでは関数名が小文字から始まることは許されないのですが、(autoload関数でも小文字から始めることができる 2022-08-11) VIm9 scriptのコンパイラではこのことが考慮されておらず、うまくうごかない(と考えています)のではないでしょうか。s:
に関しては例外で小文字から始まることが許可されます。