mirror of
https://github.com/leporello-js/leporello-js
synced 2026-01-13 21:14:28 -08:00
better deduce function name
This commit is contained in:
14
src/eval.js
14
src/eval.js
@@ -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 ''
|
||||||
|
|||||||
@@ -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
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user