diff --git a/blocks/procedures.js b/blocks/procedures.js index ba252e162..7a0abf716 100644 --- a/blocks/procedures.js +++ b/blocks/procedures.js @@ -164,26 +164,44 @@ Blockly.Blocks['procedures_defnoreturn'] = { * @this Blockly.Block */ decompose: function(workspace) { - var xml = Blockly.Xml.textToDom( - '' + - ' ' + - ''); - var node = xml.getElementsByTagName('statement')[0]; + /* + * Creates the following XML: + * + * + * + * arg1_name + * etc... + * + * + * + */ + + var containerBlockNode = Blockly.utils.xml.createElement('block'); + containerBlockNode.setAttribute('type', 'procedures_mutatorcontainer'); + var statementNode = Blockly.utils.xml.createElement('statement'); + statementNode.setAttribute('name', 'STACK'); + containerBlockNode.appendChild(statementNode); + + var node = statementNode; for (var i = 0; i < this.arguments_.length; i++) { - node.appendChild(Blockly.Xml.textToDom( - '' + - ' ' + this.arguments_[i] + '' + - ' ' + - '' - )); - node = node.getElementsByTagName('next')[0]; + var argBlockNode = Blockly.utils.xml.createElement('block'); + argBlockNode.setAttribute('type', 'procedures_mutatorarg'); + var fieldNode = Blockly.utils.xml.createElement('field'); + fieldNode.setAttribute('name', 'NAME'); + var argumentName = Blockly.utils.xml.createTextNode(this.arguments_[i]); + fieldNode.appendChild(argumentName); + argBlockNode.appendChild(fieldNode); + var nextNode = Blockly.utils.xml.createElement('next'); + argBlockNode.appendChild(nextNode); + + node.appendChild(argBlockNode); + node = nextNode; } - var containerBlock = Blockly.Xml.domToBlock(xml, workspace); + var containerBlock = Blockly.Xml.domToBlock(containerBlockNode, workspace); if (this.type == 'procedures_defreturn') { - containerBlock.setFieldValue( - this.hasStatements_ ? 'TRUE' : 'FALSE', 'STATEMENTS'); + containerBlock.setFieldValue(this.hasStatements_, 'STATEMENTS'); } else { containerBlock.removeInput('STATEMENT_INPUT'); }