@@ -733,7 +733,7 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
733733 }
734734}
735735
736- final private class ImplTraitTypeReprItemNode extends TypeItemNode instanceof ImplTraitTypeRepr {
736+ final class ImplTraitTypeReprItemNode extends TypeItemNode instanceof ImplTraitTypeRepr {
737737 pragma [ nomagic]
738738 Path getABoundPath ( ) {
739739 result = super .getTypeBoundList ( ) .getABound ( ) .getTypeRepr ( ) .( PathTypeRepr ) .getPath ( )
@@ -1260,6 +1260,12 @@ private predicate crateDependency(SourceFileItemNode file, string name, CrateIte
12601260 exists ( CrateItemNode c | dep = c .( Crate ) .getDependency ( name ) | file = c .getASourceFile ( ) )
12611261}
12621262
1263+ pragma [ nomagic]
1264+ private predicate hasDeclOrDep ( SourceFileItemNode file , string name ) {
1265+ declaresDirectly ( file , TTypeNamespace ( ) , name ) or
1266+ crateDependency ( file , name , _)
1267+ }
1268+
12631269/**
12641270 * Holds if `file` depends on crate `dep` named `name`.
12651271 */
@@ -1273,8 +1279,7 @@ private predicate crateDependencyEdge(SourceFileItemNode file, string name, Crat
12731279 // a given file to its crate (for example, if the file is `mod` imported inside a macro that the
12741280 // extractor is unable to expand).
12751281 name = dep .getName ( ) and
1276- not declaresDirectly ( file , TTypeNamespace ( ) , name ) and
1277- not crateDependency ( file , name , _)
1282+ not hasDeclOrDep ( file , name )
12781283}
12791284
12801285private predicate useTreeDeclares ( UseTree tree , string name ) {
@@ -1445,24 +1450,56 @@ signature predicate relevantTraitVisibleSig(Element element, Trait trait);
14451450 * at a given element.
14461451 */
14471452module TraitIsVisible< relevantTraitVisibleSig / 2 relevantTraitVisible> {
1448- /** Holds if the trait might be looked up in `encl`. */
1449- private predicate traitLookup ( ItemNode encl , Element element , Trait trait ) {
1450- // lookup in immediately enclosing item
1451- relevantTraitVisible ( element , trait ) and
1452- encl .getADescendant ( ) = element
1453+ private newtype TNode =
1454+ TTrait ( Trait t ) { relevantTraitVisible ( _, t ) } or
1455+ TItemNode ( ItemNode i ) or
1456+ TElement ( Element e ) { relevantTraitVisible ( e , _) }
1457+
1458+ private predicate isTrait ( TNode n ) { n instanceof TTrait }
1459+
1460+ private predicate step ( TNode n1 , TNode n2 ) {
1461+ exists ( Trait t1 , ItemNode i2 |
1462+ n1 = TTrait ( t1 ) and
1463+ n2 = TItemNode ( i2 ) and
1464+ t1 = i2 .getASuccessor ( _, _)
1465+ )
14531466 or
1454- // lookup in an outer scope, but only if the trait is not declared in inner scope
1455- exists ( ItemNode mid |
1456- traitLookup ( mid , element , trait ) and
1457- not trait = mid .getASuccessor ( _, _) and
1458- encl = getOuterScope ( mid )
1467+ exists ( ItemNode i1 , ItemNode i2 |
1468+ n1 = TItemNode ( i1 ) and
1469+ n2 = TItemNode ( i2 ) and
1470+ i1 = getOuterScope ( i2 )
1471+ )
1472+ or
1473+ exists ( ItemNode i1 , Element e2 |
1474+ n1 = TItemNode ( i1 ) and
1475+ n2 = TElement ( e2 ) and
1476+ i1 .getADescendant ( ) = e2
1477+ )
1478+ }
1479+
1480+ private predicate isElement ( TNode n ) { n instanceof TElement }
1481+
1482+ private predicate traitIsVisibleTC ( TNode trait , TNode element ) =
1483+ doublyBoundedFastTC( step / 2 , isTrait / 1 , isElement / 1 ) ( trait , element )
1484+
1485+ pragma [ nomagic]
1486+ private predicate relevantTraitVisibleLift ( TNode trait , TElement element ) {
1487+ exists ( Trait t , Element e |
1488+ trait = TTrait ( t ) and
1489+ element = TElement ( e ) and
1490+ relevantTraitVisible ( e , t )
14591491 )
14601492 }
14611493
14621494 /** Holds if the trait `trait` is visible at `element`. */
14631495 pragma [ nomagic]
14641496 predicate traitIsVisible ( Element element , Trait trait ) {
1465- exists ( ItemNode encl | traitLookup ( encl , element , trait ) and trait = encl .getASuccessor ( _, _) )
1497+ exists ( TNode t , TNode e |
1498+ traitIsVisibleTC ( t , e ) and
1499+ relevantTraitVisibleLift ( t , e ) and
1500+ t = TTrait ( trait ) and
1501+ e = TElement ( element )
1502+ )
14661503 }
14671504}
14681505
0 commit comments