From 12d727fd49a2fd353e8a061e9c2cb5c29a3e21bf Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Aug 2021 14:16:41 +0200 Subject: [PATCH] mix init options in the Module-global --- lib/binding_web/binding.js | 22 +++++----------------- lib/binding_web/prefix.js | 24 +++++++++++++++--------- lib/binding_web/suffix.js | 25 +++++++++++++++++++++++-- lib/binding_web/tree-sitter-web.d.ts | 6 +++++- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/lib/binding_web/binding.js b/lib/binding_web/binding.js index bf0a91ce..6296ed35 100644 --- a/lib/binding_web/binding.js +++ b/lib/binding_web/binding.js @@ -17,24 +17,15 @@ var MIN_COMPATIBLE_VERSION; var TRANSFER_BUFFER; var currentParseCallback; var currentLogCallback; -var initPromise = new Promise(resolve => { - Module.onRuntimeInitialized = resolve -}).then(() => { - TRANSFER_BUFFER = C._ts_init(); - VERSION = getValue(TRANSFER_BUFFER, 'i32'); - MIN_COMPATIBLE_VERSION = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); -}); -class Parser { +class ParserImpl { static init() { - return initPromise; + TRANSFER_BUFFER = C._ts_init(); + VERSION = getValue(TRANSFER_BUFFER, 'i32'); + MIN_COMPATIBLE_VERSION = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); } - constructor() { - if (TRANSFER_BUFFER == null) { - throw new Error('You must first call Parser.init() and wait for it to resolve.'); - } - + initialize() { C._ts_parser_new_wasm(); this[0] = getValue(TRANSFER_BUFFER, 'i32'); this[1] = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); @@ -1203,6 +1194,3 @@ function marshalEdit(edit) { setValue(address, edit.oldEndIndex, 'i32'); address += SIZE_OF_INT; setValue(address, edit.newEndIndex, 'i32'); address += SIZE_OF_INT; } - -Parser.Language = Language; -Parser.Parser = Parser; diff --git a/lib/binding_web/prefix.js b/lib/binding_web/prefix.js index 3653e99d..de01b78a 100644 --- a/lib/binding_web/prefix.js +++ b/lib/binding_web/prefix.js @@ -1,9 +1,15 @@ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - define([], factory); - } else if (typeof exports === 'object') { - module.exports = factory(); - } else { - window.TreeSitter = factory(); - } -}(this, function () { +var TreeSitter = function() { + var initPromise; + class Parser { + constructor() { + this.initialize(); + } + + initialize() { + throw new Error("cannot construct a Parser before calling `init()`"); + } + + static init(moduleOptions) { + if (initPromise) return initPromise; + Module = { ...Module, ...moduleOptions }; + return initPromise = new Promise((resolveInitPromise) => { diff --git a/lib/binding_web/suffix.js b/lib/binding_web/suffix.js index 0e9fe021..cd91f919 100644 --- a/lib/binding_web/suffix.js +++ b/lib/binding_web/suffix.js @@ -1,2 +1,23 @@ -return Parser; -})); + for (const name of Object.getOwnPropertyNames(ParserImpl.prototype)) { + Object.defineProperty(Parser.prototype, name, { + value: ParserImpl.prototype[name], + enumerable: false, + writable: false, + }) + } + + Parser.Language = Language; + Module.onRuntimeInitialized = () => { + ParserImpl.init(); + resolveInitPromise(); + }; + }); + } + } + + return Parser; +}(); + +if (typeof exports === 'object') { + module.exports = TreeSitter; +} \ No newline at end of file diff --git a/lib/binding_web/tree-sitter-web.d.ts b/lib/binding_web/tree-sitter-web.d.ts index 2127fa41..fd847c1c 100644 --- a/lib/binding_web/tree-sitter-web.d.ts +++ b/lib/binding_web/tree-sitter-web.d.ts @@ -1,6 +1,10 @@ declare module 'web-tree-sitter' { class Parser { - static init(): Promise; + /** + * + * @param moduleOptions Optional emscripten module-object, see https://emscripten.org/docs/api_reference/module.html + */ + static init(moduleOptions?: object): Promise; delete(): void; parse(input: string | Parser.Input, previousTree?: Parser.Tree, options?: Parser.Options): Parser.Tree; getLanguage(): any;