You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
patch 9.0.1885: Vim9: no support for abstract methods
Problem: Vim9: no support for abstract methods
Solution: Add support for defining abstract methods in an abstract class
closes: #13044
closes: #13046
Signed-off-by: Christian Brabandt <[email protected]>
Co-authored-by: Yegappan Lakshmanan <[email protected]>
v9.CheckScriptFailure(lines, 'E1373: Abstract method "Foo" is not implemented')
4511
+
4512
+
# Use abstract method ina concrete class
4513
+
lines=<< trim END
4514
+
vim9script
4515
+
class A
4516
+
abstractdefFoo()
4517
+
endclass
4518
+
class B extends A
4519
+
endclass
4520
+
END
4521
+
v9.CheckScriptFailure(lines, 'E1372: Abstract method "abstract def Foo()" cannot be defined in a concrete class')
4522
+
4523
+
# Use abstract method in an interface
4524
+
lines=<< trim END
4525
+
vim9script
4526
+
interface A
4527
+
abstractdefFoo()
4528
+
endinterface
4529
+
class B implements A
4530
+
endclass
4531
+
END
4532
+
v9.CheckScriptFailure(lines, 'E1372: Abstract method "abstract def Foo()" cannot be defined in a concrete class')
4533
+
4534
+
# Abbreviate the "abstract"keyword
4535
+
lines=<< trim END
4536
+
vim9script
4537
+
class A
4538
+
absdefFoo()
4539
+
endclass
4540
+
END
4541
+
v9.CheckScriptFailure(lines, 'E1065: Command cannot be shortened: abs def Foo()')
4542
+
4543
+
# Use "abstract" with a member variable
4544
+
lines=<< trim END
4545
+
vim9script
4546
+
abstractclass A
4547
+
abstract this.val =10
4548
+
endclass
4549
+
END
4550
+
v9.CheckScriptFailure(lines, 'E1371: Abstract must be followed by "def" or "static"')
4551
+
4552
+
# Use astaticabstract method
4553
+
lines=<< trim END
4554
+
vim9script
4555
+
abstractclass A
4556
+
abstractstaticdefFoo(): number
4557
+
endclass
4558
+
class B extends A
4559
+
staticdefFoo(): number
4560
+
return4
4561
+
enddef
4562
+
endclass
4563
+
assert_equal(4, B.Foo())
4564
+
END
4565
+
v9.CheckScriptSuccess(lines)
4566
+
4567
+
# Type mismatch between abstract method and concrete method
4568
+
lines=<< trim END
4569
+
vim9script
4570
+
abstractclass A
4571
+
abstractdefFoo(a:string, b:number): list<number>
4572
+
endclass
4573
+
class B extends A
4574
+
defFoo(a:number, b:string): list<string>
4575
+
return []
4576
+
enddef
4577
+
endclass
4578
+
END
4579
+
v9.CheckScriptFailure(lines, 'E1407: Member "Foo": type mismatch, expected func(string, number): list<number> but got func(number, string): list<string>')
4580
+
4581
+
# Use an abstractclassto invoke an abstract method
0 commit comments