Skip to content

Commit 490ab46

Browse files
committed
Try to fix step over and step out. Add yarn script for moving debuggers out
1 parent b6da41e commit 490ab46

4 files changed

Lines changed: 100 additions & 40 deletions

File tree

build/yarn-scripts.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ const fs = require('fs')
2222
const { glob } = require('glob')
2323
const concurrently = require('concurrently')
2424
const child_process = require('child_process')
25+
const jsoncParse = require('jsonc-parser').parse
26+
27+
const packageData = jsoncParse(
28+
fs.readFileSync(path.resolve('package.json'), 'utf8')
29+
)
30+
const pkg_version = packageData['version']
2531

2632
function rmFileOrDirectory(path) {
2733
if (fs.existsSync(path)) fs.rmSync(path, { recursive: true })
@@ -102,6 +108,37 @@ function package() {
102108
)
103109
}
104110

111+
function getScalaVersions() {
112+
const scalaVersions = ['2.12', '2.13']
113+
114+
// The scala 3 version of the debugger should only exist if JDK >= 17 is being used
115+
if (fs.existsSync(`debugger/target/jvm-3/universal/stage`)) {
116+
scalaVersions.push('3')
117+
}
118+
119+
return scalaVersions
120+
}
121+
122+
function moveDebuggers() {
123+
getScalaVersions().forEach(async (scalaVersion) => {
124+
const serverPackage = `daffodil-debugger-${scalaVersion}-${pkg_version}`
125+
const jvmFolderName = `jvm-${scalaVersion}`
126+
const stageFilePath = path.resolve(
127+
`debugger/target/${jvmFolderName}/universal/stage`
128+
)
129+
130+
const serverPackageFolder = path.join('dist/debuggers', serverPackage)
131+
132+
// remove debugger package folder if exists
133+
if (fs.existsSync(serverPackageFolder)) {
134+
fs.rmSync(serverPackageFolder, { recursive: true, force: true })
135+
}
136+
137+
// Copy staged debugger files to desired location
138+
fs.cpSync(stageFilePath, serverPackageFolder, { recursive: true })
139+
})
140+
}
141+
105142
/* START SECTION: Update version */
106143
// helper function to get the version passed in
107144
function parseArgs() {
@@ -259,4 +296,5 @@ module.exports = {
259296
package: package,
260297
checkMissingLicenseData: checkMissingLicenseData,
261298
checkLicenseCompatibility: checkLicenseCompatibility,
299+
moveDebuggers: moveDebuggers,
262300
}

debugger/src/main/scala/org.apache.daffodil.debugger.dap/Parse.scala

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,40 +1310,41 @@ object Parse {
13101310
.complete(()) *> nextContinue.get.as(true)
13111311
case Running => Running -> IO.pure(false)
13121312
case s @ Stopped(whenContinued, nextAwaitStarted) =>
1313-
s -> nextAwaitStarted.complete(()) *>
1314-
// Decide whether to block or let parser continue
1315-
stopTarget.get.flatMap {
1316-
case None => whenContinued.get.as(true)
1317-
case Some((targetDepth, mode)) =>
1318-
for {
1319-
cur <- currentDepth.get
1320-
kind <- awaitingKind.get
1321-
res <- mode match {
1322-
// Allow running while deeper than target.
1323-
// When at or above target and we're at an end-element, block once then clear target
1324-
case "stepOut" =>
1325-
if (cur > targetDepth) IO.pure(false)
1326-
else if (kind == "end") whenContinued.get.flatMap(_ => stopTarget.set(None).as(true))
1327-
else IO.pure(false)
1328-
1329-
// Allow running until we reach a deeper depth, then pause at the start-element and clear target
1330-
case "stepOver" =>
1331-
if (cur < targetDepth) IO.pure(false)
1332-
else if (kind == "start") whenContinued.get.flatMap(_ => stopTarget.set(None).as(true))
1333-
else IO.pure(false)
1334-
1335-
// Block once and clear the stopTarget so subsequent awaits don't re-trigger
1336-
case _ => whenContinued.get.flatMap(_ => stopTarget.set(None).as(true))
1337-
}
1338-
} yield res
1339-
}
1313+
s -> stopTarget.get.flatMap {
1314+
case None =>
1315+
// No step target, pause immediately and signal that we've stopped
1316+
nextAwaitStarted.complete(()).void *> whenContinued.get.as(true)
1317+
case Some((targetDepth, mode)) =>
1318+
for {
1319+
cur <- currentDepth.get
1320+
kind <- awaitingKind.get
1321+
res <- mode match {
1322+
// stepIn: Stop at the very next 'start' event, completely ignoring 'end' events
1323+
case "stepIn" =>
1324+
if (kind == "start")
1325+
stopTarget.set(None) *> nextAwaitStarted.complete(()).void *> whenContinued.get.as(true)
1326+
else IO.pure(false)
1327+
1328+
// stepOver / stepOut: Run invisibly until we hit a 'start' event at the target depth or shallower
1329+
case "stepOver" | "stepOut" =>
1330+
if (kind == "start" && cur <= targetDepth)
1331+
stopTarget.set(None) *> nextAwaitStarted.complete(()).void *> whenContinued.get.as(true)
1332+
else
1333+
IO.pure(false) // Ignore ALL 'end' events and any 'start' events deeper than our target
1334+
1335+
// Block once and clear the stopTarget so subsequent awaits don't re-trigger
1336+
case _ =>
1337+
stopTarget.set(None) *> nextAwaitStarted.complete(()).void *> whenContinued.get.as(true)
1338+
}
1339+
} yield res
1340+
}
13401341
}.flatten
13411342
} yield awaited
13421343

