Update runtime files
diff --git a/runtime/doc/vim9class.txt b/runtime/doc/vim9class.txt
index cabe55b..135b309 100644
--- a/runtime/doc/vim9class.txt
+++ b/runtime/doc/vim9class.txt
@@ -1,4 +1,4 @@
-*vim9class.txt* For Vim version 9.0. Last change: 2022 Dec 20
+*vim9class.txt* For Vim version 9.0. Last change: 2023 Jan 09
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -261,10 +261,22 @@
totalSize += this.size
enddef
endclass
+< *E1340* *E1341*
+Since the name is used as-is, shadowing the name by a function argument name
+or variable name is not allowed.
+
+Just like object members the access can be made private by using an underscore
+as the first character in the name, and it can be made public by prefixing
+"public": >
+ class OtherThing
+ static total: number # anybody can read, only class can write
+ static _sum: number # only class can read and write
+ public static result: number # anybody can read and write
+ endclass
<
- *class-method*
-Class methods are also declared with "static". They have no access to object
-members, they cannot use the "this" keyword. >
+ *class-function*
+Class functions are also declared with "static". They have no access to
+object members, they cannot use the "this" keyword. >
class OtherThing
this.size: number
@@ -320,6 +332,9 @@
enddef
endclass
+If a class declares to implement an interface, all the items specified in the
+interface must appear in the class, with the same types. *E1348* *E1349*
+
The interface name can be used as a type: >
var shapes: list<HasSurface> = [
@@ -372,9 +387,11 @@
implements InterfaceName, OtherInterface
specifies SomeInterface
< *extends*
-A class can extend one other class.
- *implements*
-A class can implement one or more interfaces.
+A class can extend one other class. *E1352* *E1353* *E1354*
+ *implements* *E1346* *E1347*
+A class can implement one or more interfaces. The "implements" keyword can
+only appear once *E1350* . Multiple interfaces can be specified, separated by
+commas. Each interface name can appear only once. *E1351*
*specifies*
A class can declare its interface, the object members and methods, with a
named interface. This avoids the need for separately specifying the
@@ -416,10 +433,10 @@
export interface InterfaceName
endinterface
-
+< *E1344*
An interface can declare object members, just like in a class but without any
initializer.
-
+ *E1345*
An interface can declare methods with `:def`, including the arguments and
return type, but without the body and without `:enddef`. Example: >
@@ -428,8 +445,10 @@
def Surface(): number
endinterface
+An interface name must start with an uppercase letter. *E1343*
The "Has" prefix can be used to make it easier to guess this is an interface
name, with a hint about what it provides.
+An interface can only be defined in a |Vim9| script file. *E1342*
Default constructor ~
@@ -449,8 +468,6 @@
def new(this.name = v:none, this.age = v:none, this.gender = v:none)
enddef
-All object members will be used, also private access ones.
-
The "= v:none" default values make the arguments optional. Thus you can also
call `new()` without any arguments. No assignment will happen and the default
value for the object members will be used. This is a more useful example,
@@ -472,6 +489,12 @@
want to initialize the object members, do it where they are declared. This
way you only need to look in one place for the default values.
+All object members will be used in the default constructor, also private
+access ones.
+
+If the class extends another one, the object members of that class will come
+first.
+
Multiple constructors ~
@@ -610,6 +633,22 @@
polymorphism, which we don't really need anyway.
+Single inheritance and interfaces ~
+
+Some languages support multiple inheritance. Although that can be useful in
+some cases, it makes the rules of how a class works quite complicated.
+Instead, using interfaces to declare what is supported is much simpler. The
+very popular Java language does it this way, and it should be good enough for
+Vim. The "keep it simple" rule applies here.
+
+Explicitly declaring that a class supports an interface makes it easy to see
+what a class is intended for. It also makes it possible to do proper type
+checking. When an interface is changed any class that declares to implement
+it will be checked if that change was also changed. The mechanism to assume a
+class implements an interface just because the methods happen to match is
+brittle and leads to obscure problems, let's not do that.
+
+
Using "this.member" everywhere ~
The object members in various programming languages can often be accessed in
@@ -628,22 +667,6 @@
aren't.
-Single inheritance and interfaces ~
-
-Some languages support multiple inheritance. Although that can be useful in
-some cases, it makes the rules of how a class works quite complicated.
-Instead, using interfaces to declare what is supported is much simpler. The
-very popular Java language does it this way, and it should be good enough for
-Vim. The "keep it simple" rule applies here.
-
-Explicitly declaring that a class supports an interface makes it easy to see
-what a class is intended for. It also makes it possible to do proper type
-checking. When an interface is changed any class that declares to implement
-it will be checked if that change was also changed. The mechanism to assume a
-class implements an interface just because the methods happen to match is
-brittle and leads to obscure problems, let's not do that.
-
-
Using class members ~
Using "static member" to declare a class member is very common, nothing new
@@ -658,6 +681,55 @@
be changed too.
+Declaring object and class members ~
+
+The main choice is whether to use "var" as with variable declarations.
+TypeScript does not use it: >
+ class Point {
+ x: number;
+ y = 0;
+ }
+
+Following that Vim object members could be declared like this: >
+ class Point
+ this.x: number
+ this.y = 0
+ endclass
+
+Some users pointed out that this looks more like an assignment than a
+declaration. Adding "var" changes that: >
+ class Point
+ var this.x: number
+ var this.y = 0
+ endclass
+
+We also need to be able to declare class members using the "static" keyword.
+There we can also choose to leave out "var": >
+ class Point
+ var this.x: number
+ static count = 0
+ endclass
+
+Or do use it, before "static": >
+ class Point
+ var this.x: number
+ var static count = 0
+ endclass
+
+Or after "static": >
+ class Point
+ var this.x: number
+ static var count = 0
+ endclass
+
+This is more in line with "static def Func()".
+
+There is no clear preference whether to use "var" or not. The two main
+reasons to leave it out are:
+1. TypeScript, Java and other popular languages do not use it.
+2. Less clutter.
+
+
Using "ClassName.new()" to construct an object ~
Many languages use the "new" operator to create an object, which is actually