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

shanedell 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 9c3cfd2  Mimic step over code for step in and step out
9c3cfd2 is described below

commit 9c3cfd2a436bee68107951ac4e1c88adc2d8c3e2
Author: Shane Dell <[email protected]>
AuthorDate: Mon Oct 27 11:40:25 2025 -0400

    Mimic step over code for step in and step out
    
    - Renamed step to stepOver.
    - Step in and step out now perform the same behavior as step over.
    - In the future, step over and step out will need to be updated to perform 
their proper behavior.
      - Step in's current behavior is correct so it does not need changed in 
the future.
    - Create performStep function that will be used in the future for 
implementing step over and step out's desired behavior.
    - These changed are to prevent the debugger from erroring out when clicking 
the step in or step out buttons.
    
    Closes #1466
---
 .../org.apache.daffodil.debugger.dap/DAPodil.scala | 39 ++++++++++++++++--
 .../org.apache.daffodil.debugger.dap/Parse.scala   | 48 ++++++++++++++++++----
 2 files changed, 74 insertions(+), 13 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 d2458ac..da4a572 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
@@ -193,6 +193,10 @@ class DAPodil(
         disconnect(request, args)
       case extract(Command.EVALUATE, args: EvaluateArguments) =>
         eval(request, args)
+      case extract(Command.STEPIN, _) =>
+        stepIn(request)
+      case extract(Command.STEPOUT, _) =>
+        stepOut(request)
       case _ =>
         session.abort(ErrorEvent.UnhandledRequest(show"unhandled request 
$request"), show"unhandled request $request")
     }
@@ -328,7 +332,7 @@ class DAPodil(
     state.get.flatMap {
       case DAPodil.State.Launched(debugee) =>
         for {
-          _ <- debugee.step()
+          _ <- debugee.stepOver()
           _ <- session.sendResponse(request.respondSuccess())
         } yield ()
       case s => DAPodil.InvalidState.raise(request, "Launched", s)
@@ -426,6 +430,26 @@ class DAPodil(
         } yield ()
       case s => DAPodil.InvalidState.raise(request, "Launched", s)
     }
+
+  def stepIn(request: Request): IO[Unit] =
+    state.get.flatMap {
+      case DAPodil.State.Launched(debugee) =>
+        for {
+          _ <- debugee.stepIn()
+          _ <- session.sendResponse(request.respondSuccess())
+        } yield ()
+      case s => DAPodil.InvalidState.raise(request, "Launched", s)
+    }
+
+  def stepOut(request: Request): IO[Unit] =
+    state.get.flatMap {
+      case DAPodil.State.Launched(debugee) =>
+        for {
+          _ <- debugee.stepOut()
+          _ <- session.sendResponse(request.respondSuccess())
+        } yield ()
+      case s => DAPodil.InvalidState.raise(request, "Launched", s)
+    }
 }
 
 object DAPodil extends IOApp {
@@ -559,7 +583,10 @@ object DAPodil extends IOApp {
         .compile
         .lastOrError
 
-    def step(): IO[Unit]
+    def stepOver(): IO[Unit]
+    def stepIn(): IO[Unit]
+    def stepOut(): IO[Unit]
+
     def continue(): IO[Unit]
     def pause(): IO[Unit]
     def setBreakpoints(uri: URI, lines: List[DAPodil.Line]): IO[Unit]
@@ -576,7 +603,9 @@ object DAPodil extends IOApp {
       object Stopped {
         def entry: Stopped = Stopped(Reason.Entry)
         def pause: Stopped = Stopped(Reason.Pause)
-        def step: Stopped = Stopped(Reason.Step)
+        def stepOver: Stopped = Stopped(Reason.StepOver)
+        def stepIn: Stopped = Stopped(Reason.StepIn)
+        def stepOut: Stopped = Stopped(Reason.StepOut)
         def breakpointHit(location: DAPodil.Location): Stopped = 
Stopped(Reason.BreakpointHit(location))
 
         sealed trait Reason
@@ -592,7 +621,9 @@ object DAPodil extends IOApp {
           case object Pause extends Reason
 
           /** The user requested a step, which completed, so now we are 
stopped again. */
-          case object Step extends Reason
+          case object StepOver extends Reason
+          case object StepIn extends Reason
+          case object StepOut extends Reason
 
           /** A breakpoint was hit. */
           case class BreakpointHit(location: DAPodil.Location) extends Reason
diff --git 
a/debugger/src/main/scala/org.apache.daffodil.debugger.dap/Parse.scala 
b/debugger/src/main/scala/org.apache.daffodil.debugger.dap/Parse.scala
index 810dc7a..442a79b 100644
--- a/debugger/src/main/scala/org.apache.daffodil.debugger.dap/Parse.scala
+++ b/debugger/src/main/scala/org.apache.daffodil.debugger.dap/Parse.scala
@@ -180,11 +180,27 @@ object Parse {
     def sourceChanges(): Stream[IO, DAPodil.Source] =
       Stream.empty
 
-    def step(): IO[Unit] =
-      control.step() *> parseEvents
+    def stepOver(): IO[Unit] =
+      control.stepOver() *> parseEvents
         .send(
           Parse.Event
-            .Control(DAPodil.Debugee.State.Stopped.step)
+            .Control(DAPodil.Debugee.State.Stopped.stepOver)
+        )
+        .void
+
+    def stepIn(): IO[Unit] =
+      control.stepIn() *> parseEvents
+        .send(
+          Parse.Event
+            .Control(DAPodil.Debugee.State.Stopped.stepIn)
+        )
+        .void
+
+    def stepOut(): IO[Unit] =
+      control.stepOut() *> parseEvents
+        .send(
+          Parse.Event
+            .Control(DAPodil.Debugee.State.Stopped.stepOut)
         )
         .void
 
@@ -736,7 +752,7 @@ object Parse {
 
       startup = dapEvents.send(ConfigEvent(args)) *>
         (if (args.stopOnEntry)
-           control.step() *>
+           control.stepIn() *>
              
events.send(Parse.Event.Control(DAPodil.Debugee.State.Stopped.entry))
          // don't use debugee.step as we need to send Stopped.entry, not 
Stopped.step
          else debugee.continue())
@@ -806,8 +822,12 @@ object Parse {
                     new Events.StoppedEvent("entry", 1L)
                   case DAPodil.Debugee.State.Stopped.Reason.Pause =>
                     new Events.StoppedEvent("pause", 1L)
-                  case DAPodil.Debugee.State.Stopped.Reason.Step =>
-                    new Events.StoppedEvent("step", 1L)
+                  case DAPodil.Debugee.State.Stopped.Reason.StepOver =>
+                    new Events.StoppedEvent("stepOver", 1L)
+                  case DAPodil.Debugee.State.Stopped.Reason.StepIn =>
+                    new Events.StoppedEvent("stepIn", 1L)
+                  case DAPodil.Debugee.State.Stopped.Reason.StepOut =>
+                    new Events.StoppedEvent("stepOut", 1L)
                   case 
DAPodil.Debugee.State.Stopped.Reason.BreakpointHit(location) =>
                     new Events.StoppedEvent("breakpoint", 1L, false, 
show"Breakpoint hit at $location", null)
                 },
@@ -1239,7 +1259,9 @@ object Parse {
       * IMPORTANT: Shouldn't return until any work blocked by an `await` 
completes, otherwise the update that was
       * waiting will race with the code that sees the `step` complete.
       */
-    def step(): IO[Unit]
+    def stepOver(): IO[Unit]
+    def stepIn(): IO[Unit]
+    def stepOut(): IO[Unit]
 
     /** Stop running. */
     def pause(): IO[Unit]
@@ -1274,13 +1296,17 @@ object Parse {
             }.flatten
           } yield awaited
 
-        def step(): IO[Unit] =
+        def performStep(stepType: String): IO[Unit] =
           for {
             nextContinue <- Deferred[IO, Unit]
             nextAwaitStarted <- Deferred[IO, Unit]
             _ <- state.modify {
               case s @ AwaitingFirstAwait(waiterArrived) =>
-                s -> waiterArrived.get *> step()
+                s -> waiterArrived.get *> (stepType match {
+                  case "stepOver" => stepOver()
+                  case "stepIn"   => stepIn()
+                  case "stepOut"  => stepOut()
+                })
               case Running => Running -> IO.unit
               case Stopped(whenContinued, _) =>
                 Stopped(nextContinue, nextAwaitStarted) -> (
@@ -1290,6 +1316,10 @@ object Parse {
             }.flatten
           } yield ()
 
+        def stepOver(): IO[Unit] = performStep("stepOver")
+        def stepIn(): IO[Unit] = performStep("stepIn")
+        def stepOut(): IO[Unit] = performStep("stepOut")
+
         def continue(): IO[Unit] =
           state.modify {
             case s @ AwaitingFirstAwait(waiterArrived) =>

Reply via email to