patch 8.2.0650: Vim9: script function can be deleted

Problem:    Vim9: script function can be deleted.
Solution:   Disallow deleting script function.  Delete functions when sourcing
            a script again.
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 218ef77..0ab170e 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -53,7 +53,7 @@
   endif
   let Funky1: func
   let Funky2: func = function('len')
-  let Party2: func = funcref('Test_syntax')
+  let Party2: func = funcref('g:Test_syntax')
 
   # type becomes list<any>
   let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
@@ -282,6 +282,49 @@
   assert_equal('', $ENVVAR)
 enddef
 
+def Test_delfunction()
+  " Check function is defined in script namespace
+  CheckScriptSuccess([
+      'vim9script',
+      'func CheckMe()',
+      '  return 123',
+      'endfunc',
+      'assert_equal(123, s:CheckMe())',
+      ])
+
+  " Check function in script namespace cannot be deleted
+  CheckScriptFailure([
+      'vim9script',
+      'func DeleteMe1()',
+      'endfunc',
+      'delfunction DeleteMe1',
+      ], 'E1084:')
+  CheckScriptFailure([
+      'vim9script',
+      'func DeleteMe2()',
+      'endfunc',
+      'def DoThat()',
+      '  delfunction DeleteMe2',
+      'enddef',
+      'DoThat()',
+      ], 'E1084:')
+  CheckScriptFailure([
+      'vim9script',
+      'def DeleteMe3()',
+      'enddef',
+      'delfunction DeleteMe3',
+      ], 'E1084:')
+  CheckScriptFailure([
+      'vim9script',
+      'def DeleteMe4()',
+      'enddef',
+      'def DoThat()',
+      '  delfunction DeleteMe4',
+      'enddef',
+      'DoThat()',
+      ], 'E1084:')
+enddef
+
 func Test_wrong_type()
   call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
   call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
@@ -649,7 +692,7 @@
   assert_fails('export something', 'E1043')
 enddef
 
-def Test_vim9script_reload()
+def Test_vim9script_reload_import()
   let lines =<< trim END
     vim9script
     const var = ''
@@ -700,6 +743,47 @@
   delete('Ximport.vim')
 enddef
 
+def Test_vim9script_reload_delfunc()
+  let first_lines =<< trim END
+    vim9script
+    def FuncYes(): string
+      return 'yes'
+    enddef
+  END
+  let middle_lines =<< trim END
+    def FuncNo(): string
+      return 'no'
+    enddef
+  END
+  let final_lines =<< trim END
+    def g:DoCheck(no_exists: bool)
+      assert_equal('yes', FuncYes())
+      if no_exists
+        assert_equal('no', FuncNo())
+      else
+        assert_fails('call FuncNo()', 'E117:')
+      endif
+    enddef
+  END
+
+  # FuncNo() is defined
+  writefile(first_lines + middle_lines + final_lines, 'Xreloaded.vim')
+  source Xreloaded.vim
+  g:DoCheck(true)
+
+  # FuncNo() is not redefined
+  writefile(first_lines + final_lines, 'Xreloaded.vim')
+  source Xreloaded.vim
+  g:DoCheck(false)
+
+  # FuncNo() is back
+  writefile(first_lines + middle_lines + final_lines, 'Xreloaded.vim')
+  source Xreloaded.vim
+  g:DoCheck(true)
+
+  delete('Xreloaded.vim')
+enddef
+
 def Test_import_absolute()
   let import_lines = [
         'vim9script',
@@ -1445,15 +1529,15 @@
 
   CheckScriptSuccess([
       'vim9script',
-      'func DeleteMe()',
+      'func g:DeleteMeA()',
       'endfunc',
-      'delfunction DeleteMe # comment',
+      'delfunction g:DeleteMeA # comment',
       ])
   CheckScriptFailure([
       'vim9script',
-      'func DeleteMe()',
+      'func g:DeleteMeB()',
       'endfunc',
-      'delfunction DeleteMe# comment',
+      'delfunction g:DeleteMeB# comment',
       ], 'E488:')
 
   CheckScriptSuccess([