13431344
def performStep(stepType: String, addedDepth: Int): IO[Unit] =
13441345
for {
13451346
nextContinue <- Deferred[IO, Unit]
1346-
nextAwaitStarted <- Deferred[IO, Unit]
1347+
newAwaitStarted <- Deferred[IO, Unit]
13471348
_ <- state.modify {
13481349
case s @ AwaitingFirstAwait(waiterArrived) =>
13491350
s -> waiterArrived.get *> (stepType match {
@@ -1353,12 +1354,12 @@ object Parse {
13531354
})
13541355
case Running => Running -> IO.unit
13551356
case Stopped(whenContinued, _) =>
1356-
Stopped(nextContinue, nextAwaitStarted) -> (
1357+
Stopped(nextContinue, newAwaitStarted) -> (
13571358
for {
13581359
d <- currentDepth.get
13591360
_ <- stopTarget.set(Some((d + addedDepth, stepType)))
1360-
_ <- whenContinued.complete(())
1361-
_ <- nextAwaitStarted.get
1361+
_ <- whenContinued.complete(()) // Unblock the parser to continue running invisibly
1362+
_ <- newAwaitStarted.get // WAIT here until the parser hits the target 'start' event and stops
13621363
} yield ()
13631364
)
13641365
}.flatten
@@ -1376,20 +1377,23 @@ object Parse {
13761377
state.modify {
13771378
case s @ AwaitingFirstAwait(waiterArrived) =>
13781379
s -> waiterArrived.get *> continue()
1379-
case Running => Running -> IO.unit
1380-
case Stopped(whenContinued, _) =>
1381-
Running -> (stopTarget.set(None) *> whenContinued.complete(())).void // wake up await-ers
1380+
case Running => Running -> IO.unit
1381+
case Stopped(whenContinued, nextAwaitStarted) =>
1382+
Running -> (stopTarget.set(None) *> nextAwaitStarted.complete(()).void *> whenContinued.complete(())).void
13821383
}.flatten
13831384

13841385
def pause(): IO[Unit] =
13851386
for {
13861387
nextContinue <- Deferred[IO, Unit]
1387-
nextAwaitStarted <- Deferred[IO, Unit]
1388-
_ <- state.update {
1389-
case Running => Stopped(nextContinue, nextAwaitStarted)
1390-
case s: AwaitingFirstAwait => s
1391-
case s: Stopped => s
1392-
}
1388+
newAwaitStarted <- Deferred[IO, Unit]
1389+
_ <- state.modify {
1390+
case Running =>
1391+
Stopped(nextContinue, newAwaitStarted) -> IO.unit
1392+
case s: AwaitingFirstAwait => s -> IO.unit
1393+
case s @ Stopped(_, nextAwaitStarted) =>
1394+
// If we are hit by a breakpoint during a step, clear target and unblock performStep
1395+
s -> (stopTarget.set(None) *> nextAwaitStarted.complete(()).void)
1396+
}.flatten
13931397
} yield ()
13941398
}
13951399
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
"test": "sbt test && yarn test:svelte && node ./out/tests/runTest.js",
4747
"test:svelte": "mocha --import=tsx ./src/svelte/tests/**/*.test.ts",
4848
"sbt": "sbt Universal/stage",
49+
"move-debuggers": "run-func build/yarn-scripts.ts moveDebuggers",
4950
"svelte:check": "svelte-check --tsconfig ./src/svelte/tsconfig.json",
5051
"svelte:build": "cd src/svelte && vite build --config ./vite.config.mjs --mode production --emptyOutDir",
5152
"update-version": "run-func build/yarn-scripts.ts updateVersion",

src/infoset.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,23 @@ export async function activate(ctx: vscode.ExtensionContext) {
8282
}
8383
sid = undefined
8484
await openInfosetFilePrompt()
85+
86+
const tabs: vscode.Tab[] = vscode.window.tabGroups.all
87+
.map((tg) => tg.tabs)
88+
.flat()
89+
90+
// Find the tab that matches the file Uri
91+
const foundTab = tabs.find(
92+
(tab) =>
93+
tab.input instanceof vscode.TabInputText &&
94+
tab.input.uri.path === doc?.fileName
95+
)
96+
97+
// If the tab is found, close it
98+
if (foundTab) {
99+
// The close method can take a single tab or an array of tabs
100+
await vscode.window.tabGroups.close(foundTab)
101+
}
85102
})
86103
)
87104

0 commit comments

Comments
 (0)