[dartdev] switch the analysis server to use VMInteropHandler instead of
spawning an isolate (higher memory footprint)

Change-Id: I74bcb382c6269183beb4b8f2fcd04aee10eaa549
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/404921
Reviewed-by: Derek Xu <derekx@google.com>
Commit-Queue: Siva Annamalai <asiva@google.com>
diff --git a/pkg/dartdev/lib/src/commands/language_server.dart b/pkg/dartdev/lib/src/commands/language_server.dart
index 553732f..1e0ff3b 100644
--- a/pkg/dartdev/lib/src/commands/language_server.dart
+++ b/pkg/dartdev/lib/src/commands/language_server.dart
@@ -10,6 +10,7 @@
 import '../core.dart';
 import '../sdk.dart';
 import '../utils.dart';
+import '../vm_interop_handler.dart';
 
 class LanguageServerCommand extends DartdevCommand {
   static const String commandName = 'language-server';
@@ -45,16 +46,22 @@
     var args = argResults!.arguments;
     if (!args.any((arg) => arg.startsWith('--$protocol'))) {
       args = [...args, '--$protocol=$lsp'];
-    } else {
-      // Need to make a copy as argResults!.arguments is an
-      // UnmodifiableListView object which cannot be passed as
-      // the args for spawnUri.
-      args = [...args];
     }
-    return await runFromSnapshot(
-      snapshot: sdk.analysisServerSnapshot,
-      args: args,
-      verbose: verbose,
-    );
+    try {
+      VmInteropHandler.run(
+        sdk.analysisServerSnapshot,
+        args,
+        packageConfigOverride: null,
+        useExecProcess : false,
+      );
+      return 0;
+    } catch (e, st) {
+      log.stderr('Error: launching language analysis server failed');
+      log.stderr(e.toString());
+      if (verbose) {
+        log.stderr(st.toString());
+      }
+      return 255;
+    }
   }
 }