This is an automated email from the ASF dual-hosted git repository.

arosien pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/daffodil-vscode.git


The following commit(s) were added to refs/heads/main by this push:
     new d861019  more helpful error messages
d861019 is described below

commit d86101987faeb9fd6790e8a0d9aa9baa732d1de4
Author: Adam Rosien <[email protected]>
AuthorDate: Tue Mar 12 09:33:17 2024 -0700

    more helpful error messages
---
 .../org.apache.daffodil.debugger.dap/DAPodil.scala | 26 ++++++++++++----------
 .../{ErrorEvents.scala => ErrorEvent.scala}        | 16 ++++++++-----
 src/adapter/activateDaffodilDebug.ts               |  8 ++++++-
 src/adapter/daffodilEvent.ts                       |  6 ++++-
 4 files changed, 36 insertions(+), 20 deletions(-)

diff --git 
a/debugger/src/main/scala/org.apache.daffodil.debugger.dap/DAPodil.scala 
b/debugger/src/main/scala/org.apache.daffodil.debugger.dap/DAPodil.scala
index a17f9d8..f39db41 100644
--- a/debugger/src/main/scala/org.apache.daffodil.debugger.dap/DAPodil.scala
+++ b/debugger/src/main/scala/org.apache.daffodil.debugger.dap/DAPodil.scala
@@ -49,9 +49,9 @@ trait DAPSession[Req, Res, Ev] {
 
   def sendResponse(response: Res): IO[Unit]
   def sendEvent(event: Ev): IO[Unit]
-  def abort(event: DebugEvent): IO[Unit]
-  def abort(event: DebugEvent, logMessage: String): IO[Unit]
-  def abort(event: DebugEvent, logMessage: String, t: Throwable): IO[Unit]
+  def abort(event: Ev): IO[Unit]
+  def abort(event: Ev, logMessage: String): IO[Unit]
+  def abort(event: Ev, logMessage: String, t: Throwable): IO[Unit]
 }
 
 object DAPSession {
@@ -73,10 +73,10 @@ object DAPSession {
 
       /** Log error then send DebugEvent back to extension and exit session, 
ending debug */
       def abort(event: DebugEvent, logMessage: String): IO[Unit] =
-        Logger[IO].error(logMessage) *> sendEvent(event) *> sendEvent(new 
Events.TerminatedEvent())
+        Logger[IO].error(logMessage) *> abort(event)
 
       def abort(event: DebugEvent, logMessage: String, t: Throwable): IO[Unit] 
=
-        Logger[IO].error(t)(logMessage) *> sendEvent(event) *> sendEvent(new 
Events.TerminatedEvent())
+        Logger[IO].error(t)(logMessage) *> abort(event)
     }
 
   def resource(socket: Socket): Resource[IO, DAPSession[Request, Response, 
DebugEvent]] =
@@ -193,7 +193,8 @@ class DAPodil(
         disconnect(request, args)
       case extract(Command.EVALUATE, args: EvaluateArguments) =>
         eval(request, args)
-      case _ => session.abort(ErrorEvents.UnhandledRequest, show"unhandled 
request $request")
+      case _ =>
+        session.abort(ErrorEvent.UnhandledRequest(show"unhandled request 
$request"), show"unhandled request $request")
     }
 
   /** State.Uninitialized -> State.Initialized */
@@ -218,7 +219,7 @@ class DAPodil(
           case Left(errors) =>
             state.set(DAPodil.State.FailedToLaunch(request, errors, None)) *>
               session.abort(
-                ErrorEvents.LaunchArgsParseError,
+                ErrorEvent.LaunchArgsParseError(show"error parsing launch 
args: ${errors.mkString_("\n")}"),
                 show"error parsing launch args: ${errors.mkString_("\n")}"
               )
           case Right(dbgee) =>
@@ -233,7 +234,7 @@ class DAPodil(
                     DAPodil.State
                       .FailedToLaunch(request, NonEmptyList.of("couldn't 
launch from created debuggee"), Some(t))
                   ) *>
-                    session.abort(ErrorEvents.RequestError, show"couldn't 
launch, request $request", t)
+                    session.abort(ErrorEvent.RequestError(t.getMessage), 
show"couldn't launch, request $request", t)
                 case Right(launchedState) =>
                   state.set(launchedState) *>
                     session.sendResponse(request.respondSuccess())
@@ -253,7 +254,7 @@ class DAPodil(
             )
           )
         }
-      case _ => session.abort(ErrorEvents.SourceError)
+      case s => DAPodil.InvalidState.raise(request, "Launched", s)
     }
 
   def source(request: Request, args: SourceArguments): IO[Unit] =
@@ -263,11 +264,11 @@ class DAPodil(
           .sourceContent(DAPodil.Source.Ref(args.sourceReference))
           .flatMap {
             case None =>
-              session.abort(ErrorEvents.SourceError)
+              session.abort(ErrorEvent.SourceError(show"no source with 
reference ${args.sourceReference} found"))
             case Some(content) =>
               session.sendResponse(request.respondSuccess(new 
SourceResponseBody(content.value, "text/xml")))
           }
-      case _ => session.abort(ErrorEvents.SourceError)
+      case s => DAPodil.InvalidState.raise(request, "Launched", s)
     }
 
   def setBreakpoints(request: Request, args: SetBreakpointArguments): IO[Unit] 
=
@@ -413,7 +414,8 @@ class DAPodil(
         for {
           variable <- launched.debugee.eval(args)
           _ <- variable match {
-            case None => session.abort(ErrorEvents.UnexpectedError)
+            case None =>
+              session.abort(ErrorEvent.UnexpectedError(show"expression 
couldn't be evaluated: ${args.expression}"))
             case Some(v) =>
               session.sendResponse(request.respondSuccess(new 
Responses.EvaluateResponseBody(v.value, 0, null, 0)))
           }
diff --git 
a/debugger/src/main/scala/org.apache.daffodil.debugger.dap/ErrorEvents.scala 
b/debugger/src/main/scala/org.apache.daffodil.debugger.dap/ErrorEvent.scala
similarity index 62%
rename from 
debugger/src/main/scala/org.apache.daffodil.debugger.dap/ErrorEvents.scala
rename to 
debugger/src/main/scala/org.apache.daffodil.debugger.dap/ErrorEvent.scala
index c973f68..dc878aa 100644
--- a/debugger/src/main/scala/org.apache.daffodil.debugger.dap/ErrorEvents.scala
+++ b/debugger/src/main/scala/org.apache.daffodil.debugger.dap/ErrorEvent.scala
@@ -19,11 +19,15 @@ package org.apache.daffodil.debugger.dap
 
 import com.microsoft.java.debug.core.protocol.Events.DebugEvent
 
+sealed abstract class ErrorEvent(event: String) extends DebugEvent(event) {
+  def message: String
+}
+
 /** Case classes for errors that we want to relay back to the extension */
-object ErrorEvents {
-  case object UnexpectedError extends DebugEvent("daffodil.error.unexpected")
-  case object UnhandledRequest extends 
DebugEvent("daffodil.error.requestunhandled")
-  case object LaunchArgsParseError extends 
DebugEvent("daffodil.error.launchargparse")
-  case object RequestError extends DebugEvent("daffodil.error.request")
-  case object SourceError extends DebugEvent("daffodil.error.source")
+object ErrorEvent {
+  case class UnexpectedError(message: String) extends 
ErrorEvent("daffodil.error.unexpected")
+  case class UnhandledRequest(message: String) extends 
ErrorEvent("daffodil.error.requestunhandled")
+  case class LaunchArgsParseError(message: String) extends 
ErrorEvent("daffodil.error.launchargsparse")
+  case class RequestError(message: String) extends 
ErrorEvent("daffodil.error.request")
+  case class SourceError(message: String) extends 
ErrorEvent("daffodil.error.source")
 }
diff --git a/src/adapter/activateDaffodilDebug.ts 
b/src/adapter/activateDaffodilDebug.ts
index d5ac966..c205e90 100644
--- a/src/adapter/activateDaffodilDebug.ts
+++ b/src/adapter/activateDaffodilDebug.ts
@@ -33,6 +33,9 @@ import {
 } from '../tdmlEditor/utilities/tdmlXmlUtils'
 import xmlFormat from 'xml-formatter'
 
+export const outputChannel: vscode.OutputChannel =
+  vscode.window.createOutputChannel('Daffodil')
+
 /** Method to file path for schema and data
  * Details:
  *   Required so that the vscode api commands:
@@ -249,7 +252,10 @@ export function activateDaffodilDebug(
           'Select input data file to debug'
         )
       }
-    )
+    ),
+    vscode.commands.registerCommand('extension.dfdl-debug.showLogs', () => {
+      outputChannel.show(true)
+    })
   )
 
   context.subscriptions.push(
diff --git a/src/adapter/daffodilEvent.ts b/src/adapter/daffodilEvent.ts
index 5d3d743..bec20c9 100644
--- a/src/adapter/daffodilEvent.ts
+++ b/src/adapter/daffodilEvent.ts
@@ -20,6 +20,7 @@ import * as fs from 'fs'
 
 import * as daf from '../daffodilDebugger'
 import { ensureFile, tmpFile } from '../utils'
+import { outputChannel } from './activateDaffodilDebug'
 
 export function handleDebugEvent(e: vscode.DebugSessionCustomEvent) {
   switch (e.event) {
@@ -31,7 +32,10 @@ export function handleDebugEvent(e: 
vscode.DebugSessionCustomEvent) {
       break
     // this allows for any error event to be caught in this case
     case e.event.startsWith('daffodil.error') ? e.event : '':
-      vscode.window.showErrorMessage(`debugger ${e.event}`)
+      vscode.window.showErrorMessage(
+        `An error was received from the Daffodil debugger. ([show 
logs](command:extension.dfdl-debug.showLogs "show logs"))`
+      )
+      outputChannel.appendLine(e.body.message)
       break
   }
 }

Reply via email to