Skip to content

Commit d5facc7

Browse files
committed
impl: local variables
1 parent 85cc26c commit d5facc7

File tree

5 files changed

+137
-12
lines changed

5 files changed

+137
-12
lines changed

src/class/Project.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,13 @@ export interface Message {
3434

3535
export interface Function_ {
3636
id: string;
37-
block: string;
37+
type: "normal" | "value"
38+
localVariables: {
39+
name: string
40+
value: number
41+
id: string
42+
}[]
43+
useLocalVariables: boolean
3844
content: Script;
3945
}
4046

src/util/projectToJs.ts

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,13 @@ export const projectToJs =
2727
)
2828
+ "\n\n"
2929
+ project.functions.map(
30-
({id, content}) => {
31-
const expr = scriptToExpressions(content)
30+
({id, content, localVariables}) => {
31+
const expr = functionToArrow(
32+
content[0][0],
33+
localVariables.map(
34+
({id}) => `let v_${id}` as Expression
35+
)
36+
)
3237
return `Entry.func_${id} = ${expr}`
3338
}
3439
).join("\n")
@@ -67,9 +72,6 @@ export const eventHandlerToFunction =
6772
]
6873
)
6974
}
70-
if (event?.type == "function_create") {
71-
return functionToArrow(event)
72-
}
7375
}
7476

7577
export const getFunctionArgs =
@@ -94,17 +96,26 @@ export const getFunctionArgs =
9496
}
9597

9698
export const functionToArrow =
97-
({params, statements}: Block) =>
98-
cg.arrow(
99+
({params, statements}: Block, injectBefore: Expression[] = []) => {
100+
return cg.arrow(
99101
[
100102
...getFunctionArgs(params[0] as Block),
101103
"obj" as Expression,
102104
],
103-
statements[0].map(
104-
blockToExpression
105-
)
105+
[
106+
...injectBefore,
107+
...statements[0].map(
108+
blockToExpression
109+
),
110+
...(
111+
params[3]
112+
? ["return " + blockToExpression(params[3]) as Expression]
113+
: []
114+
)
115+
]
106116
)
107117
.replaceAll(`"$obj$"`, "obj") as Expression
118+
}
108119

109120
export const blockGroupToArrow =
110121
(blockGroup: Block[]) =>
@@ -137,6 +148,16 @@ export const blockToExpression =
137148
|| block.type.startsWith("booleanParam_")
138149
)
139150
return block.type as Expression
151+
152+
if (block.type == "set_func_variable")
153+
return `v_${
154+
block.params[0]
155+
} = ${
156+
blockToExpression(block.params[1]!)
157+
}` as Expression
158+
159+
if (block.type == "get_func_variable")
160+
return `v_${block.params[0]}` as Expression
140161

