patch 8.2.0818: Vim9: using a discovery phase doesn't work well

Problem:    Vim9: using a discovery phase doesn't work well.
Solution:   Remove the discovery phase, instead compile a function only when
            it is used.  Add :defcompile to compile def functions earlier.
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index cc31328..ea976c5 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -255,7 +255,7 @@
   call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
   call CheckDefFailure(['let xnr += 4'], 'E1020:')
 
-  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
+  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
 
   call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
   call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
@@ -296,6 +296,7 @@
         'def Func()',
         '  unlet svar',
         'enddef',
+        'defcompile',
         ], 'E1081:')
   call CheckScriptFailure([
         'vim9script',
@@ -303,6 +304,7 @@
         'def Func()',
         '  unlet s:svar',
         'enddef',
+        'defcompile',
         ], 'E1081:')
 
   $ENVVAR = 'foobar'
@@ -606,6 +608,7 @@
       let dummy = 1
       let imported = Export + dummy
     enddef
+    defcompile
   END
   writefile(import_star_as_lines_no_dot, 'Ximport.vim')
   assert_fails('source Ximport.vim', 'E1060:')
@@ -616,6 +619,7 @@
     def Func()
       let imported = Export . exported
     enddef
+    defcompile
   END
   writefile(import_star_as_lines_dot_space, 'Ximport.vim')
   assert_fails('source Ximport.vim', 'E1074:')
@@ -626,6 +630,7 @@
     def Func()
       let imported = Export.
     enddef
+    defcompile
   END
   writefile(import_star_as_lines_missing_name, 'Ximport.vim')
   assert_fails('source Ximport.vim', 'E1048:')
@@ -740,6 +745,9 @@
 enddef
 
 def Test_vim9script_reload_import()
+  " TODO: make it work to compile when not in the script context anymore
+  return
+
   let lines =<< trim END
     vim9script
     const var = ''
@@ -789,6 +797,9 @@
 enddef
 
 def Test_vim9script_reload_delfunc()
+  " TODO: make it work to compile when not in the script context anymore
+  return
+
   let first_lines =<< trim END
     vim9script
     def FuncYes(): string
@@ -1163,7 +1174,7 @@
   CheckDefFailure(['for # in range(5)'], 'E690:')
   CheckDefFailure(['for i In range(5)'], 'E690:')
   CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
-  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
+  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
   CheckDefFailure(['for i in "text"'], 'E1024:')
   CheckDefFailure(['for i in xxx'], 'E1001:')
   CheckDefFailure(['endfor'], 'E588:')
@@ -1699,11 +1710,6 @@
       'let v = 1# comment6',
       ], 'E15:')
 
-  CheckScriptFailure([
-      'vim9script',
-      'let v:version',
-      ], 'E1091:')
-
   CheckScriptSuccess([
       'vim9script',
       'new'
@@ -1772,76 +1778,26 @@
 def Test_let_missing_type()
   let lines =<< trim END
     vim9script
-    func GetValue()
-      return 'this'
-    endfunc
-    let val = GetValue()
-  END
-  CheckScriptFailure(lines, 'E1091:')
-
-  lines =<< trim END
-    vim9script
-    func GetValue()
-      return 'this'
-    endfunc
-    let val = [GetValue()]
-  END
-  CheckScriptFailure(lines, 'E1091:')
-
-  lines =<< trim END
-    vim9script
-    func GetValue()
-      return 'this'
-    endfunc
-    let val = {GetValue(): 123}
-  END
-  CheckScriptFailure(lines, 'E1091:')
-
-  lines =<< trim END
-    vim9script
-    func GetValue()
-      return 'this'
-    endfunc
-    let val = {'a': GetValue()}
-  END
-  CheckScriptFailure(lines, 'E1091:')
-
-  lines =<< trim END
-    vim9script
     let var = g:unknown
   END
-  CheckScriptFailure(lines, 'E1091:')
-
-  " TODO: eventually this would work
-  lines =<< trim END
-    vim9script
-    let var = has('eval')
-  END
-  CheckScriptFailure(lines, 'E1091:')
-
-  " TODO: eventually this would work
-  lines =<< trim END
-    vim9script
-    let var = len('string')
-  END
-  CheckScriptFailure(lines, 'E1091:')
+  CheckScriptFailure(lines, 'E121:')
 
   lines =<< trim END
     vim9script
     let nr: number = 123
     let var = nr
   END
-  CheckScriptFailure(lines, 'E1091:')
+  CheckScriptSuccess(lines)
 enddef
 
 def Test_forward_declaration()
   let lines =<< trim END
     vim9script
-    g:initVal = GetValue()
     def GetValue(): string
       return theVal
     enddef
     let theVal = 'something'
+    g:initVal = GetValue()
     theVal = 'else'
     g:laterVal = GetValue()
   END