Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
export function parse(source: string, context: Context) {
let program: es.Program | undefined
try {
program = (acornParse(source, createAcornParserOptions(context)) as unknown) as es.Program
ancestor(program as es.Node, walkers, undefined, context)
} catch (error) {
if (error instanceof SyntaxError) {
// tslint:disable-next-line:no-any
const loc = (error as any).loc
const location = {
start: { line: loc.line, column: loc.column },
end: { line: loc.line, column: loc.column + 1 }
}
context.errors.push(new FatalSyntaxError(location, error.toString()))
} else {
throw error
}
}
const hasErrors = context.errors.find(m => m.severity === ErrorSeverity.ERROR)
if (program && !hasErrors) {
return program
identifiers.add((statement.id as es.Identifier).name)
}
}
identifiersIntroducedByNode.set(node, identifiers)
}
function processFunction(
node: es.FunctionDeclaration | es.ArrowFunctionExpression,
ancestors: es.Node[]
) {
identifiersIntroducedByNode.set(
node,
new Set((node.params as es.Identifier[]).map(id => id.name))
)
}
const identifiersToAncestors = new Map()
ancestor(program, {
Program: processBlock,
BlockStatement: processBlock,
FunctionDeclaration: processFunction,
ArrowFunctionExpression: processFunction,
ForStatement(forStatement: es.ForStatement, ancestors: es.Node[]) {
const init = forStatement.init!
if (init.type === 'VariableDeclaration') {
identifiersIntroducedByNode.set(
forStatement,
new Set([(init.declarations[0].id as es.Identifier).name])
)
}
},
Identifier(identifier: es.Identifier, ancestors: es.Node[]) {
identifiersToAncestors.set(identifier, [...ancestors])
},