summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2023-10-28 21:28:48 +0200
committerChristian Brabandt <cb@256bit.org>2023-10-28 21:31:53 +0200
commit171c50e0b0dd2608738bcc3809e5bc5e1e3cce35 (patch)
treef4c99dc54b33d07bcede75511160cd10c4541b93
parent8ebdbc9e6d80b707c2b2d923e702dc86bf902923 (diff)
patch 9.0.2080: vim9_script test too largev9.0.2080
Problem: vim9_script test too large Solution: split vim9 type alias test into separate test file Move type alias tests to a separate test file closes: #13447 Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--src/testdir/Make_all.mak6
-rw-r--r--src/testdir/test_vim9_script.vim533
-rw-r--r--src/testdir/test_vim9_typealias.vim539
-rw-r--r--src/version.c2
4 files changed, 545 insertions, 535 deletions
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 961718fd69..6b4d8df329 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -44,7 +44,8 @@ TEST_VIM9 = \
test_vim9_fails \
test_vim9_func \
test_vim9_import \
- test_vim9_script
+ test_vim9_script \
+ test_vim9_typealias
TEST_VIM9_RES = \
test_vim9_assign.res \
@@ -56,7 +57,8 @@ TEST_VIM9_RES = \
test_vim9_fails.res \
test_vim9_func.res \
test_vim9_import.res \
- test_vim9_script.res
+ test_vim9_script.res \
+ test_vim9_typealias.res
# Benchmark scripts.
SCRIPTS_BENCH = test_bench_regexp.res
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index f0f6ed9acb..b64f05e89d 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -4783,539 +4783,6 @@ def Test_multidefer_with_exception()
v9.CheckSourceSuccess(lines)
enddef
-" Test for :type command to create type aliases
-def Test_typealias()
- # Use type alias at script level
- var lines =<< trim END
- vim9script
- type ListOfStrings = list<string>
- def Foo(a: ListOfStrings): ListOfStrings
- return a
- enddef
- var b: ListOfStrings = ['a', 'b']
- assert_equal(['a', 'b'], b)
- assert_equal(['e', 'f'], Foo(['e', 'f']))
- assert_equal('typealias<list<string>>', typename(ListOfStrings))
- assert_equal(v:t_typealias, type(ListOfStrings))
- assert_equal('ListOfStrings', string(ListOfStrings))
- assert_equal(false, null == ListOfStrings)
- END
- v9.CheckSourceSuccess(lines)
-
- # Use type alias at def function level
- lines =<< trim END
- vim9script
- type ListOfStrings = list<string>
- def Foo(a: ListOfStrings): ListOfStrings
- return a
- enddef
- def Bar()
- var c: ListOfStrings = ['c', 'd']
- assert_equal(['c', 'd'], c)
- assert_equal(['e', 'f'], Foo(['e', 'f']))
- assert_equal('typealias<list<string>>', typename(ListOfStrings))
- assert_equal(v:t_typealias, type(ListOfStrings))
- assert_equal('ListOfStrings', string(ListOfStrings))
- assert_equal(false, null == ListOfStrings)
- enddef
- Bar()
- END
- v9.CheckSourceSuccess(lines)
-
- # Use :type outside a Vim9 script
- lines =<< trim END
- type Index = number
- END
- v9.CheckSourceFailure(lines, 'E1393: Type can only be defined in Vim9 script', 1)
-
- # Use :type without any arguments
- lines =<< trim END
- vim9script
- type
- END
- v9.CheckSourceFailure(lines, 'E1397: Missing type alias name', 2)
-
- # Use :type with a name but no type
- lines =<< trim END
- vim9script
- type MyType
- END
- v9.CheckSourceFailure(lines, "E398: Missing '=': ", 2)
-
- # Use :type with a name but no type following "="
- lines =<< trim END
- vim9script
- type MyType =
- END
- v9.CheckSourceFailure(lines, 'E1398: Missing type alias type', 2)
-
- # No space before or after "="
- lines =<< trim END
- vim9script
- type MyType=number
- END
- v9.CheckSourceFailure(lines, 'E1315: White space required after name: MyType=number', 2)
-
- # No space after "="
- lines =<< trim END
- vim9script
- type MyType =number
- END
- v9.CheckSourceFailure(lines, "E1069: White space required after '=': =number", 2)
-
- # type alias without "="
- lines =<< trim END
- vim9script
- type Index number
- END
- v9.CheckSourceFailure(lines, "E398: Missing '=': number", 2)
-
- # type alias for a non-existing type
- lines =<< trim END
- vim9script
- type Index = integer
- END
- v9.CheckSourceFailure(lines, 'E1010: Type not recognized: integer', 2)
-
- # type alias starting with lower-case letter
- lines =<< trim END
- vim9script
- type index = number
- END
- v9.CheckSourceFailure(lines, 'E1394: Type name must start with an uppercase letter: index = number', 2)
-
- # No white space following the alias name
- lines =<< trim END
- vim9script
- type Index:number
- END
- v9.CheckSourceFailure(lines, 'E1315: White space required after name: Index:number', 2)
-
- # something following the type alias
- lines =<< trim END
- vim9script
- type ListOfNums = list<number> string
- END
- v9.CheckSourceFailure(lines, 'E488: Trailing characters: string', 2)
-
- # type alias name collides with a variable name
- lines =<< trim END
- vim9script
- var ListOfNums: number = 10
- type ListOfNums = list<number>
- END
- v9.CheckSourceFailure(lines, 'E1041: Redefining script item: "ListOfNums"', 3)
-
- # duplicate type alias name
- lines =<< trim END
- vim9script
- type MyList = list<number>
- type MyList = list<string>
- END
- v9.CheckSourceFailure(lines, 'E1396: Type alias "MyList" already exists', 3)
-
- # def function argument name collision with a type alias
- lines =<< trim END
- vim9script
- type A = list<number>
- def Foo(A: number)
- enddef
- END
- v9.CheckSourceFailure(lines, 'E1168: Argument already declared in the script: A: number)', 3)
-
- # def function local variable name collision with a type alias
- lines =<< trim END
- vim9script
- type A = list<number>
- def Foo()
- var A: number = 10
- enddef
- Foo()
- END
- v9.CheckSourceFailure(lines, 'E1054: Variable already declared in the script: A', 1)
-
- # type alias a variable
- lines =<< trim END
- vim9script
- var A: list<number> = []
- type B = A
- END
- v9.CheckSourceFailure(lines, 'E1010: Type not recognized: A', 3)
-
- # type alias a class
- lines =<< trim END
- vim9script
- class C
- endclass
- type AC = C
- assert_equal('class<C>', typename(AC))
- END
- v9.CheckSourceSuccess(lines)
-
- # Sourcing a script twice (which will free script local variables)
- # Uses "lines" from the previous test
- new
- setline(1, lines)
- :source
- :source
- bw!
-
- # type alias a type alias
- lines =<< trim END
- vim9script
- type A = string
- type B = A
- var b: B = 'abc'
- assert_equal('abc', b)
- def Foo()
- var c: B = 'def'
- assert_equal('def', c)
- enddef
- Foo()
- END
- v9.CheckSourceSuccess(lines)
-
- # Assigning to a type alias (script level)
- lines =<< trim END
- vim9script
- type MyType = list<number>
- MyType = [1, 2, 3]
- END
- v9.CheckSourceFailure(lines, 'E1395: Type alias "MyType" cannot be modified', 3)
-
- # Assigning a type alias (def function level)
- lines =<< trim END
- vim9script
- type A = list<string>
- def Foo()
- var x = A
- enddef
- Foo()
- END
- v9.CheckSourceFailure(lines, 'E1403: Type alias "A" cannot be used as a value', 1)
-
- # Using type alias in an expression (script level)
- lines =<< trim END
- vim9script
- type MyType = list<number>
- assert_fails('var m = MyType', 'E1403: Type alias "MyType" cannot be used as a value')
- assert_fails('var i = MyType + 1', 'E1400: Using type alias "MyType" as a Number')
- assert_fails('var f = 1.0 + MyType', 'E1400: Using type alias "MyType" as a Number')
- assert_fails('MyType += 10', 'E1395: Type alias "MyType" cannot be modified')
- assert_fails('var x = $"-{MyType}-"', 'E1402: Using type alias "MyType" as a String')
- assert_fails('var x = MyType[1]', 'E909: Cannot index a special variable')
- END
- v9.CheckSourceSuccess(lines)
-
- # Using type alias in an expression (def function level)
- lines =<< trim END
- vim9script
- type MyType = list<number>
- def Foo()
- var x = MyType + 1
- enddef
- Foo()
- END
- v9.CheckSourceFailure(lines, 'E1051: Wrong argument type for +', 1)
-
- # Using type alias in an expression (def function level)
- lines =<< trim END
- vim9script
- type MyType = list<number>
- def Foo()
- MyType = list<string>
- enddef
- Foo()
- END
- v9.CheckSourceFailure(lines, 'E46: Cannot change read-only variable "MyType"', 1)
-
- # Using type alias in an expression (def function level)
- lines =<< trim END
- vim9script
- type MyType = list<number>
- def Foo()
- MyType += 10
- enddef
- Foo()
- END
- v9.CheckSourceFailure(lines, 'E46: Cannot change read-only variable "MyType"', 1)
-
- # Convert type alias to a string (def function level)
- lines =<< trim END
- vim9script
- type MyType = list<number>
- def Foo()
- var x = $"-{MyType}-"
- enddef
- Foo()
- END
- v9.CheckSourceFailure(lines, 'E1105: Cannot convert typealias to string', 1)
-
- # Using type alias as a float
- lines =<< trim END
- vim9script
- type B = number
- sort([1.1, B], 'f')
- END
- v9.CheckSourceFailure(lines, 'E1401: Using type alias "B" as a Float', 3)
-
- # Creating a typealias in a def function
- lines =<< trim END
- vim9script
- def Foo()
- var n: number = 10
- type A = list<string>
- enddef
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1399: Type can only be used in a script', 2)
-
- # json_encode should fail with a type alias
- lines =<< trim END
- vim9script
- type A = list<string>
- var x = json_encode(A)
- END
- v9.CheckSourceFailure(lines, 'E1161: Cannot json encode a typealias', 3)
-
- # Comparing type alias with a number (script level)
- lines =<< trim END
- vim9script
- type A = list<string>
- var n: number
- var x = A == n
- END
- v9.CheckSourceFailure(lines, 'E1072: Cannot compare typealias with number', 4)
-
- # Comparing type alias with a number (def function level)
- lines =<< trim END
- vim9script
- type A = list<string>
- def Foo()
- var n: number
- var x = A == n
- enddef
- Foo()
- END
- v9.CheckSourceFailure(lines, 'E1072: Cannot compare typealias with number', 2)
-
- # casting a number to a type alias (script level)
- lines =<< trim END
- vim9script
- type MyType = bool
- assert_equal(true, <MyType>1 == true)
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for exporting and importing type aliases
-def Test_typealias_import()
- var lines =<< trim END
- vim9script
- export type MyType = list<number>
- END
- writefile(lines, 'Xtypeexport.vim', 'D')
-
- lines =<< trim END
- vim9script
- import './Xtypeexport.vim' as A
-
- var myList: A.MyType = [1, 2, 3]
- def Foo(l: A.MyType)
- assert_equal([1, 2, 3], l)
- enddef
- Foo(myList)
- END
- v9.CheckScriptSuccess(lines)
-
- # Use a non existing type alias
- lines =<< trim END
- vim9script
- import './Xtypeexport.vim' as A
-
- var myNum: A.SomeType = 10
- END
- v9.CheckScriptFailure(lines, 'E1010: Type not recognized: A.SomeType = 10', 4)
-
- # Use a type alias that is not exported
- lines =<< trim END
- vim9script
- type NewType = dict<string>
- END
- writefile(lines, 'Xtypeexport2.vim', 'D')
- lines =<< trim END
- vim9script
- import './Xtypeexport2.vim' as A
-
- var myDict: A.NewType = {}
- END
- v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NewType', 4)
-
- # Using the same name as an imported type alias
- lines =<< trim END
- vim9script
- export type MyType2 = list<number>
- END
- writefile(lines, 'Xtypeexport3.vim', 'D')
- lines =<< trim END
- vim9script
- import './Xtypeexport3.vim' as A
-
- type MyType2 = A.MyType2
- var myList1: A.MyType2 = [1, 2, 3]
- var myList2: MyType2 = [4, 5, 6]
- assert_equal([1, 2, 3], myList1)
- assert_equal([4, 5, 6], myList2)
- END
- v9.CheckScriptSuccess(lines)
-
- # Using an exported class to create a type alias
- lines =<< trim END
- vim9script
- export class MyClass
- this.val = 10
- endclass
- END
- writefile(lines, 'Xtypeexport4.vim', 'D')
- lines =<< trim END
- vim9script
- import './Xtypeexport4.vim' as T
-
- type MyType3 = T.MyClass
- var c: MyType3 = T.MyClass.new()
- assert_equal(10, c.val)
- END
- v9.CheckScriptSuccess(lines)
-enddef
-
-" Test for using typealias as a def function argument and return type
-def Test_typealias_func_argument()
- var lines =<< trim END
- vim9script
- type A = list<number>
- def Foo(l: A): A
- assert_equal([1, 2], l)
- return l
- enddef
- var x: A = [1, 2]
- assert_equal([1, 2], Foo(x))
- END
- v9.CheckScriptSuccess(lines)
-
- # passing a type alias variable to a function expecting a specific type
- lines =<< trim END
- vim9script
- type A = list<number>
- def Foo(l: list<number>)
- assert_equal([1, 2], l)
- enddef
- var x: A = [1, 2]
- Foo(x)
- END
- v9.CheckScriptSuccess(lines)
-
- # passing a type alias variable to a function expecting any
- lines =<< trim END
- vim9script
- type A = list<number>
- def Foo(l: any)
- assert_equal([1, 2], l)
- enddef
- var x: A = [1, 2]
- Foo(x)
- END
- v9.CheckScriptSuccess(lines)
-enddef
-
-" Using a type alias with a builtin function
-def Test_typealias_with_builtin_functions()
- var lines =<< trim END
- vim9script
- type A = list<func>
- assert_equal(0, empty(A))
- END
- v9.CheckScriptSuccess(lines)
-
- # Using a type alias with len()
- lines =<< trim END
- vim9script
- type A = list<func>
- var x = len(A)
- END
- v9.CheckScriptFailure(lines, 'E701: Invalid type for len()', 3)
-
- # Using a type alias with len()
- lines =<< trim END
- vim9script
- type A = list<func>
- def Foo()
- var x = len(A)
- enddef
- Foo()
- END
- v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<any> but got typealias', 1)
-
- # Using a type alias with eval()
- lines =<< trim END
- vim9script
- type A = number
- def Foo()
- var x = eval("A")
- enddef
- Foo()
- END
- v9.CheckScriptFailure(lines, 'E1403: Type alias "A" cannot be used as a value', 1)
-enddef
-
-" Test for type alias refcount
-def Test_typealias_refcount()
- var lines =<< trim END
- vim9script
- type A = list<func>
- assert_equal(1, test_refcount(A))
- END
- v9.CheckScriptSuccess(lines)
-
- lines =<< trim END
- vim9script
- type B = list<number>
- var x: B = []
- assert_equal(1, test_refcount(B))
- END
- v9.CheckScriptSuccess(lines)
-enddef
-
-" Test for using instanceof() with a type alias
-def Test_typealias_instanceof()
- var lines =<< trim END
- vim9script
- class C
- endclass
-
- type Ctype = C
- var o = C.new()
- assert_equal(1, instanceof(o, Ctype))
- type Ntype = number
- assert_fails('instanceof(o, Ntype)', 'E693: List or Class required for argument 2')
- assert_equal(1, instanceof(o, [Ctype]))
- END
- v9.CheckScriptSuccess(lines)
-enddef
-
-" Test for type aliasing a class
-def Test_typealias_class()
- var lines =<< trim END
- vim9script
- class C
- this.color = 'green'
- endclass
- type MyClass = C
- var o: MyClass = MyClass.new()
- assert_equal('green', o.color)
- END
- v9.CheckScriptSuccess(lines)
-enddef
-
" Keep this last, it messes up highlighting.
def Test_substitute_cmd()
new
diff --git a/src/testdir/test_vim9_typealias.vim b/src/testdir/test_vim9_typealias.vim
new file mode 100644
index 0000000000..bb3efb867c
--- /dev/null
+++ b/src/testdir/test_vim9_typealias.vim
@@ -0,0 +1,539 @@
+" Test Vim9 type aliases
+
+source check.vim
+import './vim9.vim' as v9
+
+" Test for :type command to create type aliases
+def Test_typealias()
+ # Use type alias at script level
+ var lines =<< trim END
+ vim9script
+ type ListOfStrings = list<string>
+ def Foo(a: ListOfStrings): ListOfStrings
+ return a
+ enddef
+ var b: ListOfStrings = ['a', 'b']
+ assert_equal(['a', 'b'], b)
+ assert_equal(['e', 'f'], Foo(['e', 'f']))
+ assert_equal('typealias<list<string>>', typename(ListOfStrings))
+ assert_equal(v:t_typealias, type(ListOfStrings))
+ assert_equal('ListOfStrings', string(ListOfStrings))
+ assert_equal(false, null == ListOfStrings)
+ END
+ v9.CheckSourceSuccess(lines)
+
+ # Use type alias at def function level
+ lines =<< trim END
+ vim9script
+ type ListOfStrings = list<string>
+ def Foo(a: ListOfStrings): ListOfStrings
+ return a
+ enddef
+ def Bar()
+ var c: ListOfStrings = ['c', 'd']
+ assert_equal(['c', 'd'], c)
+ assert_equal(['e', 'f'], Foo(['e', 'f']))
+ assert_equal('typealias<list<string>>', typename(ListOfStrings))
+ assert_equal(v:t_typealias, type(ListOfStrings))
+ assert_equal('ListOfStrings', string(ListOfStrings))
+ assert_equal(false, null == ListOfStrings)
+ enddef
+ Bar()
+ END
+ v9.CheckSourceSuccess(lines)
+
+ # Use :type outside a Vim9 script
+ lines =<< trim END
+ type Index = number
+ END
+ v9.CheckSourceFailure(lines, 'E1393: Type can only be defined in Vim9 script', 1)
+
+ # Use :type without any arguments
+ lines =<< trim END
+ vim9script
+ type
+ END
+ v9.CheckSourceFailure(lines, 'E1397: Missing type alias name', 2)
+
+ # Use :type with a name but no type
+ lines =<< trim END
+ vim9script
+ type MyType
+ END
+ v9.CheckSourceFailure(lines, "E398: Missing '=': ", 2)
+
+ # Use :type with a name but no type following "="
+ lines =<< trim END
+ vim9script
+ type MyType =
+ END
+ v9.CheckSourceFailure(lines, 'E1398: Missing type alias type', 2)
+
+ # No space before or after "="
+ lines =<< trim END
+ vim9script
+ type MyType=number
+ END
+ v9.CheckSourceFailure(lines, 'E1315: White space required after name: MyType=number', 2)
+
+ # No space after "="
+ lines =<< trim END
+ vim9script
+ type MyType =number
+ END
+ v9.CheckSourceFailure(lines, "E1069: White space required after '=': =number", 2)
+
+ # type alias without "="
+ lines =<< trim END
+ vim9script
+ type Index number
+ END
+ v9.CheckSourceFailure(lines, "E398: Missing '=': number", 2)
+
+ # type alias for a non-existing type
+ lines =<< trim END
+ vim9script
+ type Index = integer
+ END
+ v9.CheckSourceFailure(lines, 'E1010: Type not recognized: integer', 2)
+
+ # type alias starting with lower-case letter
+ lines =<< trim END
+ vim9script
+ type index = number
+ END
+ v9.CheckSourceFailure(lines, 'E1394: Type name must start with an uppercase letter: index = number', 2)
+
+ # No white space following the alias name
+ lines =<< trim END
+ vim9script
+ type Index:number
+ END
+ v9.CheckSourceFailure(lines, 'E1315: White space required after name: Index:number', 2)
+
+ # something following the type alias
+ lines =<< trim END
+ vim9script
+ type ListOfNums = list<number> string
+ END
+ v9.CheckSourceFailure(lines, 'E488: Trailing characters: string', 2)
+
+ # type alias name collides with a variable name
+ lines =<< trim END
+ vim9script
+ var ListOfNums: number = 10
+ type ListOfNums = list<number>
+ END
+ v9.CheckSourceFailure(lines, 'E1041: Redefining script item: "ListOfNums"', 3)
+
+ # duplicate type alias name
+ lines =<< trim END
+ vim9script
+ type MyList = list<number>
+ type MyList = list<string>
+ END
+ v9.CheckSourceFailure(lines, 'E1396: Type alias "MyList" already exists', 3)
+
+ # def function argument name collision with a type alias
+ lines =<< trim END
+ vim9script
+ type A = list<number>
+ def Foo(A: number)
+ enddef
+ END
+ v9.CheckSourceFailure(lines, 'E1168: Argument already declared in the script: A: number)', 3)
+
+ # def function local variable name collision with a type alias
+ lines =<< trim END
+ vim9script
+ type A = list<number>
+ def Foo()
+ var A: number = 10
+ enddef
+ Foo()
+ END
+ v9.CheckSourceFailure(lines, 'E1054: Variable already declared in the script: A', 1)
+
+ # type alias a variable
+ lines =<< trim END
+ vim9script
+ var A: list<number> = []
+ type B = A
+ END
+ v9.CheckSourceFailure(lines, 'E1010: Type not recognized: A', 3)
+
+ # type alias a class
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ type AC = C
+ assert_equal('class<C>', typename(AC))
+ END
+ v9.CheckSourceSuccess(lines)
+
+ # Sourcing a script twice (which will free script local variables)
+ # Uses "lines" from the previous test
+ new
+ setline(1, lines)
+ :source
+ :source
+ bw!
+
+ # type alias a type alias
+ lines =<< trim END
+ vim9script
+ type A = string
+ type B = A
+ var b: B = 'abc'
+ assert_equal('abc', b)
+ def Foo()
+ var c: B = 'def'
+ assert_equal('def', c)
+ enddef
+ Foo()
+ END
+ v9.CheckSourceSuccess(lines)
+
+ # Assigning to a type alias (script level)
+ lines =<< trim END
+ vim9script
+ type MyType = list<number>
+ MyType = [1, 2, 3]
+ END
+ v9.CheckSourceFailure(lines, 'E1395: Type alias "MyType" cannot be modified', 3)
+
+ # Assigning a type alias (def function level)
+ lines =<< trim END
+ vim9script
+ type A = list<string>
+ def Foo()
+ var x = A
+ enddef
+ Foo()
+ END
+ v9.CheckSourceFailure(lines, 'E1403: Type alias "A" cannot be used as a value', 1)
+
+ # Using type alias in an expression (script level)
+ lines =<< trim END
+ vim9script
+ type MyType = list<number>
+ assert_fails('var m = MyType', 'E1403: Type alias "MyType" cannot be used as a value')
+ assert_fails('var i = MyType + 1', 'E1400: Using type alias "MyType" as a Number')
+ assert_fails('var f = 1.0 + MyType', 'E1400: Using type alias "MyType" as a Number')
+ assert_fails('MyType += 10', 'E1395: Type alias "MyType" cannot be modified')
+ assert_fails('var x = $"-{MyType}-"', 'E1402: Using type alias "MyType" as a String')
+ assert_fails('var x = MyType[1]', 'E909: Cannot index a special variable')
+ END
+ v9.CheckSourceSuccess(lines)
+
+ # Using type alias in an expression (def function level)
+ lines =<< trim END
+ vim9script
+ type MyType = list<number>
+ def Foo()
+ var x = MyType + 1
+ enddef
+ Foo()
+ END
+ v9.CheckSourceFailure(lines, 'E1051: Wrong argument type for +', 1)
+
+ # Using type alias in an expression (def function level)
+ lines =<< trim END
+ vim9script
+ type MyType = list<number>
+ def Foo()
+ MyType = list<string>
+ enddef
+ Foo()
+ END
+ v9.CheckSourceFailure(lines, 'E46: Cannot change read-only variable "MyType"', 1)
+
+ # Using type alias in an expression (def function level)
+ lines =<< trim END
+ vim9script
+ type MyType = list<number>
+ def Foo()
+ MyType += 10
+ enddef
+ Foo()
+ END
+ v9.CheckSourceFailure(lines, 'E46: Cannot change read-only variable "MyType"', 1)
+
+ # Convert type alias to a string (def function level)
+ lines =<< trim END
+ vim9script
+ type MyType = list<number>
+ def Foo()
+ var x = $"-{MyType}-"
+ enddef
+ Foo()
+ END
+ v9.CheckSourceFailure(lines, 'E1105: Cannot convert typealias to string', 1)
+
+ # Using type alias as a float
+ lines =<< trim END
+ vim9script
+ type B = number
+ sort([1.1, B], 'f')
+ END
+ v9.CheckSourceFailure(lines, 'E1401: Using type alias "B" as a Float', 3)
+
+ # Creating a typealias in a def function
+ lines =<< trim END
+ vim9script
+ def Foo()
+ var n: number = 10
+ type A = list<string>
+ enddef
+ defcompile
+ END
+ v9.CheckSourceFailure(lines, 'E1399: Type can only be used in a script', 2)
+
+ # json_encode should fail with a type alias
+ lines =<< trim END
+ vim9script
+ type A = list<string>
+ var x = json_encode(A)
+ END
+ v9.CheckSourceFailure(lines, 'E1161: Cannot json encode a typealias', 3)
+
+ # Comparing type alias with a number (script level)
+ lines =<< trim END
+ vim9script
+ type A = list<string>
+ var n: number
+ var x = A == n
+ END
+ v9.CheckSourceFailure(lines, 'E1072: Cannot compare typealias with number', 4)
+
+ # Comparing type alias with a number (def function level)
+ lines =<< trim END
+ vim9script
+ type A = list<string>
+ def Foo()
+ var n: number
+ var x = A == n
+ enddef
+ Foo()
+ END
+ v9.CheckSourceFailure(lines, 'E1072: Cannot compare typealias with number', 2)
+
+ # casting a number to a type alias (script level)
+ lines =<< trim END
+ vim9script
+ type MyType = bool
+ assert_equal(true, <MyType>1 == true)
+ END
+ v9.CheckSourceSuccess(lines)
+enddef
+
+" Test for exporting and importing type aliases
+def Test_typealias_import()
+ var lines =<< trim END
+ vim9script
+ export type MyType = list<number>
+ END
+ writefile(lines, 'Xtypeexport.vim', 'D')
+
+ lines =<< trim END
+ vim9script
+ import './Xtypeexport.vim' as A
+
+ var myList: A.MyType = [1, 2, 3]
+ def Foo(l: A.MyType)
+ assert_equal([1, 2, 3], l)
+ enddef
+ Foo(myList)
+ END
+ v9.CheckScriptSuccess(lines)
+
+ # Use a non existing type alias
+ lines =<< trim END
+ vim9script
+ import './Xtypeexport.vim' as A
+
+ var myNum: A.SomeType = 10
+ END
+ v9.CheckScriptFailure(lines, 'E1010: Type not recognized: A.SomeType = 10', 4)
+
+ # Use a type alias that is not exported
+ lines =<< trim END
+ vim9script
+ type NewType = dict<string>
+ END
+ writefile(lines, 'Xtypeexport2.vim', 'D')
+ lines =<< trim END
+ vim9script
+ import './Xtypeexport2.vim' as A
+
+ var myDict: A.NewType = {}
+ END
+ v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NewType', 4)
+
+ # Using the same name as an imported type alias
+ lines =<< trim END
+ vim9script
+ export type MyType2 = list<number>
+ END
+ writefile(lines, 'Xtypeexport3.vim', 'D')
+ lines =<< trim END
+ vim9script
+ import './Xtypeexport3.vim' as A
+
+ type MyType2 = A.MyType2
+ var myList1: A.MyType2 = [1, 2, 3]
+ var myList2: MyType2 = [4, 5, 6]
+ assert_equal([1, 2, 3], myList1)
+ assert_equal([4, 5, 6], myList2)
+ END
+ v9.CheckScriptSuccess(lines)
+
+ # Using an exported class to create a type alias
+ lines =<< trim END
+ vim9script
+ export class MyClass
+ this.val = 10
+ endclass
+ END
+ writefile(lines, 'Xtypeexport4.vim', 'D')
+ lines =<< trim END
+ vim9script
+ import './Xtypeexport4.vim' as T
+
+ type MyType3 = T.MyClass
+ var c: MyType3 = MyType3.new()
+ assert_equal(10, c.val)
+ END
+ v9.CheckScriptSuccess(lines)
+enddef
+
+" Test for using typealias as a def function argument and return type
+def Test_typealias_func_argument()
+ var lines =<< trim END
+ vim9script
+ type A = list<number>
+ def Foo(l: A): A
+ assert_equal([1, 2], l)
+ return l
+ enddef
+ var x: A = [1, 2]
+ assert_equal([1, 2], Foo(x))
+ END
+ v9.CheckScriptSuccess(lines)
+
+ # passing a type alias variable to a function expecting a specific type
+ lines =<< trim END
+ vim9script
+ type A = list<number>
+ def Foo(l: list<number>)
+ assert_equal([1, 2], l)
+ enddef
+ var x: A = [1, 2]
+ Foo(x)
+ END
+ v9.CheckScriptSuccess(lines)
+
+ # passing a type alias variable to a function expecting any
+ lines =<< trim END
+ vim9script
+ type A = list<number>
+ def Foo(l: any)
+ assert_equal([1, 2], l)
+ enddef
+ var x: A = [1, 2]
+ Foo(x)
+ END
+ v9.CheckScriptSuccess(lines)
+enddef
+
+" Using a type alias with a builtin function
+def Test_typealias_with_builtin_functions()
+ var lines =<< trim END
+ vim9script
+ type A = list<func>
+ assert_equal(0, empty(A))
+ END
+ v9.CheckScriptSuccess(lines)
+
+ # Using a type alias with len()
+ lines =<< trim END
+ vim9script
+ type A = list<func>
+ var x = len(A)
+ END
+ v9.CheckScriptFailure(lines, 'E701: Invalid type for len()', 3)
+
+ # Using a type alias with len()
+ lines =<< trim END
+ vim9script
+ type A = list<func>
+ def Foo()
+ var x = len(A)
+ enddef
+ Foo()
+ END
+ v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<any> but got typealias', 1)
+
+ # Using a type alias with eval()
+ lines =<< trim END
+ vim9script
+ type A = number
+ def Foo()
+ var x = eval("A")
+ enddef
+ Foo()
+ END
+ v9.CheckScriptFailure(lines, 'E1403: Type alias "A" cannot be used as a value', 1)
+enddef
+
+" Test for type alias refcount
+def Test_typealias_refcount()
+ var lines =<< trim END
+ vim9script
+ type A = list<func>
+ assert_equal(1, test_refcount(A))
+ END
+ v9.CheckScriptSuccess(lines)
+
+ lines =<< trim END
+ vim9script
+ type B = list<number>
+ var x: B = []
+ assert_equal(1, test_refcount(B))
+ END
+ v9.CheckScriptSuccess(lines)
+enddef
+
+" Test for using instanceof() with a type alias
+def Test_typealias_instanceof()
+ var lines =<< trim END
+ vim9script
+ class C
+ endclass
+
+ type Ctype = C
+ var o = C.new()
+ assert_equal(1, instanceof(o, Ctype))
+ type Ntype = number
+ assert_fails('instanceof(o, Ntype)', 'E693: List or Class required for argument 2')
+ assert_equal(1, instanceof(o, [Ctype]))
+ END
+ v9.CheckScriptSuccess(lines)
+enddef
+
+" Test for type aliasing a class
+def Test_typealias_class()
+ var lines =<< trim END
+ vim9script
+ class C
+ this.color = 'green'
+ endclass
+ type MyClass = C
+ var o: MyClass = MyClass.new()
+ assert_equal('green', o.color)
+ END
+ v9.CheckScriptSuccess(lines)
+enddef
+
+" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/version.c b/src/version.c
index fdfdf3f832..a75c4a675a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2080,
+/**/
2079,
/**/
2078,