@@ -840,7 +840,7 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
840840 }
841841}
842842
843- final private class ImplTraitTypeReprItemNode extends TypeItemNode instanceof ImplTraitTypeRepr {
843+ final class ImplTraitTypeReprItemNode extends TypeItemNode instanceof ImplTraitTypeRepr {
844844 pragma [ nomagic]
845845 Path getABoundPath ( ) {
846846 result = super .getTypeBoundList ( ) .getABound ( ) .getTypeRepr ( ) .( PathTypeRepr ) .getPath ( )
@@ -963,7 +963,9 @@ final class TraitItemNode extends ImplOrTraitItemNode, TypeItemNode instanceof T
963963 Path getABoundPath ( ) { result = super .getATypeBound ( ) .getTypeRepr ( ) .( PathTypeRepr ) .getPath ( ) }
964964
965965 pragma [ nomagic]
966- ItemNode resolveABound ( ) { result = resolvePath ( this .getABoundPath ( ) ) }
966+ ItemNode resolveBound ( Path path ) { path = this .getABoundPath ( ) and result = resolvePath ( path ) }
967+
968+ ItemNode resolveABound ( ) { result = this .resolveBound ( _) }
967969
968970 override AssocItemNode getAnAssocItem ( ) { result = this .getADescendant ( ) }
969971
@@ -1643,25 +1645,55 @@ signature predicate relevantTraitVisibleSig(Element element, Trait trait);
16431645 * at a given element.
16441646 */
16451647module TraitIsVisible< relevantTraitVisibleSig / 2 relevantTraitVisible> {
1646- /** Holds if the trait might be looked up in `encl`. */
1647- private predicate traitLookup ( ItemNode encl , Element element , Trait trait ) {
1648- // lookup in immediately enclosing item
1649- relevantTraitVisible ( element , trait ) and
1650- encl .getADescendant ( ) = element
1648+ private newtype TNode =
1649+ TTrait ( Trait t ) { relevantTraitVisible ( _, t ) } or
1650+ TItemNode ( ItemNode i ) or
1651+ TElement ( Element e ) { relevantTraitVisible ( e , _) }
1652+
1653+ private predicate isTrait ( TNode n ) { n instanceof TTrait }
1654+
1655+ private predicate step ( TNode n1 , TNode n2 ) {
1656+ exists ( Trait t1 , ItemNode i2 |
1657+ n1 = TTrait ( t1 ) and
1658+ n2 = TItemNode ( i2 ) and
1659+ t1 = i2 .getASuccessor ( _, _, _)
1660+ )
16511661 or
1652- // lookup in an outer scope, but only if the trait is not declared in inner scope
1653- exists ( ItemNode mid |
1654- traitLookup ( mid , element , trait ) and
1655- not trait = mid .getASuccessor ( _, _, _) and
1656- encl = getOuterScope ( mid )
1662+ exists ( ItemNode i1 , ItemNode i2 |
1663+ n1 = TItemNode ( i1 ) and
1664+ n2 = TItemNode ( i2 ) and
1665+ i1 = getOuterScope ( i2 )
1666+ )
1667+ or
1668+ exists ( ItemNode i1 , Element e2 |
1669+ n1 = TItemNode ( i1 ) and
1670+ n2 = TElement ( e2 ) and
1671+ i1 .getADescendant ( ) = e2
1672+ )
1673+ }
1674+
1675+ private predicate isElement ( TNode n ) { n instanceof TElement }
1676+
1677+ private predicate traitIsVisibleTC ( TNode trait , TNode element ) =
1678+ doublyBoundedFastTC( step / 2 , isTrait / 1 , isElement / 1 ) ( trait , element )
1679+
1680+ pragma [ nomagic]
1681+ private predicate relevantTraitVisibleLift ( TNode trait , TElement element ) {
1682+ exists ( Trait t , Element e |
1683+ trait = TTrait ( t ) and
1684+ element = TElement ( e ) and
1685+ relevantTraitVisible ( e , t )
16571686 )
16581687 }
16591688
16601689 /** Holds if the trait `trait` is visible at `element`. */
16611690 pragma [ nomagic]
16621691 predicate traitIsVisible ( Element element , Trait trait ) {
1663- exists ( ItemNode encl |
1664- traitLookup ( encl , element , trait ) and trait = encl .getASuccessor ( _, _, _)
1692+ exists ( TNode t , TNode e |
1693+ traitIsVisibleTC ( t , e ) and
1694+ relevantTraitVisibleLift ( t , e ) and
1695+ t = TTrait ( trait ) and
1696+ e = TElement ( element )
16651697 )
16661698 }
16671699}
@@ -2101,7 +2133,7 @@ private predicate builtin(string name, ItemNode i) {
21012133
21022134/** Provides predicates for debugging the path resolution implementation. */
21032135private module Debug {
2104- private Locatable getRelevantLocatable ( ) {
2136+ Locatable getRelevantLocatable ( ) {
21052137 exists ( string filepath , int startline , int startcolumn , int endline , int endcolumn |
21062138 result .getLocation ( ) .hasLocationInfo ( filepath , startline , startcolumn , endline , endcolumn ) and
21072139 filepath .matches ( "%/main.rs" ) and
0 commit comments