Skip to content

Commit 4338632

Browse files
committed
Move script generation to InstructionTree
Handling the script generation in the UI canvas code seems misplaced, and it depends on nothing in the UI except for the current canvas window. Move the generation to InstructionTree using an interface taking an array of Node. This will allow testing the code generation without using the block canvas.
1 parent edd1f65 commit 4338632

File tree

2 files changed

+65
-63
lines changed

2 files changed

+65
-63
lines changed

addons/block_code/instruction_tree/instruction_tree.gd

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,67 @@ static func generate_text_recursive(node: TreeNode, depth: int, out: PackedStrin
5757

5858
if node.next:
5959
generate_text_recursive(node.next, depth, out)
60+
61+
62+
static func generate_script_from_nodes(nodes: Array[Node], bsd: BlockScriptData) -> String:
63+
var entry_blocks_by_entry_statement: Dictionary = {}
64+
65+
for block in nodes:
66+
if !(block is Block):
67+
continue
68+
69+
if block is EntryBlock:
70+
var entry_statement = block.get_entry_statement()
71+
if not entry_blocks_by_entry_statement.has(entry_statement):
72+
entry_blocks_by_entry_statement[entry_statement] = []
73+
entry_blocks_by_entry_statement[entry_statement].append(block)
74+
75+
var script: String = ""
76+
77+
script += "extends %s\n\n" % bsd.script_inherits
78+
79+
for variable in bsd.variables:
80+
script += "var %s: %s\n\n" % [variable.var_name, type_string(variable.var_type)]
81+
82+
script += "\n"
83+
84+
var init_func = TreeNode.new("func _init():")
85+
86+
for entry_statement in entry_blocks_by_entry_statement:
87+
var entry_blocks: Array[EntryBlock]
88+
entry_blocks.assign(entry_blocks_by_entry_statement[entry_statement])
89+
script += _generate_script_from_entry_blocks(entry_statement, entry_blocks, init_func)
90+
91+
if init_func.children:
92+
script += generate_text(init_func)
93+
94+
return script
95+
96+
97+
static func _generate_script_from_entry_blocks(entry_statement: String, entry_blocks: Array[EntryBlock], init_func: TreeNode) -> String:
98+
var script = entry_statement + "\n"
99+
var signal_node: TreeNode
100+
var is_empty = true
101+
102+
InstructionTree.IDHandler.reset()
103+
104+
for entry_block in entry_blocks:
105+
var next_block := entry_block.bottom_snap.get_snapped_block()
106+
107+
if next_block != null:
108+
var instruction_node: TreeNode = next_block.get_instruction_node()
109+
var to_append := generate_text(instruction_node, 1)
110+
script += to_append
111+
script += "\n"
112+
is_empty = false
113+
114+
if signal_node == null and entry_block.signal_name:
115+
signal_node = TreeNode.new("{0}.connect(_on_{0})".format([entry_block.signal_name]))
116+
117+
if signal_node:
118+
init_func.add_child(signal_node)
119+
120+
if is_empty:
121+
script += "\tpass\n\n"
122+
123+
return script

addons/block_code/ui/block_canvas/node_block_canvas/node_block_canvas.gd

Lines changed: 1 addition & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,66 +5,4 @@ extends BlockCanvas
55

66
func generate_script_from_current_window(bsd: BlockScriptData):
77
# TODO: implement multiple windows
8-
var current_window := _window
9-
10-
var entry_blocks_by_entry_statement: Dictionary = {}
11-
12-
for block in current_window.get_children():
13-
if !(block is Block):
14-
continue
15-
16-
if block is EntryBlock:
17-
var entry_statement = block.get_entry_statement()
18-
if not entry_blocks_by_entry_statement.has(entry_statement):
19-
entry_blocks_by_entry_statement[entry_statement] = []
20-
entry_blocks_by_entry_statement[entry_statement].append(block)
21-
22-
var script: String = ""
23-
24-
script += "extends %s\n\n" % bsd.script_inherits
25-
26-
for variable in bsd.variables:
27-
script += "var %s: %s\n\n" % [variable.var_name, type_string(variable.var_type)]
28-
29-
script += "\n"
30-
31-
var init_func = InstructionTree.TreeNode.new("func _init():")
32-
33-
for entry_statement in entry_blocks_by_entry_statement:
34-
var entry_blocks: Array[EntryBlock]
35-
entry_blocks.assign(entry_blocks_by_entry_statement[entry_statement])
36-
script += _generate_script_from_entry_blocks(entry_statement, entry_blocks, init_func)
37-
38-
if init_func.children:
39-
script += InstructionTree.generate_text(init_func)
40-
41-
return script
42-
43-
44-
func _generate_script_from_entry_blocks(entry_statement: String, entry_blocks: Array[EntryBlock], init_func: InstructionTree.TreeNode) -> String:
45-
var script = entry_statement + "\n"
46-
var signal_node: InstructionTree.TreeNode
47-
var is_empty = true
48-
49-
InstructionTree.IDHandler.reset()
50-
51-
for entry_block in entry_blocks:
52-
var next_block := entry_block.bottom_snap.get_snapped_block()
53-
54-
if next_block != null:
55-
var instruction_node: InstructionTree.TreeNode = next_block.get_instruction_node()
56-
var to_append := InstructionTree.generate_text(instruction_node, 1)
57-
script += to_append
58-
script += "\n"
59-
is_empty = false
60-
61-
if signal_node == null and entry_block.signal_name:
62-
signal_node = InstructionTree.TreeNode.new("{0}.connect(_on_{0})".format([entry_block.signal_name]))
63-
64-
if signal_node:
65-
init_func.add_child(signal_node)
66-
67-
if is_empty:
68-
script += "\tpass\n\n"
69-
70-
return script
8+
return InstructionTree.generate_script_from_nodes(_window.get_children(), bsd)

0 commit comments

Comments
 (0)