Closed
Description
TypeScript Version: 3.6.3
Search Terms:
arguments, arguments_1
Code
// A *self-contained* demonstration of the problem follows...
// Test this by running `tsc` on the command-line, rather than through another build tool such as Gulp, Webpack, etc.
function parseMemberOrCallExpression(tokens: (Token | Expression)[]) {
const newTokens: (Token | Expression)[] = []
let expectCall = false
for (let i = 0; i < tokens.length; i++) {
const token = tokens[i]
if (token.type === 'PunctuatorToken') {
if (!expectCall && token.value === '?.') {
expectCall = true
continue
}
if (expectCall && token.value !== '[' && token.value !== '(') {
throw new Error(replaceLocaleParameters(this.locale.unexpectToken, token.range[0], token.range[1]))
}
if (callOperators.includes(token.value)) {
const object = newTokens.pop()!
newTokens.push(this.parseExpression([object, token, tokens[i + 1]], getHeadTailRange(object, tokens[i + 1])))
i++
} else if (token.value === '[') {
const index = this.findGroupEnd(tokens, i, token.value)
const object = newTokens.pop()!
const groupedTokens = tokens.filter((_, j) => j > i && j < index)
const property = this.parseExpression(groupedTokens, getTokensRange(groupedTokens))
const memberExpression: MemberExpression = {
type: 'MemberExpression',
object: this.parseTokenOrExpression(object),
property: this.parseTokenOrExpression(property),
range: [object.range[0], tokens[index].range[1]]
}
if (expectCall) {
memberExpression.optional = true
}
newTokens.push(memberExpression)
i = index
} else if (token.value === '(') {
const index = this.findGroupEnd(tokens, i, token.value)
const argumentsExpressions = this.parseItems(tokens, i, index)
const lastToken = newTokens.pop()!
const callExpression: CallExpression = {
type: 'CallExpression',
callee: this.parseExpression([lastToken], lastToken.range),
arguments: argumentsExpressions,
range: [lastToken.range[0], tokens[index].range[1]]
}
if (expectCall) {
callExpression.optional = true
}
newTokens.push(callExpression)
i = index
} else {
newTokens.push(token)
}
} else {
newTokens.push(token)
}
}
return this.parseExpression(newTokens, getTokensRange(newTokens))
}
Expected behavior:
var callExpression = {
type: 'CallExpression',
callee: this_1.parseExpression([lastToken], lastToken.range),
arguments: argumentsExpressions,
range: [lastToken.range[0], tokens[index].range[1]]
};
Actual behavior:
var callExpression = {
type: 'CallExpression',
callee: this_1.parseExpression([lastToken], lastToken.range),
arguments_1: argumentsExpressions,
range: [lastToken.range[0], tokens[index].range[1]]
};
Related Issues:
Metadata
Metadata
Assignees
Labels
No labels