1
1
use lalrpop_intern:: InternedString ;
2
2
use std:: fmt;
3
3
4
- #[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
4
+ #[ derive( Copy , Clone , PartialEq , Eq , Debug ) ]
5
5
pub struct Span {
6
6
pub lo : usize ,
7
7
pub hi : usize ,
@@ -13,17 +13,20 @@ impl Span {
13
13
}
14
14
}
15
15
16
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
16
17
pub struct Program {
17
18
pub items : Vec < Item >
18
19
}
19
20
21
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
20
22
pub enum Item {
21
23
StructDefn ( StructDefn ) ,
22
24
TraitDefn ( TraitDefn ) ,
23
25
Impl ( Impl ) ,
24
26
Clause ( Clause ) ,
25
27
}
26
28
29
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
27
30
pub struct StructDefn {
28
31
pub name : Identifier ,
29
32
pub parameter_kinds : Vec < ParameterKind > ,
@@ -32,11 +35,13 @@ pub struct StructDefn {
32
35
pub flags : StructFlags ,
33
36
}
34
37
38
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
35
39
pub struct StructFlags {
36
40
pub external : bool ,
37
41
pub fundamental : bool ,
38
42
}
39
43
44
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
40
45
pub struct TraitDefn {
41
46
pub name : Identifier ,
42
47
pub parameter_kinds : Vec < ParameterKind > ,
@@ -45,43 +50,50 @@ pub struct TraitDefn {
45
50
pub flags : TraitFlags ,
46
51
}
47
52
53
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
48
54
pub struct TraitFlags {
49
55
pub auto : bool ,
50
56
pub marker : bool ,
51
57
pub external : bool ,
52
58
pub deref : bool ,
53
59
}
54
60
61
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
55
62
pub struct AssocTyDefn {
56
63
pub name : Identifier ,
57
64
pub parameter_kinds : Vec < ParameterKind > ,
58
65
pub bounds : Vec < InlineBound > ,
59
66
pub where_clauses : Vec < QuantifiedWhereClause > ,
60
67
}
61
68
69
+ #[ derive( Copy , Clone , PartialEq , Eq , Debug ) ]
62
70
pub enum ParameterKind {
63
71
Ty ( Identifier ) ,
64
72
Lifetime ( Identifier ) ,
65
73
}
66
74
75
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
67
76
pub enum Parameter {
68
77
Ty ( Ty ) ,
69
78
Lifetime ( Lifetime ) ,
70
79
}
71
80
81
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
72
82
/// An inline bound, e.g. `: Foo<K>` in `impl<K, T: Foo<K>> SomeType<T>`.
73
83
pub enum InlineBound {
74
84
TraitBound ( TraitBound ) ,
75
85
ProjectionEqBound ( ProjectionEqBound ) ,
76
86
}
77
87
88
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
78
89
/// Represents a trait bound on e.g. a type or type parameter.
79
90
/// Does not know anything about what it's binding.
80
91
pub struct TraitBound {
81
92
pub trait_name : Identifier ,
82
93
pub args_no_self : Vec < Parameter > ,
83
94
}
84
95
96
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
85
97
/// Represents a projection equality bound on e.g. a type or type parameter.
86
98
/// Does not know anything about what it's binding.
87
99
pub struct ProjectionEqBound {
@@ -91,7 +103,7 @@ pub struct ProjectionEqBound {
91
103
pub value : Ty ,
92
104
}
93
105
94
- #[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
106
+ #[ derive( Copy , Clone , PartialEq , Eq , Debug ) ]
95
107
pub enum Kind {
96
108
Ty ,
97
109
Lifetime ,
@@ -130,19 +142,22 @@ impl Kinded for Parameter {
130
142
}
131
143
}
132
144
145
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
133
146
pub struct Impl {
134
147
pub parameter_kinds : Vec < ParameterKind > ,
135
148
pub trait_ref : PolarizedTraitRef ,
136
149
pub where_clauses : Vec < QuantifiedWhereClause > ,
137
150
pub assoc_ty_values : Vec < AssocTyValue > ,
138
151
}
139
152
153
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
140
154
pub struct AssocTyValue {
141
155
pub name : Identifier ,
142
156
pub parameter_kinds : Vec < ParameterKind > ,
143
157
pub value : Ty ,
144
158
}
145
159
160
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
146
161
pub enum Ty {
147
162
Id {
148
163
name : Identifier ,
@@ -163,28 +178,33 @@ pub enum Ty {
163
178
}
164
179
}
165
180
181
+ #[ derive( Copy , Clone , PartialEq , Eq , Debug ) ]
166
182
pub enum Lifetime {
167
183
Id {
168
184
name : Identifier ,
169
185
}
170
186
}
171
187
188
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
172
189
pub struct ProjectionTy {
173
190
pub trait_ref : TraitRef ,
174
191
pub name : Identifier ,
175
192
pub args : Vec < Parameter > ,
176
193
}
177
194
195
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
178
196
pub struct UnselectedProjectionTy {
179
197
pub name : Identifier ,
180
198
pub args : Vec < Parameter > ,
181
199
}
182
200
201
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
183
202
pub struct TraitRef {
184
203
pub trait_name : Identifier ,
185
204
pub args : Vec < Parameter > ,
186
205
}
187
206
207
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
188
208
pub enum PolarizedTraitRef {
189
209
Positive ( TraitRef ) ,
190
210
Negative ( TraitRef ) ,
@@ -200,45 +220,60 @@ impl PolarizedTraitRef {
200
220
}
201
221
}
202
222
203
- #[ derive( Copy , Clone , Debug ) ]
223
+ #[ derive( Copy , Clone , PartialEq , Eq , Debug ) ]
204
224
pub struct Identifier {
205
225
pub str : InternedString ,
206
226
pub span : Span ,
207
227
}
208
228
229
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
209
230
pub enum WhereClause {
210
231
Implemented { trait_ref : TraitRef } ,
211
- Normalize { projection : ProjectionTy , ty : Ty } ,
212
232
ProjectionEq { projection : ProjectionTy , ty : Ty } ,
213
- TyWellFormed { ty : Ty } ,
233
+ }
234
+
235
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
236
+ pub enum DomainGoal {
237
+ Holds { where_clause : WhereClause } ,
238
+ Normalize { projection : ProjectionTy , ty : Ty } ,
214
239
TraitRefWellFormed { trait_ref : TraitRef } ,
240
+ TyWellFormed { ty : Ty } ,
215
241
TyFromEnv { ty : Ty } ,
216
242
TraitRefFromEnv { trait_ref : TraitRef } ,
217
- UnifyTys { a : Ty , b : Ty } ,
218
- UnifyLifetimes { a : Lifetime , b : Lifetime } ,
219
243
TraitInScope { trait_name : Identifier } ,
220
244
Derefs { source : Ty , target : Ty } ,
221
245
IsLocal { ty : Ty } ,
222
246
}
223
247
248
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
249
+ pub enum LeafGoal {
250
+ DomainGoal { goal : DomainGoal } ,
251
+ UnifyTys { a : Ty , b : Ty } ,
252
+ UnifyLifetimes { a : Lifetime , b : Lifetime } ,
253
+ }
254
+
255
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
224
256
pub struct QuantifiedWhereClause {
225
257
pub parameter_kinds : Vec < ParameterKind > ,
226
258
pub where_clause : WhereClause ,
227
259
}
228
260
261
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
229
262
pub struct Field {
230
263
pub name : Identifier ,
231
264
pub ty : Ty ,
232
265
}
233
266
267
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
234
268
/// This allows users to add arbitrary `A :- B` clauses into the
235
269
/// logic; it has no equivalent in Rust, but it's useful for testing.
236
270
pub struct Clause {
237
271
pub parameter_kinds : Vec < ParameterKind > ,
238
- pub consequence : WhereClause ,
272
+ pub consequence : DomainGoal ,
239
273
pub conditions : Vec < Box < Goal > > ,
240
274
}
241
275
276
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
242
277
pub enum Goal {
243
278
ForAll ( Vec < ParameterKind > , Box < Goal > ) ,
244
279
Exists ( Vec < ParameterKind > , Box < Goal > ) ,
@@ -247,5 +282,5 @@ pub enum Goal {
247
282
Not ( Box < Goal > ) ,
248
283
249
284
// Additional kinds of goals:
250
- Leaf ( WhereClause ) ,
285
+ Leaf ( LeafGoal ) ,
251
286
}
0 commit comments