@@ -11,6 +11,7 @@ private import semmle.javascript.dataflow.internal.PreCallGraphStep
1111private import semmle.javascript.dataflow.internal.StepSummary
1212private import semmle.javascript.dataflow.internal.sharedlib.SummaryTypeTracker as SummaryTypeTracker
1313private import semmle.javascript.dataflow.internal.Contents:: Private as ContentPrivate
14+ private import semmle.javascript.DynamicPropertyAccess
1415private import internal.CachedStages
1516
1617/**
@@ -1516,7 +1517,12 @@ module API {
15161517 * Currently this is represented the same way as an unknown array element, but this may
15171518 * change in the future.
15181519 */
1519- LabelContent unknownMember ( ) { result .getContent ( ) .isUnknownArrayElement ( ) }
1520+ ApiLabel unknownMember ( ) { result = arrayElement ( ) }
1521+
1522+ /**
1523+ * Gets the edge label for an unknown array element.
1524+ */
1525+ LabelContent arrayElement ( ) { result .getContent ( ) .isUnknownArrayElement ( ) }
15201526
15211527 /**
15221528 * Gets a property name referred to by the given dynamic property access,
@@ -1539,6 +1545,11 @@ module API {
15391545 result = unique( string s | s = getAnIndirectPropName ( ref ) )
15401546 }
15411547
1548+ pragma [ nomagic]
1549+ private predicate isEnumeratedPropName ( DataFlow:: Node node ) {
1550+ node .getAPredecessor * ( ) instanceof EnumeratedPropName
1551+ }
1552+
15421553 /** Gets the `member` edge label for the given property reference. */
15431554 ApiLabel memberFromRef ( DataFlow:: PropRef pr ) {
15441555 exists ( string pn | pn = pr .getPropertyName ( ) or pn = getIndirectPropName ( pr ) |
@@ -1550,7 +1561,9 @@ module API {
15501561 or
15511562 not exists ( pr .getPropertyName ( ) ) and
15521563 not exists ( getIndirectPropName ( pr ) ) and
1553- result = unknownMember ( )
1564+ // Avoid assignments in an extend-like pattern
1565+ not isEnumeratedPropName ( pr .getPropertyNameExpr ( ) .flow ( ) ) and
1566+ result = arrayElement ( )
15541567 }
15551568
15561569 /** Gets the `instance` edge label. */
0 commit comments