Skip to content

Commit b561826

Browse files
committed
JS: Replace member edges with content edges
1 parent 87dfaa6 commit b561826

File tree

2 files changed

+37
-31
lines changed

2 files changed

+37
-31
lines changed

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

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,10 +1473,13 @@ module API {
14731473
/** Gets the `member` edge label for member `m`. */
14741474
bindingset[m]
14751475
bindingset[result]
1476-
LabelMember member(string m) { result.getProperty() = m }
1476+
LabelContent member(string m) { result.getContent().asPropertyName() = m }
1477+
1478+
/** Gets the `content` edge label for content `c`. */
1479+
LabelContent content(Content c) { result.getContent() = c }
14771480

14781481
/** Gets the `member` edge label for the unknown member. */
1479-
LabelUnknownMember unknownMember() { any() }
1482+
LabelContent unknownMember() { result.getContent().isUnknownArrayElement() }
14801483

14811484
/**
14821485
* Gets a property name referred to by the given dynamic property access,
@@ -1533,10 +1536,10 @@ module API {
15331536
LabelForwardingFunction forwardingFunction() { any() }
15341537

15351538
/** Gets the `promised` edge label connecting a promise to its contained value. */
1536-
LabelPromised promised() { any() }
1539+
LabelContent promised() { result.getContent() = MkPromiseValue() }
15371540

15381541
/** Gets the `promisedError` edge label connecting a promise to its rejected value. */
1539-
LabelPromisedError promisedError() { any() }
1542+
LabelContent promisedError() { result.getContent() = MkPromiseError() }
15401543

15411544
/** Gets the label for an edge leading from a value `D` to any class that has `D` as a decorator. */
15421545
LabelDecoratedClass decoratedClass() { any() }
@@ -1550,6 +1553,7 @@ module API {
15501553
/** Gets an entry-point label for the entry-point `e`. */
15511554
LabelEntryPoint entryPoint(API::EntryPoint e) { result.getEntryPoint() = e }
15521555

1556+
private import semmle.javascript.dataflow.internal.Contents::Private
15531557
private import LabelImpl
15541558

15551559
private module LabelImpl {
@@ -1559,18 +1563,7 @@ module API {
15591563
exists(Impl::MkModuleImport(mod))
15601564
} or
15611565
MkLabelInstance() or
1562-
MkLabelMember(string prop) {
1563-
exports(_, prop, _) or
1564-
exists(any(DataFlow::ClassNode c).getInstanceMethod(prop)) or
1565-
prop = "exports" or
1566-
prop = any(CanonicalName c).getName() or
1567-
prop = any(DataFlow::PropRef p).getPropertyName() or
1568-
exists(Impl::MkTypeUse(_, prop)) or
1569-
exists(any(Module m).getAnExportedValue(prop)) or
1570-
PreCallGraphStep::loadStep(_, _, prop) or
1571-
PreCallGraphStep::storeStep(_, _, prop)
1572-
} or
1573-
MkLabelUnknownMember() or
1566+
MkLabelContent(DataFlow::Content content) or
15741567
MkLabelParameter(int i) {
15751568
i =
15761569
[0 .. max(int args |
@@ -1581,8 +1574,6 @@ module API {
15811574
} or
15821575
MkLabelReceiver() or
15831576
MkLabelReturn() or
1584-
MkLabelPromised() or
1585-
MkLabelPromisedError() or
15861577
MkLabelDecoratedClass() or
15871578
MkLabelDecoratedMember() or
15881579
MkLabelDecoratedParameter() or
@@ -1602,13 +1593,13 @@ module API {
16021593
}
16031594

16041595
/** A label that gets a promised value. */
1605-
class LabelPromised extends ApiLabel, MkLabelPromised {
1606-
override string toString() { result = "getPromised()" }
1596+
deprecated class LabelPromised extends ApiLabel {
1597+
LabelPromised() { this = MkLabelContent(MkPromiseValue()) }
16071598
}
16081599

16091600
/** A label that gets a rejected promise. */
1610-
class LabelPromisedError extends ApiLabel, MkLabelPromisedError {
1611-
override string toString() { result = "getPromisedError()" }
1601+
deprecated class LabelPromisedError extends ApiLabel {
1602+
LabelPromisedError() { this = MkLabelContent(MkPromiseError()) }
16121603
}
16131604

16141605
/** A label that gets the return value of a function. */
@@ -1634,23 +1625,36 @@ module API {
16341625
override string toString() { result = "getInstance()" }
16351626
}
16361627

1628+
/** A label for a content. */
1629+
class LabelContent extends ApiLabel, MkLabelContent {
1630+
private DataFlow::Content content;
1631+
1632+
LabelContent() { this = MkLabelContent(content) }
1633+
1634+
/** Gets the content associated with this label. */
1635+
DataFlow::Content getContent() { result = content }
1636+
1637+
override string toString() {
1638+
result = "getMember(\"" + content.asPropertyName() + "\")"
1639+
or
1640+
not exists(content.asPropertyName()) and
1641+
result = "getContent(" + content + ")"
1642+
}
1643+
}
1644+
16371645
/** A label for the member named `prop`. */
1638-
class LabelMember extends ApiLabel, MkLabelMember {
1639-
string prop;
1646+
deprecated class LabelMember extends LabelContent {
1647+
private string prop;
16401648

1641-
LabelMember() { this = MkLabelMember(prop) }
1649+
LabelMember() { prop = this.getContent().asPropertyName() }
16421650

16431651
/** Gets the property associated with this label. */
16441652
string getProperty() { result = prop }
1645-
1646-
override string toString() { result = "getMember(\"" + prop + "\")" }
16471653
}
16481654

16491655
/** A label for a member with an unknown name. */
1650-
class LabelUnknownMember extends ApiLabel, MkLabelUnknownMember {
1651-
LabelUnknownMember() { this = MkLabelUnknownMember() }
1652-
1653-
override string toString() { result = "getUnknownMember()" }
1656+
deprecated class LabelUnknownMember extends LabelContent {
1657+
LabelUnknownMember() { this.getContent().isUnknownArrayElement() }
16541658
}
16551659

16561660
/** A label for parameter `i`. */

javascript/ql/lib/semmle/javascript/dataflow/internal/Contents.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ module Private {
5757
this = getAPreciseArrayIndex().toString()
5858
or
5959
isAccessPathTokenPresent("Member", this)
60+
or
61+
this = ["exports", "default"] // needed by API graphs
6062
}
6163

6264
/** Gets the array index corresponding to this property name. */

0 commit comments

Comments
 (0)