141162
return cg.call(
142163
"Entry." + block.type as Expression,

test/fib.js

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fib.json

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
{
2+
"objects": [
3+
{
4+
"id": "ctqk",
5+
"name": "새 오브젝트2",
6+
"script": "[[{\"id\":\"hxah\",\"x\":29,\"y\":74,\"type\":\"when_run_button_click\",\"params\":[null],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]},{\"id\":\"dxel\",\"x\":0,\"y\":0,\"type\":\"dialog\",\"params\":[{\"id\":\"22qv\",\"x\":0,\"y\":0,\"type\":\"func_zlc2\",\"params\":[{\"id\":\"89jb\",\"x\":0,\"y\":0,\"type\":\"text\",\"params\":[10],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]},\"speak\",null],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}]]",
7+
"objectType": "sprite",
8+
"rotateMethod": "free",
9+
"scene": "7dwq",
10+
"sprite": {
11+
"pictures": [
12+
{
13+
"id": "nrzz",
14+
"dimension": {
15+
"width": 960,
16+
"height": 540,
17+
"scaleX": 0.5,
18+
"scaleY": 0.5
19+
},
20+
"fileurl": "/lib/entry-js/images/_1x1.png",
21+
"name": "새그림",
22+
"imageType": "png"
23+
}
24+
],
25+
"sounds": []
26+
},
27+
"selectedPictureId": "nrzz",
28+
"lock": false,
29+
"entity": {
30+
"x": 0,
31+
"y": 0,
32+
"regX": 480,
33+
"regY": 270,
34+
"scaleX": 0.5,
35+
"scaleY": 0.5,
36+
"rotation": 0,
37+
"direction": 90,
38+
"width": 960,
39+
"height": 540,
40+
"font": "undefinedpx ",
41+
"visible": true
42+
}
43+
}
44+
],
45+
"scenes": [{ "id": "7dwq", "name": "장면 1" }],
46+
"variables": [
47+
{
48+
"name": "초시계",
49+
"id": "brih",
50+
"visible": false,
51+
"value": 0,
52+
"variableType": "timer",
53+
"isCloud": false,
54+
"isRealTime": false,
55+
"cloudDate": false,
56+
"object": null,
57+
"x": 134,
58+
"y": -70
59+
},
60+
{
61+
"name": " 대답 ",
62+
"id": "1vu8",
63+
"visible": false,
64+
"value": "0",
65+
"variableType": "answer",
66+
"isCloud": false,
67+
"isRealTime": false,
68+
"cloudDate": false,
69+
"object": null,
70+
"x": 150,
71+
"y": -100
72+
}
73+
],
74+
"messages": [],
75+
"functions": [
76+
{
77+
"id": "zlc2",
78+
"type": "value",
79+
"localVariables": [{ "name": "지역변수", "value": 0, "id": "zlc2_wmnl" }],
80+
"useLocalVariables": true,
81+
"content": "[[{\"id\":\"2yt2\",\"x\":50,\"y\":30,\"type\":\"function_create_value\",\"params\":[{\"id\":\"45lo\",\"x\":0,\"y\":0,\"type\":\"function_field_label\",\"params\":[\"fib\",{\"id\":\"2wjt\",\"x\":0,\"y\":0,\"type\":\"function_field_string\",\"params\":[{\"id\":\"ec1c\",\"x\":0,\"y\":0,\"type\":\"stringParam_08l7\",\"params\":[null],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]},null],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":false,\"assemble\":false,\"extensions\":[]}],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":false,\"assemble\":true,\"extensions\":[]},null,null,{\"id\":\"alsf\",\"x\":0,\"y\":0,\"type\":\"get_func_variable\",\"params\":[\"zlc2_wmnl\",null],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}],\"statements\":[[{\"id\":\"0bj0\",\"x\":0,\"y\":0,\"type\":\"if_else\",\"params\":[{\"id\":\"68n0\",\"x\":0,\"y\":0,\"type\":\"boolean_basic_operator\",\"params\":[{\"id\":\"mgwf\",\"x\":0,\"y\":0,\"type\":\"stringParam_08l7\",\"params\":[],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]},\"LESS_OR_EQUAL\",{\"id\":\"tldf\",\"x\":0,\"y\":0,\"type\":\"text\",\"params\":[\"2\"],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]},null,null],\"statements\":[[{\"id\":\"u8q3\",\"x\":0,\"y\":0,\"type\":\"set_func_variable\",\"params\":[\"zlc2_wmnl\",{\"id\":\"eq9l\",\"x\":0,\"y\":0,\"type\":\"text\",\"params\":[\"1\"],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]},null],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}],[{\"id\":\"wg6u\",\"x\":0,\"y\":0,\"type\":\"set_func_variable\",\"params\":[\"zlc2_wmnl\",{\"id\":\"fkgl\",\"x\":0,\"y\":0,\"type\":\"calc_basic\",\"params\":[{\"id\":\"n61a\",\"x\":0,\"y\":0,\"type\":\"func_zlc2\",\"params\":[{\"id\":\"rdka\",\"x\":0,\"y\":0,\"type\":\"calc_basic\",\"params\":[{\"id\":\"emxy\",\"x\":0,\"y\":0,\"type\":\"stringParam_08l7\",\"params\":[null],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]},\"MINUS\",{\"id\":\"2flu\",\"x\":0,\"y\":0,\"type\":\"number\",\"params\":[\"1\"],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]},\"PLUS\",{\"id\":\"czxx\",\"x\":0,\"y\":0,\"type\":\"func_zlc2\",\"params\":[{\"id\":\"geww\",\"x\":0,\"y\":0,\"type\":\"calc_basic\",\"params\":[{\"id\":\"8uqz\",\"x\":0,\"y\":0,\"type\":\"stringParam_08l7\",\"params\":[null],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]},\"MINUS\",{\"id\":\"d59y\",\"x\":0,\"y\":0,\"type\":\"number\",\"params\":[\"2\"],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]},null],\"statements\":[],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}]],\"movable\":null,\"deletable\":1,\"emphasized\":false,\"readOnly\":null,\"copyable\":true,\"assemble\":true,\"extensions\":[]}]],\"movable\":null,\"deletable\":false,\"emphasized\":false,\"readOnly\":null,\"copyable\":false,\"assemble\":true,\"extensions\":[]}]]"
82+
}
83+
],
84+
"tables": [],
85+
"speed": 60,
86+
"interface": { "menuWidth": 280, "canvasWidth": 480, "object": "ctqk" },
87+
"expansionBlocks": [],
88+
"aiUtilizeBlocks": [],
89+
"hardwareLiteBlocks": [],
90+
"externalModules": [],
91+
"externalModulesLite": []
92+
}

test/proj.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ const projTest = (name: string) =>
2222
})
2323

2424
projTest("proj1")
25-
projTest("proj2")
25+
projTest("proj2")
26+
projTest("fib")

0 commit comments

Comments
 (0)