Skip to content

Commit 0a1d85d

Browse files
committed
JS: Make API nodes and labels local
1 parent c490388 commit 0a1d85d

1 file changed

Lines changed: 16 additions & 2 deletions

File tree

javascript/ql/lib/semmle/javascript/ApiGraphs.qll

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,7 @@ module API {
743743
private predicate hasTypeUseLocal(string moduleName, string exportName) =
744744
forceLocal(hasTypeUse/2)(moduleName, exportName)
745745

746+
overlay[local]
746747
cached
747748
newtype TApiNode =
748749
MkRoot() or
@@ -1623,6 +1624,7 @@ module API {
16231624
class NewNode extends InvokeNode, DataFlow::NewNode { }
16241625

16251626
/** Provides classes modeling the various edges (labels) in the API graph. */
1627+
overlay[local]
16261628
module Label {
16271629
/** A label in the API-graph */
16281630
class ApiLabel extends TLabel {
@@ -1661,6 +1663,7 @@ module API {
16611663
* This is to support code patterns where the property name is actually constant,
16621664
* but the property name has been factored into a library.
16631665
*/
1666+
overlay[global]
16641667
private string getAnIndirectPropName(DataFlow::PropRef ref) {
16651668
exists(DataFlow::Node pred |
16661669
FlowSteps::propertyFlowStep(pred, ref.getPropertyNameExpr().flow()) and
@@ -1671,16 +1674,19 @@ module API {
16711674
/**
16721675
* Gets unique result of `getAnIndirectPropName` if there is one.
16731676
*/
1677+
overlay[global]
16741678
private string getIndirectPropName(DataFlow::PropRef ref) {
16751679
result = unique(string s | s = getAnIndirectPropName(ref))
16761680
}
16771681

1682+
overlay[global]
16781683
pragma[nomagic]
16791684
private predicate isEnumeratedPropName(DataFlow::Node node) {
16801685
node.getAPredecessor*() instanceof EnumeratedPropName
16811686
}
16821687

16831688
/** Gets the `member` edge label for the given property reference. */
1689+
overlay[global]
16841690
ApiLabel memberFromRef(DataFlow::PropRef pr) {
16851691
exists(string pn | pn = pr.getPropertyName() or pn = getIndirectPropName(pr) |
16861692
result = member(pn) and
@@ -1747,9 +1753,17 @@ module API {
17471753
MkLabelInstance() or
17481754
MkLabelContent(DataFlow::Content content) or
17491755
MkLabelMember(string name) {
1750-
name instanceof PropertyName
1756+
name instanceof ContentPrivate::PropertyName
1757+
or
1758+
name = any(DataFlow::PropRef pr).getPropertyName()
1759+
or
1760+
AccessPath::isAssignedInUniqueFile(name)
1761+
or
1762+
exists(AccessPath::getAnAssignmentTo(_, name))
1763+
or
1764+
name = DataFlow::PseudoProperties::arrayLikeElement()
17511765
or
1752-
exists(Impl::MkTypeUse(_, name))
1766+
name = any(TypeAccess t).getIdentifier().getName()
17531767
} or
17541768
MkLabelParameter(int i) {
17551769
i =

0 commit comments

Comments
 (0)