-
Notifications
You must be signed in to change notification settings - Fork 243
/
class.ts
108 lines (95 loc) · 3.18 KB
/
class.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
export {}
//- @IFace defines/binding IFace
//- IFace.node/kind interface
interface IFace {
//- @ifaceMethod defines/binding IFaceMethod
//- IFaceMethod.node/kind function
//- IFaceMethod.complete incomplete
//- IFaceMethod childof IFace
ifaceMethod(): void;
//- @member defines/binding IFaceMember
//- IFaceMember.node/kind variable
//- IFaceMember.subkind field
member: number;
}
//- @IFace ref IFace
//- @IExtended defines/binding IExtended
//- IExtended extends IFace
interface IExtended extends IFace {
//- @ifaceMethod defines/binding ExtendedIFaceMethod
//- ExtendedIFaceMethod overrides IFaceMethod
ifaceMethod(): void;
}
//- @Class defines/binding Class=vname("Class#type", _, _, _, _)
//- Class.node/kind record
//- @Class defines/binding ClassValue=vname("Class", _, _, _, _)
//- ClassValue.node/kind function
//- @IFace ref IFace
//- Class extends IFace
class Class implements IFace {
//- @member defines/binding Member
//- Member.node/kind variable
//- !{ Member.tag/static _ }
//- Member.subkind field
member: number;
//- @member defines/binding StaticMember
//- StaticMember.tag/static _
//- !{ @member defines/binding Member }
static member: number;
// This ctor declares a new member var named 'otherMember', and also
// declares an ordinary parameter named 'member' (to ensure we don't get
// confused about params to the ctor vs true member variables).
//- @constructor defines/binding ClassCtor=vname("Class#type.constructor", _, _, _, _)
//- ClassCtor.node/kind function
//- ClassCtor.subkind constructor
//- @otherMember defines/binding OtherMember
//- OtherMember.node/kind variable
//- @member defines/binding FakeMember
//- FakeMember.node/kind variable
constructor(public otherMember: number, member: string) {
//- @Class ref ClassValue
//- @"new Class(0, 'a')" ref/call ClassValue
new Class(0, 'a');
}
//- @method defines/binding Method
//- Method.node/kind function
//- Method childof Class
method() {
//- @this ref Class
//- @member ref Member
this.member;
//- @this ref Class
//- @method ref Method
this.method();
}
//- @ifaceMethod defines/binding ClassIFaceMethod
//- ClassIFaceMethod overrides IFaceMethod
ifaceMethod(): void {}
}
//- @Class ref ClassValue
class Subclass extends Class {
//- @method defines/binding OverridenMethod
//- OverridenMethod overrides Method
method() {
//- @member ref Member
this.member;
}
}
class SubSubclass extends Class implements IExtended {
//- @ifaceMethod defines/binding OverridenIFaceMethod
//- OverridenIFaceMethod overrides ClassIFaceMethod
//- OverridenIFaceMethod overrides ExtendedIFaceMethod
//- !{ OverridenIFaceMethod overrides IFaceMethod }
ifaceMethod() {}
}
//- @Class ref ClassValue
//- @Class ref/id Class
let instance = new Class(3, 'a');
//- @otherMember ref OtherMember
instance.otherMember;
// Using Class in type position should still create a link to the class.
//- @Class ref Class
let useAsType: Class = instance;
//- @Class ref ClassValue
//- @Class ref/id Class
Class;