jevstrudel.git / packages / hs2js / src / parser.mjs
1import Parser from 'web-tree-sitter';
2
3let base = '/';
4export function setBase(path) {
5  base = path;
6}
7
8let isReady = false,
9  parser;
10async function _loadParser() {
11  await Parser.init({
12    locateFile(scriptName, scriptDirectory) {
13      return `${base}${scriptName}`;
14    },
15  });
16  parser = new Parser();
17  const Lang = await Parser.Language.load(`${base}tree-sitter-haskell.wasm`);
18  parser.setLanguage(Lang);
19  isReady = true;
20  return parser;
21}
22
23let parserLoaded;
24export function loadParser() {
25  if (!parserLoaded) {
26    parserLoaded = _loadParser();
27  }
28  return parserLoaded;
29}
30
31export function parse(code) {
32  if (!isReady) {
33    throw new Error('hs2js not ready. await loadParser before calling evaluate or parse functions');
34  }
35  // for some reason, the parser doesn't like new lines..
36  return parser.parse(code.replaceAll('\n\n', '~~~~').replaceAll('\n', ' ').replaceAll('~~~~', ' \n'));
37}