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
}
}