0
0
mirror of https://github.com/vim/vim.git synced 2025-10-03 05:14:07 -04:00

patch 8.2.4019: Vim9: import mechanism is too complicated

Problem:    Vim9: import mechanism is too complicated.
Solution:   Do not use the Javascript mechanism but a much simpler one.
This commit is contained in:
Bram Moolenaar
2022-01-06 21:10:28 +00:00
parent 18f4740f04
commit d5f400c607
16 changed files with 479 additions and 674 deletions

View File

@@ -1172,47 +1172,43 @@ def Undo_export_script_lines()
enddef
def Test_vim9_import_export()
writefile(s:export_script_lines, 'Xexport.vim')
var import_script_lines =<< trim END
vim9script
import {exported, Exported, ExportedValue} from './Xexport.vim'
g:exported1 = exported
exported += 3
g:exported2 = exported
g:exported3 = ExportedValue()
var dir = './'
var ext = ".vim"
import dir .. 'Xexport' .. ext as expo
import ExportedInc from './Xexport.vim'
ExportedInc()
g:exported_i1 = exported
g:exported_i2 = ExportedValue()
g:exported1 = expo.exported
expo.exported += 3
g:exported2 = expo.exported
g:exported3 = expo.ExportedValue()
exported = 11
g:exported_s1 = exported
g:exported_s2 = ExportedValue()
expo.ExportedInc()
g:exported_i1 = expo.exported
g:exported_i2 = expo.ExportedValue()
g:imported_func = Exported()
expo.exported = 11
g:exported_s1 = expo.exported
g:exported_s2 = expo.ExportedValue()
g:imported_func = expo.Exported()
def GetExported(): string
var local_dict = {ref: Exported}
var local_dict = {ref: expo.Exported}
return local_dict.ref()
enddef
g:funcref_result = GetExported()
var dir = './'
var ext = ".vim"
import {exp_name} from dir .. 'Xexport' .. ext
g:imported_name = exp_name
exp_name ..= ' Doe'
g:imported_name_appended = exp_name
g:exported_later = exported
g:imported_name = expo.exp_name
expo.exp_name ..= ' Doe'
g:imported_name_appended = expo.exp_name
g:exported_later = expo.exported
import theList from './Xexport.vim'
theList->add(2)
assert_equal([1, 2], theList)
expo.theList->add(2)
assert_equal([1, 2], expo.theList)
END
writefile(import_script_lines, 'Ximport.vim')
writefile(s:export_script_lines, 'Xexport.vim')
source Ximport.vim
assert_equal('bobbie', g:result)
@@ -1248,16 +1244,12 @@ def Test_vim9_import_export()
# similar, with line breaks
var import_line_break_script_lines =<< trim END
vim9script
import {
exported,
Exported,
}
from
'./Xexport.vim'
g:exported = exported
exported += 7
g:exported_added = exported
g:imported_func = Exported()
import './Xexport.vim'
as expo
g:exported = expo.exported
expo.exported += 7
g:exported_added = expo.exported
g:imported_func = expo.Exported()
END
writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
source Ximport_lbr.vim
@@ -1275,7 +1267,7 @@ def Test_vim9_import_export()
var import_star_as_lines =<< trim END
vim9script
import * as Export from './Xexport.vim'
import './Xexport.vim' as Export
def UseExport()
g:exported_def = Export.exported
enddef
@@ -1294,7 +1286,7 @@ def Test_vim9_import_export()
var import_star_as_lines_no_dot =<< trim END
vim9script
import * as Export from './Xexport.vim'
import './Xexport.vim' as Export
def Func()
var dummy = 1
var imported = Export + dummy
@@ -1306,7 +1298,7 @@ def Test_vim9_import_export()
var import_star_as_lines_dot_space =<< trim END
vim9script
import * as Export from './Xexport.vim'
import './Xexport.vim' as Export
def Func()
var imported = Export . exported
enddef
@@ -1317,8 +1309,8 @@ def Test_vim9_import_export()
var import_func_duplicated =<< trim END
vim9script
import ExportedInc from './Xexport.vim'
import ExportedInc from './Xexport.vim'
import './Xexport.vim' as expo
import './Xexport.vim' as expo
ExportedInc()
END
@@ -1327,9 +1319,9 @@ def Test_vim9_import_export()
var import_star_as_duplicated =<< trim END
vim9script
import * as Export from './Xexport.vim'
import './Xexport.vim' as Export
var some = 'other'
import * as Export from './Xexport.vim'
import './Xexport.vim' as Export
defcompile
END
writefile(import_star_as_duplicated, 'Ximport.vim')
@@ -1337,7 +1329,7 @@ def Test_vim9_import_export()
var import_star_as_lines_script_no_dot =<< trim END
vim9script
import * as Export from './Xexport.vim'
import './Xexport.vim' as Export
g:imported_script = Export exported
END
writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
@@ -1345,7 +1337,7 @@ def Test_vim9_import_export()
var import_star_as_lines_script_space_after_dot =<< trim END
vim9script
import * as Export from './Xexport.vim'
import './Xexport.vim' as Export
g:imported_script = Export. exported
END
writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
@@ -1353,7 +1345,7 @@ def Test_vim9_import_export()
var import_star_as_lines_missing_name =<< trim END
vim9script
import * as Export from './Xexport.vim'
import './Xexport.vim' as Export
def Func()
var imported = Export.
enddef
@@ -1364,10 +1356,8 @@ def Test_vim9_import_export()
var import_star_as_lbr_lines =<< trim END
vim9script
import *
import './Xexport.vim'
as Export
from
'./Xexport.vim'
def UseExport()
g:exported = Export.exported
enddef
@@ -1378,44 +1368,20 @@ def Test_vim9_import_export()
assert_equal(18, g:exported)
unlet g:exported
var import_star_lines =<< trim END
vim9script
import * from './Xexport.vim'
END
writefile(import_star_lines, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
# try to import something that exists but is not exported
# try to use something that exists but is not exported
var import_not_exported_lines =<< trim END
vim9script
import name from './Xexport.vim'
import './Xexport.vim' as expo
echo expo.name
END
writefile(import_not_exported_lines, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E1049:', '', 3, 'Ximport.vim')
# try to import something that is already defined
var import_already_defined =<< trim END
vim9script
var exported = 'something'
import exported from './Xexport.vim'
END
writefile(import_already_defined, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
# try to import something that is already defined
import_already_defined =<< trim END
vim9script
var exported = 'something'
import * as exported from './Xexport.vim'
END
writefile(import_already_defined, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
# try to import something that is already defined
import_already_defined =<< trim END
vim9script
var exported = 'something'
import {exported} from './Xexport.vim'
import './Xexport.vim' as exported
END
writefile(import_already_defined, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
@@ -1423,9 +1389,9 @@ def Test_vim9_import_export()
# try changing an imported const
var import_assign_to_const =<< trim END
vim9script
import CONST from './Xexport.vim'
import './Xexport.vim' as expo
def Assign()
CONST = 987
expo.CONST = 987
enddef
defcompile
END
@@ -1435,54 +1401,39 @@ def Test_vim9_import_export()
# try changing an imported final
var import_assign_to_final =<< trim END
vim9script
import theList from './Xexport.vim'
import './Xexport.vim' as expo
def Assign()
theList = [2]
expo.theList = [2]
enddef
defcompile
END
writefile(import_assign_to_final, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
# import a very long name, requires making a copy
var import_long_name_lines =<< trim END
var import_no_as_lines =<< trim END
vim9script
import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
import './Xexport.vim' name
END
writefile(import_long_name_lines, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
var import_no_from_lines =<< trim END
vim9script
import name './Xexport.vim'
END
writefile(import_no_from_lines, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
writefile(import_no_as_lines, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
var import_invalid_string_lines =<< trim END
vim9script
import name from Xexport.vim
import Xexport.vim
END
writefile(import_invalid_string_lines, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
var import_wrong_name_lines =<< trim END
vim9script
import name from './XnoExport.vim'
import './XnoExport.vim'
END
writefile(import_wrong_name_lines, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
var import_missing_comma_lines =<< trim END
vim9script
import {exported name} from './Xexport.vim'
END
writefile(import_missing_comma_lines, 'Ximport3.vim')
assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
var import_redefining_lines =<< trim END
vim9script
import exported from './Xexport.vim'
import './Xexport.vim' as exported
var exported = 5
END
writefile(import_redefining_lines, 'Ximport.vim')
@@ -1490,19 +1441,19 @@ def Test_vim9_import_export()
var import_assign_wrong_type_lines =<< trim END
vim9script
import exported from './Xexport.vim'
exported = 'xxx'
import './Xexport.vim' as expo
expo.exported = 'xxx'
END
writefile(import_assign_wrong_type_lines, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
var import_assign_const_lines =<< trim END
vim9script
import CONST from './Xexport.vim'
CONST = 4321
import './Xexport.vim' as expo
expo.CONST = 4321
END
writefile(import_assign_const_lines, 'Ximport.vim')
assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3)
assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3)
delete('Ximport.vim')
delete('Ximport3.vim')
@@ -1541,12 +1492,12 @@ def Test_import_funcref()
lines =<< trim END
vim9script
import {G} from './Xlib.vim'
const Foo = G()
import './Xlib.vim' as lib
const Foo = lib.G()
assert_equal(42, Foo)
def DoTest()
const Goo = G()
const Goo = lib.G()
assert_equal(42, Goo)
enddef
DoTest()
@@ -1559,30 +1510,30 @@ enddef
def Test_import_star_fails()
writefile([], 'Xfoo.vim')
var lines =<< trim END
import * as foo from './Xfoo.vim'
import './Xfoo.vim' as foo
foo = 'bar'
END
CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
lines =<< trim END
vim9script
import * as foo from './Xfoo.vim'
import './Xfoo.vim' as foo
var that = foo
END
CheckScriptFailure(lines, 'E1029: Expected ''.''')
lines =<< trim END
vim9script
import * as 9foo from './Xfoo.vim'
import './Xfoo.vim' as 9foo
END
CheckScriptFailure(lines, 'E1047:')
lines =<< trim END
vim9script
import * as the#foo from './Xfoo.vim'
import './Xfoo.vim' as the#foo
END
CheckScriptFailure(lines, 'E1047:')
lines =<< trim END
vim9script
import * as g:foo from './Xfoo.vim'
import './Xfoo.vim' as g:foo
END
CheckScriptFailure(lines, 'E1047:')
@@ -1597,53 +1548,13 @@ def Test_import_star_fails()
END
writefile([], 'Xthat.vim')
lines =<< trim END
import * as That from './Xthat.vim'
import './Xthat.vim' as That
That()
END
CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
delete('Xthat.vim')
enddef
def Test_import_as()
var export_lines =<< trim END
vim9script
export var one = 1
export var yes = 'yes'
export var slist: list<string>
END
writefile(export_lines, 'XexportAs')
var import_lines =<< trim END
vim9script
var one = 'notused'
var yes = 777
import one as thatOne from './XexportAs'
assert_equal(1, thatOne)
import yes as yesYes from './XexportAs'
assert_equal('yes', yesYes)
END
CheckScriptSuccess(import_lines)
import_lines =<< trim END
vim9script
import {one as thatOne, yes as yesYes} from './XexportAs'
assert_equal(1, thatOne)
assert_equal('yes', yesYes)
assert_fails('echo one', 'E121:')
assert_fails('echo yes', 'E121:')
END
CheckScriptSuccess(import_lines)
import_lines =<< trim END
vim9script
import {slist as impSlist} from './XexportAs'
impSlist->add(123)
END
CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number')
delete('XexportAs')
enddef
func g:Trigger()
source Ximport.vim
return "echo 'yes'\<CR>"
@@ -1661,8 +1572,8 @@ def Test_import_export_expr_map()
var import_lines =<< trim END
vim9script
import That from './Xexport_that.vim'
assert_equal('yes', That())
import './Xexport_that.vim' as that
assert_equal('yes', that.That())
END
writefile(import_lines, 'Ximport.vim')
@@ -1685,8 +1596,8 @@ def Test_import_in_filetype()
var import_lines =<< trim END
vim9script
import That from './Xexport_ft.vim'
assert_equal('yes', That)
import './Xexport_ft.vim' as ft
assert_equal('yes', ft.That)
g:did_load_mytpe = 1
END
writefile(import_lines, 'ftplugin/qf.vim')
@@ -1704,30 +1615,32 @@ def Test_import_in_filetype()
&rtp = save_rtp
enddef
def Test_use_import_in_mapping()
var lines =<< trim END
vim9script
export def Funcx()
g:result = 42
enddef
END
writefile(lines, 'XsomeExport.vim')
lines =<< trim END
vim9script
import Funcx from './XsomeExport.vim'
nnoremap <F3> :call <sid>Funcx()<cr>
END
writefile(lines, 'Xmapscript.vim')
source Xmapscript.vim
feedkeys("\<F3>", "xt")
assert_equal(42, g:result)
unlet g:result
delete('XsomeExport.vim')
delete('Xmapscript.vim')
nunmap <F3>
enddef
" FIXME
"def Test_use_import_in_mapping()
" var lines =<< trim END
" vim9script
" export def Funcx()
" g:result = 42
" enddef
" END
" writefile(lines, 'XsomeExport.vim')
" lines =<< trim END
" vim9script
" import './XsomeExport.vim' as some
" var Funcy = some.Funcx
" nnoremap <F3> :call <sid>Funcy()<cr>
" END
" writefile(lines, 'Xmapscript.vim')
"
" source Xmapscript.vim
" feedkeys("\<F3>", "xt")
" assert_equal(42, g:result)
"
" unlet g:result
" delete('XsomeExport.vim')
" delete('Xmapscript.vim')
" nunmap <F3>
"enddef
def Test_vim9script_mix()
var lines =<< trim END
@@ -1754,7 +1667,6 @@ def Test_vim9script_fails()
CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
CheckScriptFailure(['export var some = 123'], 'E1042:')
CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
@@ -1802,14 +1714,13 @@ def Test_vim9script_reload_noclear()
vim9script noclear
g:loadCount += 1
var s:reloaded = 'init'
import exported from './XExportReload'
import './XExportReload' as exp
def Again(): string
return 'again'
enddef
import TheFunc from './XExportReload'
TheFunc()
exp.TheFunc()
if exists('s:loaded') | finish | endif
var s:loaded = true
@@ -1817,7 +1728,7 @@ def Test_vim9script_reload_noclear()
var s:notReloaded = 'yes'
s:reloaded = 'first'
def g:Values(): list<string>
return [s:reloaded, s:notReloaded, Again(), Once(), exported]
return [s:reloaded, s:notReloaded, Again(), Once(), exp.exported]
enddef
def Once(): string
@@ -2022,14 +1933,14 @@ def Test_vim9script_funcref()
var lines =<< trim END
vim9script
import FastSort from './Xsort.vim'
import './Xsort.vim'
def Test()
g:result = FastSort()
g:result = Xsort.FastSort()
enddef
Test()
# using a function imported with "as"
import * as anAlias from './Xsort.vim'
import './Xsort.vim' as anAlias
assert_equal('yes', anAlias.GetString('yes'))
# using the function from a compiled function
@@ -2075,13 +1986,13 @@ def Test_vim9script_funcref_other_script()
var lines =<< trim END
vim9script
import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
import './Xfilter.vim' as filter
def Test()
var x: list<number> = FastFilter()
var x: list<number> = filter.FastFilter()
enddef
Test()
def TestDirect()
var x: list<number> = FastFilterDirect()
var x: list<number> = filter.FastFilterDirect()
enddef
TestDirect()
END
@@ -2155,11 +2066,11 @@ enddef
def Test_import_absolute()
var import_lines = [
'vim9script',
'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
'def UseExported()',
' g:imported_abs = exported',
' exported = 8888',
' g:imported_after = exported',
' g:imported_abs = abs.exported',
' abs.exported = 8888',
' g:imported_after = abs.exported',
'enddef',
'UseExported()',
'g:import_disassembled = execute("disass UseExported")',
@@ -2172,13 +2083,13 @@ def Test_import_absolute()
assert_equal(9876, g:imported_abs)
assert_equal(8888, g:imported_after)
assert_match('<SNR>\d\+_UseExported\_s*' ..
'g:imported_abs = exported\_s*' ..
'g:imported_abs = abs.exported\_s*' ..
'0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
'1 STOREG g:imported_abs\_s*' ..
'exported = 8888\_s*' ..
'abs.exported = 8888\_s*' ..
'2 PUSHNR 8888\_s*' ..
'3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
'g:imported_after = exported\_s*' ..
'g:imported_after = abs.exported\_s*' ..
'4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
'5 STOREG g:imported_after',
g:import_disassembled)
@@ -2194,8 +2105,8 @@ enddef
def Test_import_rtp()
var import_lines = [
'vim9script',
'import exported from "Xexport_rtp.vim"',
'g:imported_rtp = exported',
'import "Xexport_rtp.vim" as rtp',
'g:imported_rtp = rtp.exported',
]
writefile(import_lines, 'Ximport_rtp.vim')
mkdir('import', 'p')
@@ -2225,9 +2136,9 @@ def Test_import_compile_error()
var import_lines = [
'vim9script',
'import ExpFunc from "./Xexported.vim"',
'import "./Xexported.vim" as expo',
'def ImpFunc()',
' echo ExpFunc()',
' echo expo.ExpFunc()',
'enddef',
'defcompile',
]
@@ -2279,16 +2190,16 @@ def Test_func_overrules_import_fails()
var lines =<< trim END
vim9script
import Func from './XexportedFunc.vim'
import './XexportedFunc.vim' as Func
def Func()
echo 'local to function'
enddef
END
CheckScriptFailure(lines, 'E1041:')
CheckScriptFailure(lines, 'E1236:')
lines =<< trim END
vim9script
import Func from './XexportedFunc.vim'
import './XexportedFunc.vim' as Func
def Outer()
def Func()
echo 'local to function'
@@ -2296,7 +2207,7 @@ def Test_func_overrules_import_fails()
enddef
defcompile
END
CheckScriptFailure(lines, 'E1073:')
CheckScriptFailure(lines, 'E1236:')
delete('XexportedFunc.vim')
enddef
@@ -3941,15 +3852,15 @@ def Test_source_vim9_from_legacy()
call assert_equal('global', global)
call assert_equal('global', g:global)
" imported variable becomes script-local
import exported from './Xvim9_script.vim'
call assert_equal('exported', s:exported)
call assert_false(exists('exported'))
"" imported variable becomes script-local
"import exported from './Xvim9_script.vim'
"call assert_equal('exported', s:exported)
"call assert_false(exists('exported'))
" imported function becomes script-local
import GetText from './Xvim9_script.vim'
call assert_equal('text', s:GetText())
call assert_false(exists('*GetText'))
"" imported function becomes script-local
"import GetText from './Xvim9_script.vim'
"call assert_equal('text', s:GetText())
"call assert_false(exists('*GetText'))
END
writefile(legacy_lines, 'Xlegacy_script.vim')
@@ -4248,7 +4159,8 @@ def Test_cmdline_win()
writefile(export_lines, 'rtp/syntax/Xexport.vim')
var import_lines =<< trim END
vim9script
import That from './Xexport.vim'
import './Xexport.vim' as exp
echo exp.That
END
writefile(import_lines, 'rtp/syntax/vim.vim')
var save_rtp = &rtp
@@ -4594,36 +4506,36 @@ def Test_script_var_gone_when_sourced_twice()
unlet g:guard
enddef
def Test_import_gone_when_sourced_twice()
var exportlines =<< trim END
vim9script
if exists('g:guard')
finish
endif
g:guard = 1
export var name = 'someName'
END
writefile(exportlines, 'XexportScript.vim')
var lines =<< trim END
vim9script
import name from './XexportScript.vim'
def g:GetName(): string
return name
enddef
END
writefile(lines, 'XscriptImport.vim')
so XscriptImport.vim
assert_equal('someName', g:GetName())
so XexportScript.vim
assert_fails('call g:GetName()', 'E1149:')
delfunc g:GetName
delete('XexportScript.vim')
delete('XscriptImport.vim')
unlet g:guard
enddef
"def Test_import_gone_when_sourced_twice()
" var exportlines =<< trim END
" vim9script
" if exists('g:guard')
" finish
" endif
" g:guard = 1
" export var name = 'someName'
" END
" writefile(exportlines, 'XexportScript.vim')
"
" var lines =<< trim END
" vim9script
" import name from './XexportScript.vim'
" def g:GetName(): string
" return name
" enddef
" END
" writefile(lines, 'XscriptImport.vim')
" so XscriptImport.vim
" assert_equal('someName', g:GetName())
"
" so XexportScript.vim
" assert_fails('call g:GetName()', 'E1149:')
"
" delfunc g:GetName
" delete('XexportScript.vim')
" delete('XscriptImport.vim')
" unlet g:guard
"enddef
def Test_unsupported_commands()
var lines =<< trim END