better deduce function name

This commit is contained in:
Dmitry Vasilev
2022-11-08 20:06:26 +08:00
parent af6cec2505
commit c870d70f30
2 changed files with 21 additions and 7 deletions

View File

@@ -159,7 +159,7 @@ const codegen = (node, cxt, parent) => {
return el.value return el.value
} else if(el.type == 'key_value_pair') { } else if(el.type == 'key_value_pair') {
return '[' + do_codegen(el.key.type == 'computed_property' ? el.key.expr : el.key) + ']' return '[' + do_codegen(el.key.type == 'computed_property' ? el.key.expr : el.key) + ']'
+ ': (' + do_codegen(el.value) + ')' + ': (' + do_codegen(el.value, el) + ')'
} else { } else {
throw new Error('unknown node type ' + el.type) throw new Error('unknown node type ' + el.type)
} }
@@ -169,12 +169,18 @@ const codegen = (node, cxt, parent) => {
} else if(node.type == 'function_call'){ } else if(node.type == 'function_call'){
return codegen_function_call(node, cxt) return codegen_function_call(node, cxt)
} else if(node.type == 'function_expr'){ } else if(node.type == 'function_expr'){
const name = parent != null && parent.type == 'const' let name
// TODO here we deduce fn name from left-side of assignment // TODO here we deduce fn name from left-side of assignment
// TODO name inference is much more sophisticated, for example // TODO name inference is much more sophisticated, for example
// `{foo: () => {...}}` infers name `foo` // `{foo: () => {...}}` infers name `foo`
? parent.name if(parent?.type == 'const') {
: 'anonymous' name = parent.name
} else if(parent?.type == 'key_value_pair') {
// unwrap quotes with JSON.parse
name = JSON.parse(parent.key.value)
} else {
name = 'anonymous'
}
return codegen_function_expr(node, cxt, name) return codegen_function_expr(node, cxt, name)
} else if(node.type == 'ternary'){ } else if(node.type == 'ternary'){
return '' return ''

View File

@@ -459,6 +459,14 @@ export const tests = [
) )
}), }),
test('function name from object literal', () => {
const i = test_initial_state(`
const fns = {x: () => 1}
fns.x()
`)
assert_equal(root_calltree_node(i).children[0].fn.name, 'x')
}),
test('function name', () => { test('function name', () => {
// TODO // TODO
/* /*