@@ -745,7 +745,7 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
745745 }
746746}
747747
748- final private class ImplTraitTypeReprItemNode extends TypeItemNode instanceof ImplTraitTypeRepr {
748+ final class ImplTraitTypeReprItemNode extends TypeItemNode instanceof ImplTraitTypeRepr {
749749 pragma [ nomagic]
750750 Path getABoundPath ( ) {
751751 result = super .getTypeBoundList ( ) .getABound ( ) .getTypeRepr ( ) .( PathTypeRepr ) .getPath ( )
@@ -1272,6 +1272,12 @@ private predicate crateDependency(SourceFileItemNode file, string name, CrateIte
12721272 exists ( CrateItemNode c | dep = c .( Crate ) .getDependency ( name ) | file = c .getASourceFile ( ) )
12731273}
12741274
1275+ pragma [ nomagic]
1276+ private predicate hasDeclOrDep ( SourceFileItemNode file , string name ) {
1277+ declaresDirectly ( file , TTypeNamespace ( ) , name ) or
1278+ crateDependency ( file , name , _)
1279+ }
1280+
12751281/**
12761282 * Holds if `file` depends on crate `dep` named `name`.
12771283 */
@@ -1285,8 +1291,7 @@ private predicate crateDependencyEdge(SourceFileItemNode file, string name, Crat
12851291 // a given file to its crate (for example, if the file is `mod` imported inside a macro that the
12861292 // extractor is unable to expand).
12871293 name = dep .getName ( ) and
1288- not declaresDirectly ( file , TTypeNamespace ( ) , name ) and
1289- not crateDependency ( file , name , _)
1294+ not hasDeclOrDep ( file , name )
12901295}
12911296
12921297private predicate useTreeDeclares ( UseTree tree , string name ) {
@@ -1458,24 +1463,56 @@ signature predicate relevantTraitVisibleSig(Element element, Trait trait);
14581463 * at a given element.
14591464 */
14601465module TraitIsVisible< relevantTraitVisibleSig / 2 relevantTraitVisible> {
1461- /** Holds if the trait might be looked up in `encl`. */
1462- private predicate traitLookup ( ItemNode encl , Element element , Trait trait ) {
1463- // lookup in immediately enclosing item
1464- relevantTraitVisible ( element , trait ) and
1465- encl .getADescendant ( ) = element
1466+ private newtype TNode =
1467+ TTrait ( Trait t ) { relevantTraitVisible ( _, t ) } or
1468+ TItemNode ( ItemNode i ) or
1469+ TElement ( Element e ) { relevantTraitVisible ( e , _) }
1470+
1471+ private predicate isTrait ( TNode n ) { n instanceof TTrait }
1472+
1473+ private predicate step ( TNode n1 , TNode n2 ) {
1474+ exists ( Trait t1 , ItemNode i2 |
1475+ n1 = TTrait ( t1 ) and
1476+ n2 = TItemNode ( i2 ) and
1477+ t1 = i2 .getASuccessor ( _, _)
1478+ )
14661479 or
1467- // lookup in an outer scope, but only if the trait is not declared in inner scope
1468- exists ( ItemNode mid |
1469- traitLookup ( mid , element , trait ) and
1470- not trait = mid .getASuccessor ( _, _) and
1471- encl = getOuterScope ( mid )
1480+ exists ( ItemNode i1 , ItemNode i2 |
1481+ n1 = TItemNode ( i1 ) and
1482+ n2 = TItemNode ( i2 ) and
1483+ i1 = getOuterScope ( i2 )
1484+ )
1485+ or
1486+ exists ( ItemNode i1 , Element e2 |
1487+ n1 = TItemNode ( i1 ) and
1488+ n2 = TElement ( e2 ) and
1489+ i1 .getADescendant ( ) = e2
1490+ )
1491+ }
1492+
1493+ private predicate isElement ( TNode n ) { n instanceof TElement }
1494+
1495+ private predicate traitIsVisibleTC ( TNode trait , TNode element ) =
1496+ doublyBoundedFastTC( step / 2 , isTrait / 1 , isElement / 1 ) ( trait , element )
1497+
1498+ pragma [ nomagic]
1499+ private predicate relevantTraitVisibleLift ( TNode trait , TElement element ) {
1500+ exists ( Trait t , Element e |
1501+ trait = TTrait ( t ) and
1502+ element = TElement ( e ) and
1503+ relevantTraitVisible ( e , t )
14721504 )
14731505 }
14741506
14751507 /** Holds if the trait `trait` is visible at `element`. */
14761508 pragma [ nomagic]
14771509 predicate traitIsVisible ( Element element , Trait trait ) {
1478- exists ( ItemNode encl | traitLookup ( encl , element , trait ) and trait = encl .getASuccessor ( _, _) )
1510+ exists ( TNode t , TNode e |
1511+ traitIsVisibleTC ( t , e ) and
1512+ relevantTraitVisibleLift ( t , e ) and
1513+ t = TTrait ( trait ) and
1514+ e = TElement ( element )
1515+ )
14791516 }
14801517}
14811518
0 commit comments