-
Notifications
You must be signed in to change notification settings - Fork 0
/
tbon_tc_class_type.e
194 lines (166 loc) · 4.4 KB
/
tbon_tc_class_type.e
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
note
description: "A class type for type checking of textual BON."
author: "Sune Alkaersig <sual@itu.dk> and Thomas Didriksen <thdi@itu.dk>"
date: "$Date$"
revision: "$Revision$"
class
TBON_TC_CLASS_TYPE
inherit
TBON_TC_TYPE
redefine
is_model_equal,
is_equal
end
create
make
feature -- Initialization
make (a_name: STRING)
-- Create a class type for type checking.
do
name := a_name
create ancestors.default_create
end
feature -- Access
ancestors: MML_SET[TBON_TC_CLASS_TYPE]
-- What are the super types of this type?
cluster: TBON_TC_CLUSTER_TYPE
-- What cluster is this type in?
generics: MML_SET[TBON_TC_GENERIC]
-- What are the generics of this type?
features: MML_SET[TBON_TC_FEATURE]
feature -- Element change
add_ancestor (a_class: TBON_TC_CLASS_TYPE)
-- Add `a_class' to `ancestors'?
require
not_void: a_class /= Void
do
ancestors := ancestors & a_class
end
add_feature (a_feature: TBON_TC_FEATURE)
-- Add `a_feature' to `features'?
require
not_void: a_feature /= Void
do
features := features & a_feature
end
set_cluster (a_cluster: TBON_TC_CLUSTER_TYPE)
-- Set `Current' to be in cluster `a_cluster'?
require
not_void: a_cluster /= Void
do
cluster := a_cluster
end
set_is_root
-- Set `is_root' to True.
do
is_root := True
ensure
is_root: is_root
end
set_is_deferred
-- Set `is_deferred' to True.
do
is_deferred := True
ensure
is_deferred: is_deferred
end
set_is_effective
-- Set `is_effective' to True.
do
is_effective := True
ensure
is_effective: is_effective
end
set_is_reused
-- Set `is_reused' to True.
do
is_reused := True
ensure
is_reused: is_reused
end
set_is_persistent
-- Set `is_persistent' to True.
do
is_persistent := True
ensure
is_persistent: is_persistent
end
set_is_interfaced
-- Set `is_interfaced' to True.
do
is_interfaced := True
ensure
is_interfaced: is_interfaced
end
feature -- Status report
is_root: BOOLEAN
-- Is `Current' a root class?
is_deferred: BOOLEAN
-- Is `Current' a deferred class?
is_effective: BOOLEAN
-- Is `Current' an effective class?
is_reused: BOOLEAN
-- Is `Current' a reused class?
is_persistent: BOOLEAN
-- Is `Current' a persistent class?
is_interfaced: BOOLEAN
-- Is `Current' an interfaced class?
has_generic_name (a_formal_generic_name: STRING): BOOLEAN
-- Is `a_formal_generic_name' one of the generic names of `Current'?
do
Result := generics /= Void and then generics.exists (
agent (generic: TBON_TC_GENERIC; other_formal_name: STRING): BOOLEAN
do
Result := generic.formal_generic_name ~ other_formal_name
end (?, a_formal_generic_name)
)
end
conforms_to (other: TBON_TC_TYPE): BOOLEAN
-- Does `Current' conform to `other'?
local
l_ancestors: like Current.ancestors
do
if Current |=| other then
Result := True
elseif not attached {TBON_TC_CLUSTER_TYPE} other then
l_ancestors := Current.ancestors
Result := l_ancestors.exists (
agent (type: TBON_TC_CLASS_TYPE; l_other: TBON_TC_TYPE): BOOLEAN
do
Result := type |=| l_other
end (?, other)
)
if not Result then
Result := l_ancestors.for_all (
agent (type: TBON_TC_CLASS_TYPE; l_other: TBON_TC_TYPE): BOOLEAN
do
Result := type.conforms_to (l_other)
end (?, other)
)
end
else
Result := False
end
end
is_model_equal alias "|=|" (other: TBON_TC_TYPE): BOOLEAN
-- Is this model mathematically equal to `other'?
do
Result := name ~ other.name
end
is_equal (other: like Current): BOOLEAN
-- Is this model mathematically equal to `other'?
do
Result := name ~ other.name and (generics /= Void implies generics.for_all (
agent (generic: TBON_TC_GENERIC; l_other_class: TBON_TC_CLASS_TYPE): BOOLEAN
do
Result := l_other_class.generics.exists (agent (this_generic, other_generic: TBON_TC_GENERIC): BOOLEAN
do
Result := this_generic |=| (other_generic)
end (generic, ?)
)
end (?, other)
))
-- If other class is a class type and has generics, both names and generics must be equal
-- For all generics of Current, there must exist an equal generic in other.
end
end