-
Notifications
You must be signed in to change notification settings - Fork 13
Description
Lines 75 to 86 in ea8d5c8
"nth": (A, T, num) => { | |
num = parseInt(num, 10) | |
let parent = A.getParentNode(T, "*") | |
if (parent !== null) { | |
let pchilds = A.getChildNodes(parent, "*") | |
if (num < 0) | |
num = pchilds.length - (num + 1) | |
for (let i = 0; i < pchilds.length; i++) | |
if (pchilds[i] === T) | |
return ((i + 1) === num) | |
return false | |
} |
It seems like nth
is implemented by getting the parent, then getting the children on *
axis, and finding the element in question.
This produces arguably unexpected cases where nth
is called from within a filter on an axis with an id, e.g. I would expect
/ ExpressionStatement / CallExpression /:arguments * [
nth(1)
]
running on the input ast of
a(1)
to find the 1st argument of the CallExpression (1-based indexing, ouch).
Instead, this query returns nothing, because the 1st child of the CallExpression on axis *
is actually the function that was called, located on .callee
.
What now? Always just +1
the parameter for nth
in this case? Not pretty, and doesn't work on ast nodes with multiple variable-length child arrays.
While testing this, I've also found that
/ ExpressionStatement / CallExpression / *
finds 'Identifier', 'Literal', 'ExpressionStatement'
:
What is happening here? Why is ExpressionStatement, which is the parent of the CallExpression, being matched by this Query?
The readme defines the /
Axis as:
/
for direct child nodes
Edit: Turns out this last part is likely caused by astq considering the parent
property (which I populated on my mozast to get nth
to work) as a valid child axis.