@@ -132,15 +132,31 @@ abstract class ItemNode extends AstNode {
132
132
)
133
133
or
134
134
// a trait has access to the associated items of its supertraits
135
- result = this .( TraitItemNode ) .resolveABound ( ) .getASuccessorRec ( name ) and
136
- result instanceof AssocItemNode
135
+ this =
136
+ any ( TraitItemNode trait |
137
+ result = trait .resolveABound ( ) .getASuccessorRec ( name ) and
138
+ result instanceof AssocItemNode and
139
+ not trait .hasAssocItem ( name )
140
+ )
137
141
or
138
142
// items made available by an implementation where `this` is the implementing type
139
143
exists ( ItemNode node |
140
144
this = node .( ImplItemNode ) .resolveSelfTy ( ) and
141
145
result = node .getASuccessorRec ( name ) and
142
146
result instanceof AssocItemNode
143
147
)
148
+ or
149
+ // trait items with default implementations made available in an implementation
150
+ exists ( ImplItemNode impl , ItemNode trait |
151
+ this = impl and
152
+ trait = impl .resolveTraitTy ( ) and
153
+ result = trait .getASuccessorRec ( name ) and
154
+ result .( AssocItemNode ) .hasImplementation ( ) and
155
+ not impl .hasAssocItem ( name )
156
+ )
157
+ or
158
+ // type parameters have access to the associated items of its bounds
159
+ result = this .( TypeParamItemNode ) .resolveABound ( ) .getASuccessorRec ( name ) .( AssocItemNode )
144
160
}
145
161
146
162
/** Gets a successor named `name` of this item, if any. */
@@ -163,6 +179,9 @@ abstract class ItemNode extends AstNode {
163
179
name = "crate" and
164
180
result .( SourceFileItemNode ) .getFile ( ) = this .getFile ( )
165
181
}
182
+
183
+ /** Gets the location of this item. */
184
+ Location getLocation ( ) { result = super .getLocation ( ) }
166
185
}
167
186
168
187
/** A module or a source file. */
@@ -191,11 +210,16 @@ private class SourceFileItemNode extends ModuleLikeNode, SourceFile {
191
210
}
192
211
193
212
/** An item that can occur in a trait or an `impl` block. */
194
- abstract private class AssocItemNode extends ItemNode { }
213
+ abstract private class AssocItemNode extends ItemNode , AssocItem {
214
+ /** Holds if this associated item has an implementation. */
215
+ abstract predicate hasImplementation ( ) ;
216
+ }
195
217
196
218
private class ConstItemNode extends AssocItemNode instanceof Const {
197
219
override string getName ( ) { result = Const .super .getName ( ) .getText ( ) }
198
220
221
+ override predicate hasImplementation ( ) { super .hasBody ( ) }
222
+
199
223
override Namespace getNamespace ( ) { result .isValue ( ) }
200
224
201
225
override Visibility getVisibility ( ) { result = Const .super .getVisibility ( ) }
@@ -219,9 +243,11 @@ private class VariantItemNode extends ItemNode instanceof Variant {
219
243
override Visibility getVisibility ( ) { result = Variant .super .getVisibility ( ) }
220
244
}
221
245
222
- private class FunctionItemNode extends AssocItemNode instanceof Function {
246
+ class FunctionItemNode extends AssocItemNode instanceof Function {
223
247
override string getName ( ) { result = Function .super .getName ( ) .getText ( ) }
224
248
249
+ override predicate hasImplementation ( ) { super .hasBody ( ) }
250
+
225
251
override Namespace getNamespace ( ) { result .isValue ( ) }
226
252
227
253
override Visibility getVisibility ( ) { result = Function .super .getVisibility ( ) }
@@ -242,7 +268,19 @@ abstract private class ImplOrTraitItemNode extends ItemNode {
242
268
}
243
269
244
270
class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
245
- ItemNode resolveSelfTy ( ) { result = resolvePath ( super .getSelfTy ( ) .( PathTypeRepr ) .getPath ( ) ) }
271
+ Path getSelfPath ( ) { result = super .getSelfTy ( ) .( PathTypeRepr ) .getPath ( ) }
272
+
273
+ Path getTraitPath ( ) { result = super .getTrait ( ) .( PathTypeRepr ) .getPath ( ) }
274
+
275
+ ItemNode resolveSelfTy ( ) { result = resolvePath ( this .getSelfPath ( ) ) }
276
+
277
+ TraitItemNode resolveTraitTy ( ) { result = resolvePath ( this .getTraitPath ( ) ) }
278
+
279
+ /** Holds if this `impl` block declares an associated item named `name`. */
280
+ pragma [ nomagic]
281
+ predicate hasAssocItem ( string name ) {
282
+ name = super .getAssocItemList ( ) .getAnAssocItem ( ) .( AssocItemNode ) .getName ( )
283
+ }
246
284
247
285
override string getName ( ) { result = "(impl)" }
248
286
@@ -256,6 +294,8 @@ class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
256
294
private class MacroCallItemNode extends AssocItemNode instanceof MacroCall {
257
295
override string getName ( ) { result = "(macro call)" }
258
296
297
+ override predicate hasImplementation ( ) { none ( ) }
298
+
259
299
override Namespace getNamespace ( ) { none ( ) }
260
300
261
301
override Visibility getVisibility ( ) { none ( ) }
@@ -290,6 +330,12 @@ class TraitItemNode extends ImplOrTraitItemNode instanceof Trait {
290
330
291
331
ItemNode resolveABound ( ) { result = resolvePath ( this .getABoundPath ( ) ) }
292
332
333
+ /** Holds if this trait declares an associated item named `name`. */
334
+ pragma [ nomagic]
335
+ predicate hasAssocItem ( string name ) {
336
+ name = super .getAssocItemList ( ) .getAnAssocItem ( ) .( AssocItemNode ) .getName ( )
337
+ }
338
+
293
339
override string getName ( ) { result = Trait .super .getName ( ) .getText ( ) }
294
340
295
341
override Namespace getNamespace ( ) { result .isType ( ) }
@@ -300,6 +346,8 @@ class TraitItemNode extends ImplOrTraitItemNode instanceof Trait {
300
346
class TypeAliasItemNode extends AssocItemNode instanceof TypeAlias {
301
347
override string getName ( ) { result = TypeAlias .super .getName ( ) .getText ( ) }
302
348
349
+ override predicate hasImplementation ( ) { super .hasTypeRepr ( ) }
350
+
303
351
override Namespace getNamespace ( ) { result .isType ( ) }
304
352
305
353
override Visibility getVisibility ( ) { result = TypeAlias .super .getVisibility ( ) }
@@ -330,11 +378,20 @@ private class BlockExprItemNode extends ItemNode instanceof BlockExpr {
330
378
}
331
379
332
380
private class TypeParamItemNode extends ItemNode instanceof TypeParam {
381
+ pragma [ nomagic]
382
+ Path getABoundPath ( ) {
383
+ result = super .getTypeBoundList ( ) .getABound ( ) .getTypeRepr ( ) .( PathTypeRepr ) .getPath ( )
384
+ }
385
+
386
+ ItemNode resolveABound ( ) { result = resolvePath ( this .getABoundPath ( ) ) }
387
+
333
388
override string getName ( ) { result = TypeParam .super .getName ( ) .getText ( ) }
334
389
335
390
override Namespace getNamespace ( ) { result .isType ( ) }
336
391
337
392
override Visibility getVisibility ( ) { none ( ) }
393
+
394
+ override Location getLocation ( ) { result = TypeParam .super .getName ( ) .getLocation ( ) }
338
395
}
339
396
340
397
/** Holds if `item` has the name `name` and is a top-level item inside `f`. */
0 commit comments