@@ -786,7 +786,7 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
786786 }
787787}
788788
789- final private class ImplTraitTypeReprItemNode extends TypeItemNode instanceof ImplTraitTypeRepr {
789+ final class ImplTraitTypeReprItemNode extends TypeItemNode instanceof ImplTraitTypeRepr {
790790 pragma [ nomagic]
791791 Path getABoundPath ( ) {
792792 result = super .getTypeBoundList ( ) .getABound ( ) .getTypeRepr ( ) .( PathTypeRepr ) .getPath ( )
@@ -1317,6 +1317,12 @@ private predicate crateDependency(SourceFileItemNode file, string name, CrateIte
13171317 exists ( CrateItemNode c | dep = c .( Crate ) .getDependency ( name ) | file = c .getASourceFile ( ) )
13181318}
13191319
1320+ pragma [ nomagic]
1321+ private predicate hasDeclOrDep ( SourceFileItemNode file , string name ) {
1322+ declaresDirectly ( file , TTypeNamespace ( ) , name ) or
1323+ crateDependency ( file , name , _)
1324+ }
1325+
13201326/**
13211327 * Holds if `file` depends on crate `dep` named `name`.
13221328 */
@@ -1330,8 +1336,7 @@ private predicate crateDependencyEdge(SourceFileItemNode file, string name, Crat
13301336 // a given file to its crate (for example, if the file is `mod` imported inside a macro that the
13311337 // extractor is unable to expand).
13321338 name = dep .getName ( ) and
1333- not declaresDirectly ( file , TTypeNamespace ( ) , name ) and
1334- not crateDependency ( file , name , _)
1339+ not hasDeclOrDep ( file , name )
13351340}
13361341
13371342private predicate useTreeDeclares ( UseTree tree , string name ) {
@@ -1505,25 +1510,55 @@ signature predicate relevantTraitVisibleSig(Element element, Trait trait);
15051510 * at a given element.
15061511 */
15071512module TraitIsVisible< relevantTraitVisibleSig / 2 relevantTraitVisible> {
1508- /** Holds if the trait might be looked up in `encl`. */
1509- private predicate traitLookup ( ItemNode encl , Element element , Trait trait ) {
1510- // lookup in immediately enclosing item
1511- relevantTraitVisible ( element , trait ) and
1512- encl .getADescendant ( ) = element
1513+ private newtype TNode =
1514+ TTrait ( Trait t ) { relevantTraitVisible ( _, t ) } or
1515+ TItemNode ( ItemNode i ) or
1516+ TElement ( Element e ) { relevantTraitVisible ( e , _) }
1517+
1518+ private predicate isTrait ( TNode n ) { n instanceof TTrait }
1519+
1520+ private predicate step ( TNode n1 , TNode n2 ) {
1521+ exists ( Trait t1 , ItemNode i2 |
1522+ n1 = TTrait ( t1 ) and
1523+ n2 = TItemNode ( i2 ) and
1524+ t1 = i2 .getASuccessor ( _, _, _)
1525+ )
15131526 or
1514- // lookup in an outer scope, but only if the trait is not declared in inner scope
1515- exists ( ItemNode mid |
1516- traitLookup ( mid , element , trait ) and
1517- not trait = mid .getASuccessor ( _, _, _) and
1518- encl = getOuterScope ( mid )
1527+ exists ( ItemNode i1 , ItemNode i2 |
1528+ n1 = TItemNode ( i1 ) and
1529+ n2 = TItemNode ( i2 ) and
1530+ i1 = getOuterScope ( i2 )
1531+ )
1532+ or
1533+ exists ( ItemNode i1 , Element e2 |
1534+ n1 = TItemNode ( i1 ) and
1535+ n2 = TElement ( e2 ) and
1536+ i1 .getADescendant ( ) = e2
1537+ )
1538+ }
1539+
1540+ private predicate isElement ( TNode n ) { n instanceof TElement }
1541+
1542+ private predicate traitIsVisibleTC ( TNode trait , TNode element ) =
1543+ doublyBoundedFastTC( step / 2 , isTrait / 1 , isElement / 1 ) ( trait , element )
1544+
1545+ pragma [ nomagic]
1546+ private predicate relevantTraitVisibleLift ( TNode trait , TElement element ) {
1547+ exists ( Trait t , Element e |
1548+ trait = TTrait ( t ) and
1549+ element = TElement ( e ) and
1550+ relevantTraitVisible ( e , t )
15191551 )
15201552 }
15211553
15221554 /** Holds if the trait `trait` is visible at `element`. */
15231555 pragma [ nomagic]
15241556 predicate traitIsVisible ( Element element , Trait trait ) {
1525- exists ( ItemNode encl |
1526- traitLookup ( encl , element , trait ) and trait = encl .getASuccessor ( _, _, _)
1557+ exists ( TNode t , TNode e |
1558+ traitIsVisibleTC ( t , e ) and
1559+ relevantTraitVisibleLift ( t , e ) and
1560+ t = TTrait ( trait ) and
1561+ e = TElement ( element )
15271562 )
15281563 }
15291564}
0 commit comments