@@ -132,15 +132,31 @@ abstract class ItemNode extends AstNode {
132132 )
133133 or
134134 // 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+ )
137141 or
138142 // items made available by an implementation where `this` is the implementing type
139143 exists ( ItemNode node |
140144 this = node .( ImplItemNode ) .resolveSelfTy ( ) and
141145 result = node .getASuccessorRec ( name ) and
142146 result instanceof AssocItemNode
143147 )
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 )
144160 }
145161
146162 /** Gets a successor named `name` of this item, if any. */
@@ -163,6 +179,9 @@ abstract class ItemNode extends AstNode {
163179 name = "crate" and
164180 result .( SourceFileItemNode ) .getFile ( ) = this .getFile ( )
165181 }
182+
183+ /** Gets the location of this item. */
184+ Location getLocation ( ) { result = super .getLocation ( ) }
166185}
167186
168187/** A module or a source file. */
@@ -191,11 +210,16 @@ private class SourceFileItemNode extends ModuleLikeNode, SourceFile {
191210}
192211
193212/** 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+ }
195217
196218private class ConstItemNode extends AssocItemNode instanceof Const {
197219 override string getName ( ) { result = Const .super .getName ( ) .getText ( ) }
198220
221+ override predicate hasImplementation ( ) { super .hasBody ( ) }
222+
199223 override Namespace getNamespace ( ) { result .isValue ( ) }
200224
201225 override Visibility getVisibility ( ) { result = Const .super .getVisibility ( ) }
@@ -219,9 +243,11 @@ private class VariantItemNode extends ItemNode instanceof Variant {
219243 override Visibility getVisibility ( ) { result = Variant .super .getVisibility ( ) }
220244}
221245
222- private class FunctionItemNode extends AssocItemNode instanceof Function {
246+ class FunctionItemNode extends AssocItemNode instanceof Function {
223247 override string getName ( ) { result = Function .super .getName ( ) .getText ( ) }
224248
249+ override predicate hasImplementation ( ) { super .hasBody ( ) }
250+
225251 override Namespace getNamespace ( ) { result .isValue ( ) }
226252
227253 override Visibility getVisibility ( ) { result = Function .super .getVisibility ( ) }
@@ -242,7 +268,19 @@ abstract private class ImplOrTraitItemNode extends ItemNode {
242268}
243269
244270class 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+ }
246284
247285 override string getName ( ) { result = "(impl)" }
248286
@@ -256,6 +294,8 @@ class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
256294private class MacroCallItemNode extends AssocItemNode instanceof MacroCall {
257295 override string getName ( ) { result = "(macro call)" }
258296
297+ override predicate hasImplementation ( ) { none ( ) }
298+
259299 override Namespace getNamespace ( ) { none ( ) }
260300
261301 override Visibility getVisibility ( ) { none ( ) }
@@ -290,6 +330,12 @@ class TraitItemNode extends ImplOrTraitItemNode instanceof Trait {
290330
291331 ItemNode resolveABound ( ) { result = resolvePath ( this .getABoundPath ( ) ) }
292332
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+
293339 override string getName ( ) { result = Trait .super .getName ( ) .getText ( ) }
294340
295341 override Namespace getNamespace ( ) { result .isType ( ) }
@@ -300,6 +346,8 @@ class TraitItemNode extends ImplOrTraitItemNode instanceof Trait {
300346class TypeAliasItemNode extends AssocItemNode instanceof TypeAlias {
301347 override string getName ( ) { result = TypeAlias .super .getName ( ) .getText ( ) }
302348
349+ override predicate hasImplementation ( ) { super .hasTypeRepr ( ) }
350+
303351 override Namespace getNamespace ( ) { result .isType ( ) }
304352
305353 override Visibility getVisibility ( ) { result = TypeAlias .super .getVisibility ( ) }
@@ -330,11 +378,20 @@ private class BlockExprItemNode extends ItemNode instanceof BlockExpr {
330378}
331379
332380private 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+
333388 override string getName ( ) { result = TypeParam .super .getName ( ) .getText ( ) }
334389
335390 override Namespace getNamespace ( ) { result .isType ( ) }
336391
337392 override Visibility getVisibility ( ) { none ( ) }
393+
394+ override Location getLocation ( ) { result = TypeParam .super .getName ( ) .getLocation ( ) }
338395}
339396
340397/** Holds if `item` has the name `name` and is a top-level item inside `f`. */
0 commit comments