From 12602ca2b8e962af4201ffac9ff61a86e7f090f0 Mon Sep 17 00:00:00 2001
From: mark-friedman <mark-friedman@users.noreply.github.com>
Date: Fri, 10 Sep 2021 15:43:03 -0700
Subject: [PATCH] Get procedure renaming to work correctly dynamically

  i.e., while typing in the name field.
---
 block-lexical-variables/src/field_procedure.js     | 6 +++++-
 block-lexical-variables/src/field_procedurename.js | 2 ++
 block-lexical-variables/src/procedures.js          | 5 +++++
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/block-lexical-variables/src/field_procedure.js b/block-lexical-variables/src/field_procedure.js
index 95e96aa..d55034f 100644
--- a/block-lexical-variables/src/field_procedure.js
+++ b/block-lexical-variables/src/field_procedure.js
@@ -142,7 +142,8 @@ Blockly.AIProcedure.removeProcedureValues = function(name, workspace) {
  */
 Blockly.AIProcedure.renameProcedure = function (newName) {
   // this is bound to field_textinput object
-  var oldName = this.oldName_ || this.text_;
+  var oldName = this.oldName_ || this.getValue();
+  const originalNewName = newName;
 
   // [lyn, 10/27/13] now check legality of identifiers
   newName = Blockly.LexicalVariable.makeLegalIdentifier(newName);
@@ -151,6 +152,9 @@ Blockly.AIProcedure.renameProcedure = function (newName) {
   var procBlocks = Blockly.AIProcedure.getAllProcedureDeclarationBlocksExcept(this.sourceBlock_);
   var procNames = procBlocks.map(function (decl) { return decl.getFieldValue('NAME'); });
   newName = Blockly.FieldLexicalVariable.nameNotIn(newName, procNames);
+  if (newName !== originalNewName) {
+    this.doValueUpdate_(newName);
+  }
   // Rename any callers.
   var blocks = this.sourceBlock_.workspace.getAllBlocks();
   for (var x = 0; x < blocks.length; x++) {
diff --git a/block-lexical-variables/src/field_procedurename.js b/block-lexical-variables/src/field_procedurename.js
index 1d61077..b4fb404 100644
--- a/block-lexical-variables/src/field_procedurename.js
+++ b/block-lexical-variables/src/field_procedurename.js
@@ -51,6 +51,8 @@ goog.inherits(AI.Blockly.FieldProcedureName, Blockly.FieldTextInput);
  */
 AI.Blockly.FieldProcedureName.prototype.setValue = function(newValue) {
   var oldValue = this.getValue();
+  this.oldName_ = oldValue;
+  this.doValueUpdate_(newValue);
   AI.Blockly.FieldProcedureName.superClass_.setValue.call(this, newValue);
   newValue = this.getValue();
   if (typeof newValue === 'string' && this.sourceBlock_) {
diff --git a/block-lexical-variables/src/procedures.js b/block-lexical-variables/src/procedures.js
index ace85f5..f46bea0 100644
--- a/block-lexical-variables/src/procedures.js
+++ b/block-lexical-variables/src/procedures.js
@@ -714,6 +714,11 @@ Blockly.Blocks['procedures_callnoreturn'] = {
   renameProcedure: function(oldName, newName) {
     if (!oldName ||
         Blockly.Names.equals(oldName, this.getFieldValue('PROCNAME'))) {
+      const nameField = this.getField('PROCNAME');
+      // Force the options menu to get regenerated since we might be getting
+      // called because our defining procedure got renamed and
+      // this.setFieldValue() will fail if it's value isn't in the options set
+      nameField.getOptions();
       this.setFieldValue(newName, 'PROCNAME');
     }
   },