-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
Copy pathEvent.qll
145 lines (116 loc) · 3.97 KB
/
Event.qll
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/**
* Provides classes representing events and event accessors.
*/
import Member
import Type
private import TypeRef
/**
* An event, for example `E` on line 3 in
*
* ```csharp
* class C {
* delegate void D();
* public event D E;
* }
* ```
*/
class Event extends DeclarationWithAccessors, @event {
override string getName() { events(this, result, _, _, _) }
override string getUndecoratedName() { events(this, result, _, _, _) }
override ValueOrRefType getDeclaringType() { events(this, _, result, _, _) }
override DelegateType getType() {
events(this, _, _, result, _)
or
not events(this, _, _, any(Type t), _) and
events(this, _, _, getTypeRef(result), _)
}
/** Gets an `add` or `remove` accessor of this event, if any. */
EventAccessor getAnEventAccessor() { result.getDeclaration() = this }
/** Gets the `add` accessor of this event, if any. */
AddEventAccessor getAddEventAccessor() { result = this.getAnEventAccessor() }
/** Gets the `remove` accessor of this event, if any. */
RemoveEventAccessor getRemoveEventAccessor() { result = this.getAnEventAccessor() }
/**
* Holds if this event can be used like a field within its declaring type
* (this information is available for source events only).
*/
predicate isFieldLike() {
this.fromSource() and
not this.isExtern() and
not this.isAbstract() and
not this.getAnEventAccessor().hasBody()
}
override Event getUnboundDeclaration() { events(this, _, _, _, result) }
override Event getOverridee() { result = DeclarationWithAccessors.super.getOverridee() }
override Event getAnOverrider() { result = DeclarationWithAccessors.super.getAnOverrider() }
override Event getImplementee() { result = DeclarationWithAccessors.super.getImplementee() }
override Event getAnImplementor() { result = DeclarationWithAccessors.super.getAnImplementor() }
override Event getAnUltimateImplementee() {
result = DeclarationWithAccessors.super.getAnUltimateImplementee()
}
override Event getAnUltimateImplementor() {
result = DeclarationWithAccessors.super.getAnUltimateImplementor()
}
override Location getALocation() { event_location(this, result) }
override string getAPrimaryQlClass() { result = "Event" }
}
/**
* An event accessor, for example `add` on line 4 or `remove`
* on line 5 in
*
* ```csharp
* class C {
* delegate void D();
* public event D E {
* add { }
* remove { }
* }
* }
* ```
*/
class EventAccessor extends Accessor, @event_accessor {
override Type getReturnType() {
exists(this) and // needed to avoid compiler warning
result instanceof VoidType
}
override string getAssemblyName() { event_accessors(this, _, result, _, _) }
override EventAccessor getUnboundDeclaration() { event_accessors(this, _, _, _, result) }
override Event getDeclaration() { event_accessors(this, _, _, result, _) }
override Location getALocation() { event_accessor_location(this, result) }
}
/**
* An add event accessor, for example `add` on line 4 in
*
* ```csharp
* class C {
* delegate void D();
* public event D E {
* add { }
* remove { }
* }
* }
* ```
*/
class AddEventAccessor extends EventAccessor, @add_event_accessor {
override string getName() { result = "add" + "_" + this.getDeclaration().getName() }
override string getUndecoratedName() { result = "add" + "_" + this.getDeclaration().getName() }
override string getAPrimaryQlClass() { result = "AddEventAccessor" }
}
/**
* A remove event accessor, for example `remove` on line 5 in
*
* ```csharp
* class C {
* delegate void D();
* public event D E {
* add { }
* remove { }
* }
* }
* ```
*/
class RemoveEventAccessor extends EventAccessor, @remove_event_accessor {
override string getName() { result = "remove" + "_" + this.getDeclaration().getName() }
override string getUndecoratedName() { result = "remove" + "_" + this.getDeclaration().getName() }
override string getAPrimaryQlClass() { result = "RemoveEventAccessor" }
}