Skip to content

Commit

Permalink
Improve generation of diagrams and documentation in the final format
Browse files Browse the repository at this point in the history
Wait for the generation of `.dot` and `.xml` files to complete before calling the conversion scripts instead of relying on fixed pause.
  • Loading branch information
pmoura committed Dec 22, 2023
1 parent f5ee6cb commit a8d1b79
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 8 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## [0.6.1]

* Improve generation of diagrams and documentation in the final format

## [0.6.0]

* Change settings for configuring the script to be used to generate diagrams
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "logtalk-for-vscode",
"displayName": "Logtalk for VSCode",
"description": "Support for the Logtalk programming language",
"version": "0.6.0",
"version": "0.6.1",
"publisher": "LogtalkDotOrg",
"icon": "images/logtalk.png",
"license": "MIT",
Expand Down Expand Up @@ -331,7 +331,7 @@
"compile": "tsc -watch -p ./",
"test": "tsc ./tests/runTest.ts",
"vsix:make": "vsce package --baseImagesUrl https://raw.githubusercontent.com/llvm/llvm-project/master/clang-tools-extra/clangd/clients/clangd-vscode/",
"vsix:install": "code --install-extension logtalk-for-vscode-0.6.0.vsix"
"vsix:install": "code --install-extension logtalk-for-vscode-0.6.1.vsix"
},
"devDependencies": {
"@types/bluebird": "^3.5.38",
Expand Down
35 changes: 29 additions & 6 deletions src/features/logtalkTerminal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import * as cp from 'child_process';
import { spawn } from "process-promises";
import LogtalkLinter from "./logtalkLinter";
import { isFunction } from "util";
import * as fsp from "fs/promises";
import * as timers from "timers/promises";

export default class LogtalkTerminal {
private static _context: ExtensionContext;
Expand Down Expand Up @@ -320,10 +322,10 @@ export default class LogtalkTerminal {
const file = path.resolve(file0).split(path.sep).join("/");
const xmlDir0 = path.join(dir, "xml_docs");
const xmlDir = path.resolve(xmlDir0).split(path.sep).join("/");
let goals = `logtalk_load(lgtdoc(loader)),logtalk_load('${file}'),os::change_directory('${dir}'),lgtdoc::directory('${dir}').\r`;
let goals = `catch(ignore(os::delete_file('${dir}/.xml_files_done')),_,true),logtalk_load(lgtdoc(loader)),logtalk_load('${file}'),os::change_directory('${dir}'),lgtdoc::directory('${dir}'),os::ensure_file('${dir}/.xml_files_done').\r`;
LogtalkTerminal.sendString(goals);
const sleep = (waitTimeInMs) => new Promise (resolve => setTimeout (resolve, waitTimeInMs));
await sleep (3000);
const marker = path.join(dir0, ".xml_files_done");
await LogtalkTerminal.waitForFile(marker);
LogtalkTerminal.spawnScript4(
xmlDir0,
["documentation", "logtalk.documentation.script", LogtalkTerminal._docExec],
Expand All @@ -338,10 +340,10 @@ export default class LogtalkTerminal {
const dir = path.resolve(dir0).split(path.sep).join("/");
const file0: string = await LogtalkTerminal.ensureFile(uri);
const file = path.resolve(file0).split(path.sep).join("/");
let goals = `logtalk_load(diagrams(loader)),logtalk_load('${file}'),os::change_directory('${dir}'),diagrams::directory('${dir}').\r`;
let goals = `catch(ignore(os::delete_file('${dir}/.dot_files_done')),_,true),logtalk_load(diagrams(loader)),logtalk_load('${file}'),os::change_directory('${dir}'),diagrams::directory('${dir}'),os::ensure_file('${dir}/.dot_files_done').\r`;
LogtalkTerminal.sendString(goals);
const sleep = (waitTimeInMs) => new Promise (resolve => setTimeout (resolve, waitTimeInMs));
await sleep (3000);
const marker = path.join(dir0, ".dot_files_done");
await LogtalkTerminal.waitForFile(marker);
LogtalkTerminal.spawnScript4(
dir0,
["diagrams", "logtalk.diagrams.script", LogtalkTerminal._diaExec],
Expand Down Expand Up @@ -434,4 +436,25 @@ export default class LogtalkTerminal {
return dir;
}

private static waitForFile = async (
filePath,
{timeout = 30_000, delay = 200} = {}
) => {
const tid = setTimeout(() => {
const msg = `Timeout of ${timeout} ms exceeded waiting for ${filePath}`;
throw Error(msg);
}, timeout);

for (;;) {
try {
await fsp.stat(filePath);
clearTimeout(tid);
return;
}
catch (err) {}

await timers.setTimeout(delay);
}
};

}

0 comments on commit a8d1b79

Please sign in to comment.