@@ -132,15 +132,28 @@ 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 .declares ( 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 .declares ( name )
156
+ )
144
157
}
145
158
146
159
/** Gets a successor named `name` of this item, if any. */
@@ -194,11 +207,16 @@ private class SourceFileItemNode extends ModuleLikeNode, SourceFile {
194
207
}
195
208
196
209
/** An item that can occur in a trait or an `impl` block. */
197
- abstract private class AssocItemNode extends ItemNode { }
210
+ abstract private class AssocItemNode extends ItemNode , AssocItem {
211
+ /** Holds if this associated item has an implementation. */
212
+ abstract predicate hasImplementation ( ) ;
213
+ }
198
214
199
215
private class ConstItemNode extends AssocItemNode instanceof Const {
200
216
override string getName ( ) { result = Const .super .getName ( ) .getText ( ) }
201
217
218
+ override predicate hasImplementation ( ) { super .hasBody ( ) }
219
+
202
220
override Namespace getNamespace ( ) { result .isValue ( ) }
203
221
204
222
override Visibility getVisibility ( ) { result = Const .super .getVisibility ( ) }
@@ -222,9 +240,11 @@ private class VariantItemNode extends ItemNode instanceof Variant {
222
240
override Visibility getVisibility ( ) { result = Variant .super .getVisibility ( ) }
223
241
}
224
242
225
- private class FunctionItemNode extends AssocItemNode instanceof Function {
243
+ class FunctionItemNode extends AssocItemNode instanceof Function {
226
244
override string getName ( ) { result = Function .super .getName ( ) .getText ( ) }
227
245
246
+ override predicate hasImplementation ( ) { super .hasBody ( ) }
247
+
228
248
override Namespace getNamespace ( ) { result .isValue ( ) }
229
249
230
250
override Visibility getVisibility ( ) { result = Function .super .getVisibility ( ) }
@@ -245,7 +265,19 @@ abstract private class ImplOrTraitItemNode extends ItemNode {
245
265
}
246
266
247
267
class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
248
- ItemNode resolveSelfTy ( ) { result = resolvePath ( super .getSelfTy ( ) .( PathTypeRepr ) .getPath ( ) ) }
268
+ Path getSelfPath ( ) { result = super .getSelfTy ( ) .( PathTypeRepr ) .getPath ( ) }
269
+
270
+ Path getTraitPath ( ) { result = super .getTrait ( ) .( PathTypeRepr ) .getPath ( ) }
271
+
272
+ ItemNode resolveSelfTy ( ) { result = resolvePath ( this .getSelfPath ( ) ) }
273
+
274
+ TraitItemNode resolveTraitTy ( ) { result = resolvePath ( this .getTraitPath ( ) ) }
275
+
276
+ /** Holds if this `impl` block declares an associated item named `name`. */
277
+ pragma [ nomagic]
278
+ predicate declares ( string name ) {
279
+ name = super .getAssocItemList ( ) .getAnAssocItem ( ) .( AssocItemNode ) .getName ( )
280
+ }
249
281
250
282
override string getName ( ) { result = "(impl)" }
251
283
@@ -259,6 +291,8 @@ class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
259
291
private class MacroCallItemNode extends AssocItemNode instanceof MacroCall {
260
292
override string getName ( ) { result = "(macro call)" }
261
293
294
+ override predicate hasImplementation ( ) { none ( ) }
295
+
262
296
override Namespace getNamespace ( ) { none ( ) }
263
297
264
298
override Visibility getVisibility ( ) { none ( ) }
@@ -293,6 +327,12 @@ class TraitItemNode extends ImplOrTraitItemNode instanceof Trait {
293
327
294
328
ItemNode resolveABound ( ) { result = resolvePath ( this .getABoundPath ( ) ) }
295
329
330
+ /** Holds if this trait declares an associated item named `name`. */
331
+ pragma [ nomagic]
332
+ predicate declares ( string name ) {
333
+ name = super .getAssocItemList ( ) .getAnAssocItem ( ) .( AssocItemNode ) .getName ( )
334
+ }
335
+
296
336
override string getName ( ) { result = Trait .super .getName ( ) .getText ( ) }
297
337
298
338
override Namespace getNamespace ( ) { result .isType ( ) }
@@ -303,6 +343,8 @@ class TraitItemNode extends ImplOrTraitItemNode instanceof Trait {
303
343
class TypeAliasItemNode extends AssocItemNode instanceof TypeAlias {
304
344
override string getName ( ) { result = TypeAlias .super .getName ( ) .getText ( ) }
305
345
346
+ override predicate hasImplementation ( ) { super .hasTypeRepr ( ) }
347
+
306
348
override Namespace getNamespace ( ) { result .isType ( ) }
307
349
308
350
override Visibility getVisibility ( ) { result = TypeAlias .super .getVisibility ( ) }
0 commit comments